使用工具ollydbg
直接ollydbg加载程序后打开Memory视图,直接找到内容为PE header标识的这一条就是基址。
如图所示
打开就可以看到两条重要信息,PE标识和PE头偏移量。
如图所示
C++读取运行中的进程主模块的基址
注意:如果平台是64位,一定要把代码也编译为64位,因为32位的程序无法枚举64位进程的模块
我们可以通过GetModuleInformation获取lpBaseOfDll(模块的基址ImageBase)
下附代码
#include <windows.h>
#include <iostream>
#include <string>
#include <Psapi.h>
using namespace std;
struct ProcessInfo {
wstring name;
DWORD pid;
DWORD image_base;
};
// 获取指定进程的名称
ProcessInfo GetProcessName(DWORD processID) {
ProcessInfo PCE;
PCE.pid = processID;
//获取进程句柄
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);
if (hProcess != NULL) {
HMODULE hModules[1024];
DWORD cbNeeded;
//获取进程模块
if (EnumProcessModules(hProcess, hModules, sizeof(hModules), &cbNeeded)) {
TCHAR szProcessName[MAX_PATH];
//获取主模块名称(一般为可执行文件)
if (GetModuleBaseName(hProcess, hModules[0], szProcessName, sizeof(szProcessName))) {
PCE.name = szProcessName;
}
else {
DWORD error = GetLastError();
cerr << "GetModuleBaseName failed with error: " << error << endl;
}
MODULEINFO moduleInfo;
if (GetModuleInformation(hProcess, hModules[0], &moduleInfo, sizeof(moduleInfo))) {
PCE.image_base = (DWORD)moduleInfo.lpBaseOfDll;
}
else {
DWORD error = GetLastError();
cerr << "GetModuleInformation failed with error: " << error << endl;
}
}
else {
DWORD error = GetLastError();
cerr << "EnumProcessModules failed with error: " << error << endl;
}
CloseHandle(hProcess);
}
else {
DWORD error = GetLastError();
cerr << "OpenProcess failed with error: " << error << endl;
}
return PCE;
}
int main() {
DWORD aProcesses[1024], cbNeeded, cProcesses;
//枚举进程
if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) {
cerr << "EnumProcesses failed." << endl;
return 0;
}
// 计算获取到的进程数
cProcesses = cbNeeded / sizeof(DWORD);
// 枚举进程数组并输出名称
for (DWORD i = 0; i < cProcesses; ++i) {
if (aProcesses[i] != 0) {
ProcessInfo PCE = GetProcessName(aProcesses[i]);
if (!PCE.name.empty()) {
printf("PID: %-10d", PCE.pid);
printf("ImageBase: %016X", PCE.image_base);
printf("%5s");
printf("Module Name: %ls\n", PCE.name.c_str());
}
}
}
return 0;
}