【发布时间】:2015-01-01 18:47:57
【问题描述】:
所以我将 DLL 注入到程序中。我可以在 Process Explorer 的帮助下验证 DLL 是否被注入。注入后,我从进程中循环所有模块,比较名称并将注入的 dll 作为 HMODULE 返回。
然后我用GetProcAddress()这个HMODULE在里面找到一个extern函数,但是由于某种原因这不能正常工作。
HMODULE dllAddress = getModuleAddressFromProc(pid, "NewDll.dll");
externCreateThread createThread = (externCreateThread)GetProcAddress(dllAddress, "createThread");
当我断点并检查 dllAddress 时,它说:
当我使用 LoadLibrary 在当前程序中加载 DLL 并将其用作 HMODULE 时,它确实有效。
HMODULE dllAddress = LoadLibrary(L"C:\\NewDll.dll");
externCreateThread createThread = (externCreateThread)GetProcAddress(dllAddress, "createThread");
断点检查 dllAddress:
HMODULES 列表中返回的 HMODULE 与 LoadLibrary 中的 HMODULE 不同。虽然指针地址是一样的。
列出流程中的所有模块是使用 Microsoft 提供的代码完成的。我对其进行了一些修改以使用字符串比较,但这不会影响 HMODULE 类型。
HMODULE getModuleAddressFromProc(DWORD pid, string moduleName) {
HMODULE hMods[1024];
DWORD cbNeeded;
HMODULE output;
unsigned int i;
HANDLE newHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (EnumProcessModules(newHandle, hMods, sizeof(hMods), &cbNeeded)) {
for (i = 0; i < (cbNeeded / sizeof(HMODULE)); i++) {
TCHAR szModName[MAX_PATH];
if (GetModuleFileNameEx(newHandle, hMods[i], szModName, sizeof(szModName) / sizeof(TCHAR))) {
string s2 = charToString(szModName);
if (s2.find(moduleName) != string::npos) {
output = hMods[i];
break;
}
}
}
}
return output;
}
【问题讨论】:
标签: c++ module loadlibrary dll-injection