C ++获取正在运行的进程的DLL的基地址
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++获取正在运行的进程的DLL的基地址相关的知识,希望对你有一定的参考价值。
我正在尝试从运行的进程中读取地址。为此,我确定了运行过程中某个dll的地址偏移量。到目前为止,我所要做的是找到窗口,而不是找到程序的PID并获取它的句柄。在这里,我使用CreateToolhelp32Snapshot()创建该程序的快照,这使我可以遍历该程序的各个模块。从那里我想按名称获取特定模块的基址,但是我不确定如何获取模块的名称,这是我当前的代码,并且卡在了哪里。有没有一种简单的方法可以根据我得到的信息获取模块的名称?
// Find the window
hwnd = FindWindow(NULL, L"calculator");
if (!hwnd) {
cout << "window not found
";
cin.get();
}
//Get Process ID
GetWindowThreadProcessId(hwnd, &pid);
HANDLE phandle = OpenProcess(PROCESS_VM_OPERATION, 0, pid);
if (!phandle) {
cout << "could not get handle
";
cin.get();
}
if (snapshot_test != INVALID_HANDLE_VALUE) {
// First module
MODULEENTRY32 mod_entry;
mod_entry.dwSize = sizeof(mod_entry);
if (Module32First(snapshot_test, &mod_entry)) {
do {
DWORD test = (DWORD)(mod_entry.modBaseAddr + 0x46F68 + 10);
cout << ReadProcessMemory(phandle, (void*)(test), &health, sizeof(health), 0);
} while (Module32Next(snapshot_test, &mod_entry));
}
else (cout << "module32first error");
}
else (cout << "snapshot error")
答案
MODULEENTRY32.szModule变量包含模块的名称,而MODULEENTRY32.modBaseAddr包含模块本身的地址。您可以使用此函数通过传入模块的名称来获取模块的地址。它将遍历模块并找到与名称匹配的模块
uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName)
{
uintptr_t modBaseAddr = 0;
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
if (hSnap != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 modEntry;
modEntry.dwSize = sizeof(modEntry);
if (Module32First(hSnap, &modEntry))
{
do
{
if (!_wcsicmp(modEntry.szModule, modName))
{
modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
break;
}
} while (Module32Next(hSnap, &modEntry));
}
}
CloseHandle(hSnap);
return modBaseAddr;
}
以上是关于C ++获取正在运行的进程的DLL的基地址的主要内容,如果未能解决你的问题,请参考以下文章
编码 UI 测试 VS2012 - 如何从正在运行的进程中获取退出代码?