簡體   English   中英

沒有DLL注入的進程的基址?

[英]Base address of a process without DLL injection?

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

其中有些可能是多余的,因為我只是將其添加到以前的內容中。 我只是不確定為什么它不起作用。

您的代碼是正確的,沒有任何問題,我剛剛在x86和x64上對其進行了測試。

您的問題是您需要以管理員身份運行,因此您具有正確的安全權限才能訪問其他進程,並且還應該以與目標進程相同的體系結構x86或x64來構建項目。

如果這些解決方案均不能解決問題,則您的'gameName'變量或模塊名稱定義不正確。

如果將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運行此示例

它將打印出您要匹配的確切字符串,問題可能出在這里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM