win7下程序基址改变问题

时间:2022-10-08 04:54:11
程序A(不是自己写的)在win7下每次启动基址都会变化

1.如何使程序A基址不要每次启动都变化

2.程序A可以通过FindWindow 获取其句柄
  如何获取程序A的基址,最好给出完整代码

谢了

20 个解决方案

#1


去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE

FindWindow 得到窗口句柄,GetWindowThreadProcessId得到进程id
CreateToolHelp32Snapshot+Module32First得到exe基地址

#2


FindWindow()得到句柄,然后获取进程handle,后面就可以获取模块地址等了

#3


不好意思 再问个比较菜得问题
得到的me.modBaseAddr是byte *类型
怎么转换为dword呢
我强制转换出错 得到的一直是0xCCCCCCCC

#4


可能api调用失败
代码发上来

#5



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;
}

#7


Module32First之前加一个me.dwSize=sizeof me;
然后GetBaseAddr返回值改为void*
最后return modBaseAddr;

#8


我调试时发现modBaseAddr中的基址是正确的 
但是直接运行程序有时却崩溃,而且调试时发现这个值后面有时会跟着个“错误的指针”这个字符串

另外请问下您说的去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE该怎么操作?

自己写的程序怎么样才能使基址不会变?

#9


自己的程序只要在连接器中去掉/DYNAMICBASE加上/FIXED
前者定位到DllCharacteristics后用位运算

#10


牛人啊 win7下程序基址改变问题

#11


没碰到过这样的需求

学习一下

#12


好像新的VS里面有"随机启动地址"这样一项,它应该对应exe头部的某个标记.呵呵

#13


LZ是想写游戏外挂吧

#14


回13#
只是练习。。。果断换XP了。。。

#15


想做外挂的话,,,,

用相对地址,获得本次程序的起始地址,然后加上相对地址就好了。

这和多级指针,需要找基址是一样的。只不过,XP下,那个基址是定的。就是0x0040 0000,而win7下不一定是.

如果你找出的地址是0x00401000,那在WiN7下只要用本次程序的起始地址+1000就得了。

#16


回楼上 但是win7下不是固定的

#17


基地址不固定,但偏移是固定的

#18


即使不固定也有变通方法吧,不用换xp

#19


学习下

#20


如果数据是new出来的就会变化,如果是在数据段的就是固定的可以找到基址

#1


去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE

FindWindow 得到窗口句柄,GetWindowThreadProcessId得到进程id
CreateToolHelp32Snapshot+Module32First得到exe基地址

#2


FindWindow()得到句柄,然后获取进程handle,后面就可以获取模块地址等了

#3


不好意思 再问个比较菜得问题
得到的me.modBaseAddr是byte *类型
怎么转换为dword呢
我强制转换出错 得到的一直是0xCCCCCCCC

#4


可能api调用失败
代码发上来

#5



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;
}

#7


Module32First之前加一个me.dwSize=sizeof me;
然后GetBaseAddr返回值改为void*
最后return modBaseAddr;

#8


我调试时发现modBaseAddr中的基址是正确的 
但是直接运行程序有时却崩溃,而且调试时发现这个值后面有时会跟着个“错误的指针”这个字符串

另外请问下您说的去掉IMAGE_OPTIONAL_HEADER.DllCharacteristics的IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE该怎么操作?

自己写的程序怎么样才能使基址不会变?

#9


自己的程序只要在连接器中去掉/DYNAMICBASE加上/FIXED
前者定位到DllCharacteristics后用位运算

#10


牛人啊 win7下程序基址改变问题

#11


没碰到过这样的需求

学习一下

#12


好像新的VS里面有"随机启动地址"这样一项,它应该对应exe头部的某个标记.呵呵

#13


LZ是想写游戏外挂吧

#14


回13#
只是练习。。。果断换XP了。。。

#15


想做外挂的话,,,,

用相对地址,获得本次程序的起始地址,然后加上相对地址就好了。

这和多级指针,需要找基址是一样的。只不过,XP下,那个基址是定的。就是0x0040 0000,而win7下不一定是.

如果你找出的地址是0x00401000,那在WiN7下只要用本次程序的起始地址+1000就得了。

#16


回楼上 但是win7下不是固定的

#17


基地址不固定,但偏移是固定的

#18


即使不固定也有变通方法吧,不用换xp

#19


学习下

#20


如果数据是new出来的就会变化,如果是在数据段的就是固定的可以找到基址

#21