所以我将DLL注入程序。我可以验证DLL是否在Process Explorer的帮助下注入。注入后,我循环流程中的所有模块,比较名称并将注入的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;
}
答案 0 :(得分:0)
您可以在另一个进程中获取加载的HMODULE
但您无法在进程中使用它来获取HMODULE
的过程地址。
这是因为Windows中的每个进程都有自己的内存空间。因此,每次在不同进程中加载的同一DLL的HMODULE
值几乎肯定是不同的。因此,一旦您在另一个进程中获得了HMODULE
DLL并使用它调用GetProcAddress(..)
,Windows就会在您的应用程序的内存中查找,而不是在其他进程的内存中查找。由于HMODULE
在您的应用中无效,GetProcAddress(..)
将失败。
如果要在另一个进程的上下文中调用函数,则必须使用某种interprocess communication。要做到这一点,你必须在另一个进程中运行一个线程来处理这些IPC(我猜createThread
应该这样做。)
要实现此目的,您可以使用注入的DLL的DllMain(..)
函数来执行某些代码(例如,调用函数createThread(..)
):
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
createThread(..);
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
// Perform any necessary cleanup.
break;
}
return (TRUE);
}
答案 1 :(得分:0)
得到了以下帮助:
RectangleEquals - &gt; Answer