首页 > 代码库 > vc++教程之win7下基址定位处理

vc++教程之win7下基址定位处理

作者:无名  邮箱: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