簡體   English   中英

C++ 獲取正在運行的進程的 DLL 的基址

[英]C++ Get the Base Address of a DLL of a running process

我正在嘗試從正在運行的進程中讀取地址。 為了做到這一點,我從正在運行的進程的某個 dll 中確定了地址的偏移量。 到目前為止,我所做的是找到窗口,然后找到程序的 PID 並獲得它的句柄。 從那里我使用 CreateToolhelp32Snapshot() 創建程序的快照,它允許我循環瀏覽程序的模塊。 從那里我想通過名稱獲取特定模塊的基地址,但是我不確定如何獲取模塊的名稱,這是我當前的代碼以及我卡住的地方。 有沒有一種簡單的方法可以根據我擁有的信息獲取模塊的名稱?

// Find the window
hwnd = FindWindow(NULL, L"calculator");
if (!hwnd) {
    cout << "window not found\n";
    cin.get();
}

//Get Process ID
GetWindowThreadProcessId(hwnd, &pid);

HANDLE phandle = OpenProcess(PROCESS_VM_OPERATION, 0, pid);
if (!phandle) {
    cout << "could not get handle\n";
    cin.get();
}
if (snapshot_test != INVALID_HANDLE_VALUE) {

    // First module
    MODULEENTRY32 mod_entry;
    mod_entry.dwSize = sizeof(mod_entry);

    if (Module32First(snapshot_test, &mod_entry)) {
        do {
            DWORD test = (DWORD)(mod_entry.modBaseAddr + 0x46F68 + 10);
            cout << ReadProcessMemory(phandle, (void*)(test), &health, sizeof(health), 0);
        } while (Module32Next(snapshot_test, &mod_entry));
    }
    else (cout << "module32first error");
}
else (cout << "snapshot error")

MODULEENTRY32.szModule 變量包含模塊的名稱,MODULEENTRY32.modBaseAddr 包含模塊本身的地址。 您可以使用此函數通過傳入模塊名稱來獲取模塊的地址。 它將遍歷模塊並找到具有匹配名稱的模塊

uintptr_t GetModuleBaseAddress(DWORD procId, const wchar_t* modName)
{
    uintptr_t modBaseAddr = 0;
    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 (!_wcsicmp(modEntry.szModule, modName))
                {
                    modBaseAddr = (uintptr_t)modEntry.modBaseAddr;
                    break;
                }
            } while (Module32Next(hSnap, &modEntry));
        }
    }
    CloseHandle(hSnap);
    return modBaseAddr;
}

暫無
暫無

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

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