作者:无名 邮箱: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 }
此实例测试环境win7 64