作者:无名 邮箱:coolmoonf($#)163.com 博客:http://blog.csdn.net/nnsword
处理目标程序如下:
里面有二个方法,一个加血,一个是减血。由于系统是win7,寻到的Call基址,会改变,所以不能通过固定基址来远程调用这二个方法。所以我们只能变通了。
首先我们知道,编译后程序相对于模块基址的偏移量是不变的,所以我们可以按这个思路来处理。
首先分析寻找二个方法的基址(怎么分析,在这不多说明),如下:
加方法基址:012F35B0
减方法基址:012F36A0
当前模块基址:012e0000
根据刚才思路我们计算出二个方法的偏移,如下:
计算公式:基址偏移=基址-模块基址
加方法基址:135b0
减方法基址:136a0
根据思路我们调用时的正确基址计算公式应该如下:
基址=模块基址+基址偏移
下面是实例代码片段:
//远程执行代码
//iaddress 基址偏移 计算公式:基址-模块基址
void RemoteCall(int iaddress){
HWND hwnd=::FindWindow(NULL,_T("WyHelperTest"));
if (!hwnd)
{
return;
}
DWORD pid;
::GetWindowThreadProcessId(hwnd,&pid);
HANDLE hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pid);
if (hModuleSnap==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("创建进程模块失败!"));
}
MODULEENTRY32 me;
me.dwSize=sizeof(me);
Module32First(hModuleSnap,&me);
int dwBaseAddr;
//memcpy(&dwBaseAddr,me.modBaseAddr,4);
dwBaseAddr=(int)me.modBaseAddr;
char ch[MAX_PATH];
itoa(dwBaseAddr,ch,16);
iaddress+=dwBaseAddr;
HANDLE hdl=::OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
DWORD tid;
HANDLE rhdl=::CreateRemoteThread(hdl,NULL,0,(LPTHREAD_START_ROUTINE)iaddress,NULL,0,&tid);
CloseHandle(rhdl);
CloseHandle(hdl);
}void CWyHelperDemo1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
RemoteCall(0x0135b0);
//013C3570 01387B60 00387B60 00387C20 00EC7C20
//00387B60 00387C20
//00f700e8 00F67B60
// 013835B0 013836A0
//012e0000 012F35B0 012F36A0
// 135b0 136a0
}
vc++教程之win7下基址定位处理,布布扣,bubuko.com
原文:http://blog.csdn.net/nnsword/article/details/35276377