在头文件里加入下面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); }
调用该函数就可以获取目标进程的首地址。