0

所以我在一个测试可执行文件上学习了一些 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"));
4

1 回答 1

0

您正在使用为宽字符串设计的函数。

"test"
L"test"

第一行是一个常规的 c 字符串 char 数组。第二行使用 L 宏将字符串文字定义为宽 char c 字符串。

转换为 WCHAR* 不会解决问题,您要么必须使用 L 宏定义它们,要么将函数切换为使用常规 char 数组。

这是我使用的函数的常规字符数组版本

char* GetModuleBaseAddress(const char* modName, DWORD procId)
{
    char* modBaseAddr{ nullptr };
    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, procId);
    if (hSnap != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 modEntry{};
        modEntry.dwSize = sizeof(modEntry);
        if (Module32First(hSnap, &modEntry))
        {
            do
            {
                if (!_stricmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (char*)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}
于 2020-01-02T01:06:35.803 回答