1.如何使程序A基址不要每次启动都变化
2.程序A可以通过FindWindow 获取其句柄
如何获取程序A的基址,最好给出完整代码
谢了
20 个解决方案
#1
去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
FindWindow 得到窗口句柄,GetWindowThreadProcessId得到进程id
CreateToolHelp32Snapshot+Module32First得到exe基地址
FindWindow 得到窗口句柄,GetWindowThreadProcessId得到进程id
CreateToolHelp32Snapshot+Module32First得到exe基地址
#2
FindWindow()得到句柄,然后获取进程handle,后面就可以获取模块地址等了
#3
不好意思 再问个比较菜得问题
得到的me.modBaseAddr是byte *类型
怎么转换为dword呢
我强制转换出错 得到的一直是0xCCCCCCCC
得到的me.modBaseAddr是byte *类型
怎么转换为dword呢
我强制转换出错 得到的一直是0xCCCCCCCC
#4
可能api调用失败
代码发上来
代码发上来
#5
用
memcpy(&dwBaseAddr,me.modBaseAddr,4)
有错吗
memcpy(&dwBaseAddr,me.modBaseAddr,4)
有错吗
#6
DWORD GetBaseAddr()
{
HWND hGame=::FindWindow(NULL,szGameCaption);
if (!hGame)
{
AfxMessageBox(_T("请先运行程序!"));
}
DWORD Pid;
::GetWindowThreadProcessId(hGame,&Pid);
HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);
if (hModuleSnap==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("创建进程模块失败!"));
}
MODULEENTRY32 me;
Module32First(hModuleSnap,&me);
DWORD dwBaseAddr;
memcpy(&dwBaseAddr,me.modBaseAddr,4);
return dwBaseAddr;
}
{
HWND hGame=::FindWindow(NULL,szGameCaption);
if (!hGame)
{
AfxMessageBox(_T("请先运行程序!"));
}
DWORD Pid;
::GetWindowThreadProcessId(hGame,&Pid);
HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);
if (hModuleSnap==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("创建进程模块失败!"));
}
MODULEENTRY32 me;
Module32First(hModuleSnap,&me);
DWORD dwBaseAddr;
memcpy(&dwBaseAddr,me.modBaseAddr,4);
return dwBaseAddr;
}
#7
Module32First之前加一个me.dwSize=sizeof me;
然后GetBaseAddr返回值改为void*
最后return modBaseAddr;
然后GetBaseAddr返回值改为void*
最后return modBaseAddr;
#8
我调试时发现modBaseAddr中的基址是正确的
但是直接运行程序有时却崩溃,而且调试时发现这个值后面有时会跟着个“错误的指针”这个字符串
另外请问下您说的去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE该怎么操作?
自己写的程序怎么样才能使基址不会变?
但是直接运行程序有时却崩溃,而且调试时发现这个值后面有时会跟着个“错误的指针”这个字符串
另外请问下您说的去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE该怎么操作?
自己写的程序怎么样才能使基址不会变?
#9
自己的程序只要在连接器中去掉/DYNAMICBASE加上/FIXED
前者定位到DllCharacteristics后用位运算
前者定位到DllCharacteristics后用位运算
#10
牛人啊
#11
没碰到过这样的需求
学习一下
学习一下
#12
好像新的VS里面有"随机启动地址"这样一项,它应该对应exe头部的某个标记.呵呵
#13
LZ是想写游戏外挂吧
#14
回13#
只是练习。。。果断换XP了。。。
只是练习。。。果断换XP了。。。
#15
想做外挂的话,,,,
用相对地址,获得本次程序的起始地址,然后加上相对地址就好了。
这和多级指针,需要找基址是一样的。只不过,XP下,那个基址是定的。就是0x0040 0000,而win7下不一定是.
如果你找出的地址是0x00401000,那在WiN7下只要用本次程序的起始地址+1000就得了。
用相对地址,获得本次程序的起始地址,然后加上相对地址就好了。
这和多级指针,需要找基址是一样的。只不过,XP下,那个基址是定的。就是0x0040 0000,而win7下不一定是.
如果你找出的地址是0x00401000,那在WiN7下只要用本次程序的起始地址+1000就得了。
#16
回楼上 但是win7下不是固定的
#17
基地址不固定,但偏移是固定的
#18
即使不固定也有变通方法吧,不用换xp
#19
学习下
#20
如果数据是new出来的就会变化,如果是在数据段的就是固定的可以找到基址
#21
#1
去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
FindWindow 得到窗口句柄,GetWindowThreadProcessId得到进程id
CreateToolHelp32Snapshot+Module32First得到exe基地址
FindWindow 得到窗口句柄,GetWindowThreadProcessId得到进程id
CreateToolHelp32Snapshot+Module32First得到exe基地址
#2
FindWindow()得到句柄,然后获取进程handle,后面就可以获取模块地址等了
#3
不好意思 再问个比较菜得问题
得到的me.modBaseAddr是byte *类型
怎么转换为dword呢
我强制转换出错 得到的一直是0xCCCCCCCC
得到的me.modBaseAddr是byte *类型
怎么转换为dword呢
我强制转换出错 得到的一直是0xCCCCCCCC
#4
可能api调用失败
代码发上来
代码发上来
#5
用
memcpy(&dwBaseAddr,me.modBaseAddr,4)
有错吗
memcpy(&dwBaseAddr,me.modBaseAddr,4)
有错吗
#6
DWORD GetBaseAddr()
{
HWND hGame=::FindWindow(NULL,szGameCaption);
if (!hGame)
{
AfxMessageBox(_T("请先运行程序!"));
}
DWORD Pid;
::GetWindowThreadProcessId(hGame,&Pid);
HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);
if (hModuleSnap==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("创建进程模块失败!"));
}
MODULEENTRY32 me;
Module32First(hModuleSnap,&me);
DWORD dwBaseAddr;
memcpy(&dwBaseAddr,me.modBaseAddr,4);
return dwBaseAddr;
}
{
HWND hGame=::FindWindow(NULL,szGameCaption);
if (!hGame)
{
AfxMessageBox(_T("请先运行程序!"));
}
DWORD Pid;
::GetWindowThreadProcessId(hGame,&Pid);
HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,Pid);
if (hModuleSnap==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("创建进程模块失败!"));
}
MODULEENTRY32 me;
Module32First(hModuleSnap,&me);
DWORD dwBaseAddr;
memcpy(&dwBaseAddr,me.modBaseAddr,4);
return dwBaseAddr;
}
#7
Module32First之前加一个me.dwSize=sizeof me;
然后GetBaseAddr返回值改为void*
最后return modBaseAddr;
然后GetBaseAddr返回值改为void*
最后return modBaseAddr;
#8
我调试时发现modBaseAddr中的基址是正确的
但是直接运行程序有时却崩溃,而且调试时发现这个值后面有时会跟着个“错误的指针”这个字符串
另外请问下您说的去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE该怎么操作?
自己写的程序怎么样才能使基址不会变?
但是直接运行程序有时却崩溃,而且调试时发现这个值后面有时会跟着个“错误的指针”这个字符串
另外请问下您说的去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE该怎么操作?
自己写的程序怎么样才能使基址不会变?
#9
自己的程序只要在连接器中去掉/DYNAMICBASE加上/FIXED
前者定位到DllCharacteristics后用位运算
前者定位到DllCharacteristics后用位运算
#10
牛人啊
#11
没碰到过这样的需求
学习一下
学习一下
#12
好像新的VS里面有"随机启动地址"这样一项,它应该对应exe头部的某个标记.呵呵
#13
LZ是想写游戏外挂吧
#14
回13#
只是练习。。。果断换XP了。。。
只是练习。。。果断换XP了。。。
#15
想做外挂的话,,,,
用相对地址,获得本次程序的起始地址,然后加上相对地址就好了。
这和多级指针,需要找基址是一样的。只不过,XP下,那个基址是定的。就是0x0040 0000,而win7下不一定是.
如果你找出的地址是0x00401000,那在WiN7下只要用本次程序的起始地址+1000就得了。
用相对地址,获得本次程序的起始地址,然后加上相对地址就好了。
这和多级指针,需要找基址是一样的。只不过,XP下,那个基址是定的。就是0x0040 0000,而win7下不一定是.
如果你找出的地址是0x00401000,那在WiN7下只要用本次程序的起始地址+1000就得了。
#16
回楼上 但是win7下不是固定的
#17
基地址不固定,但偏移是固定的
#18
即使不固定也有变通方法吧,不用换xp
#19
学习下
#20
如果数据是new出来的就会变化,如果是在数据段的就是固定的可以找到基址