【发布时间】:2019-02-13 10:37:47
【问题描述】:
通过DLL注入,获取进程的基地址就像使用一样简单
GetModuleHandleW(0);
所以我试图在不注入的情况下获取地址,但我似乎无法让它工作。我在 Google 上搜索了一些解决方案,并从 stackoverflow 中找到了其他解决方案,但它们似乎不起作用。这是我现在正在使用的。我有正确的标题,它可以编译。它只是不起作用。
DWORD_PTR dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName)
{
DWORD_PTR dwModuleBaseAddress = 0;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcID);
if (hSnapshot != INVALID_HANDLE_VALUE)
{
MODULEENTRY32 ModuleEntry32;
ModuleEntry32.dwSize = sizeof(MODULEENTRY32);
if (Module32First(hSnapshot, &ModuleEntry32))
{
do
{
if (_tcsicmp(ModuleEntry32.szModule, szModuleName) == 0)
{
dwModuleBaseAddress = (DWORD_PTR)ModuleEntry32.modBaseAddr;
break;
}
} while (Module32Next(hSnapshot, &ModuleEntry32));
}
CloseHandle(hSnapshot);
}
return dwModuleBaseAddress;
}
我尝试计算这个地址,它只给我 0。我认为这可能是我不理解第二个参数的事实。我只是复制我看到的。这是我的主要功能。
int main() {
HWND hwnd = FindWindowA(NULL, gameName);
int x;
if (hwnd == NULL) {
cout << "Cannot find " << (string)gameName << " window" << endl;
cin >> x;
exit(-1);
}
DWORD procID;
GetWindowThreadProcessId(hwnd, &procID);
HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);
DWORD playerAddr = 0;
playerAddr = dwGetModuleBaseAddress(procID, _T("starbound.exe"));
cout << hex << playerAddr;
}
其中一些可能是多余的,因为我只是将它添加到我之前的内容中。我只是不确定为什么它不起作用。
【问题讨论】:
-
您的进程是 32 位还是 64 位?而且,这个问题之前已经被问过数百次了。做更多的研究。并且不要忽略返回值。