注入的DLL不正确HMODULE

时间:2015-01-01 18:47:58

标签: c++ module loadlibrary dll-injection

所以我将DLL注入程序。我可以验证DLL是否在Process Explorer的帮助下注入。注入后,我循环流程中的所有模块,比较名称并将注入的dll作为HMODULE返回。

然后我GetProcAddress()这个HMODULE在其中找到一个extern函数,但由于某种原因,这不能正常工作。

HMODULE dllAddress = getModuleAddressFromProc(pid, "NewDll.dll");
externCreateThread createThread = (externCreateThread)GetProcAddress(dllAddress, "createThread");

当我断点并检查dllAddress时,它说:

enter image description here

当我使用LoadLibrary在我当前程序中加载DLL并将其用作HMODULE时,它确实有效。

HMODULE dllAddress = LoadLibrary(L"C:\\NewDll.dll");
externCreateThread createThread = (externCreateThread)GetProcAddress(dllAddress, "createThread");

断点检查dllAddress:

enter image description here

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;
}

2 个答案:

答案 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