获取目标程序的加载起始地址
一般PE加载程序的默认起始地址是0x400000,但也有可能会变化,那么怎么获取一个目标程序的起始地址呢?
首先介绍一个WINAPI函数:
HMODULE WINAPI GetModuleHandle(
__in LPCTSTR lpModuleName); //模块名,如“kerner32.dll"
GetModuleHandle可以获取程序中已加载模块的HMODULE,HMODULE其实就是模块的起始地址。当传入的参数是NULL,则函数返回的是本程序的起始地址,所以如果把GetModuleHandle(NULL)注入到目标进程,即可获取到目标进程的起始地址。
利用CreateRemoteThread,由于GetModuleHandle是Kernel32.dll的一个函数,故可以直接注入。再利用GetExitCodeThread函数获取GetModuleHandle(NULL)的返回值,这样就可以知道目标程序的起始地址了。代码如下:
HANDLE hProcess=::OpenProcess(PROCESS_ALL_ACCESS,false,this->m_pid);//this->m_pid-->目标进程id
//调用目标进程的GetModuleHandle(NULL方法)
HANDLE hThread = ::CreateRemoteThread( hProcess, NULL, 0,
(LPTHREAD_START_ROUTINE) ::GetModuleHandle,NULL, 0, NULL );
::WaitForSingleObject( hThread, INFINITE );
DWORD hLibModule;
// 获取GetModuleHandle(NULL)的返回值
::GetExitCodeThread( hThread, &hLibModule );//hLibModule就是目标进程的起始地址.
MessageBox(_itot(hLibModule,buf,16));

浙公网安备 33010602011771号