没有DLL注入的进程的基址?

时间:2017-07-06 01:41:32

标签: c++ winapi

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

其中一些可能是多余的,因为我只是将它添加到我之前的内容中。我不知道为什么它不起作用。

2 个答案:

答案 0 :(得分:0)

您的代码是正确的,没有任何问题,我只是在x86和x64上对其进行了测试。

您的问题是您需要以管理员身份运行,因此您具有正确的安全权限才能访问其他进程,并且还应该以与目标进程相同的体系结构x86或x64来构建项目。

如果这些解决方案均无法解决,则您的'gameName'变量或模块名称定义不正确。

答案 1 :(得分:-1)

如果您使用dwModuleBaseAddress作为调试工具,可能更容易发现失败的调用...

DWORD_PTR dwGetModuleBaseAddress(DWORD dwProcID, TCHAR *szModuleName)
{
    DWORD_PTR dwModuleBaseAddress = (DWORD_PTR)-1; // unlikely value...
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, dwProcID);
    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        MODULEENTRY32 ModuleEntry32;
        ModuleEntry32.dwSize = sizeof(MODULEENTRY32);

        dwModuleBaseAddress = (DWORD_PTR)-2;

        if (Module32First(hSnapshot, &ModuleEntry32))
        {
            do
            {
                --dwModuleBaseAddress;
                if (_tcsicmp(ModuleEntry32.szModule, szModuleName) == 0)
                {
                    dwModuleBaseAddress = (DWORD_PTR)ModuleEntry32.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnapshot, &ModuleEntry32));
        }
        CloseHandle(hSnapshot);
    }
    return dwModuleBaseAddress;
}

您还可以使用GetLastError()

检查导致问题的错误
void PrintLastError()
{
    LPTSTR psz;
    DWORD dwError = GetLastError();
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        dwError,
        0,
        (LPTSTR)&psz,
        1024,
        NULL);

    _tprintf(_T("Windows reports error: (0x%08X): %s\n"), dwError, (psz) ? psz : _T("(null)"));
    if (psz)
    {
        LocalFree(psz);
    }
}

如果所有其他方法都失败了,请尝试从msdn https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms686849(v=vs.85).aspx

运行此示例

它将打印您想要匹配的确切字符串,问题可能来自那里。