在头文件中添加以下code:
#include <windows.h>
#include <tlhelp32.h>
在Cpp文件中添加如下的函数,该函数可用于获取目标进程首地址:
(注意AfxMessageBox定义在afxwin.h, 若非在MFC中使用请酌情更改)
//获取目标进程首地址
BOOL CImageBloodDlg::getProcessAddr(DWORD dwPID, DWORD& baseAddr)
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
// 在目标进程中获取所有进程的snapshot
hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
if (hModuleSnap == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("CreateToolhelp32Snapshot (of modules) fail"));
return(FALSE);
}
// 设置MODULEENTRY32数据结构大小字段
me32.dwSize = sizeof(MODULEENTRY32);
//检索第一个模块的信息,不成功则返回
if (!Module32First(hModuleSnap, &me32))
{
AfxMessageBox(_T("Module32First fail")); // 显示调用失败
CloseHandle(hModuleSnap); // 清除句柄对象
return(FALSE);
}
// 从me32中得到基址
baseAddr = (DWORD)me32.modBaseAddr;
// 别忘了最后清除模块句柄对象
CloseHandle(hModuleSnap);
return(TRUE);
}
调用该函数即可获取目标进程的首地址。