所以我在一个测试可执行文件上学习了一些 dll 注入的东西。注入 dll 后,我会尝试获取模块句柄,然后尝试获取模块的基地址(主 exe)。
DWORD dwGetModuleBaseAddress(DWORD dwProcessIdentifier, WCHAR *lpszModuleName)
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessIdentifier);
DWORD dwModuleBaseAddress = 0;
if(hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32 = {0};
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if(Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
{
dwModuleBaseAddress = (DWORD)ModuleEntry32.modBaseAddr;
break;
}
}
while(Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
我就是这样做的。这是在我的 dll 被注入之后,但由于某种原因它似乎返回了 INVALID_HANDLE_VALUE。我从一个网站上找到了该功能并对其进行了一些修改,但它似乎仍然不起作用。如果您有更简洁的方法来获取基地址,我会很高兴知道它。
编辑问题现在与此行有关:
if(wcscmp(ModuleEntry32.szModule, lpszModuleName) == 0)
它从不为 0,但我正在寻找一个模块名称,我可以在调试器中看到我的 exe,但这种比较不起作用。
这就是我调用函数的方式
HWND window = FindWindow(0, LPCWSTR("test"));
DWORD pID = 0;
GetWindowThreadProcessId(window, &pID);
base = dwGetModuleBaseAddress(pID, (WCHAR*)("test"));