获取目标程序的加载起始地址

一般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));

posted @ 2011-12-01 14:53  ccqin  阅读(2049)  评论(0)    收藏  举报