【问题标题】:C++ Get the Base Address of a DLL of a running processC++ 获取正在运行的进程的 DLL 的基地址
【发布时间】:2016-08-23 03:39:03
【问题描述】:

我正在尝试从正在运行的进程中读取地址。为了做到这一点,我从正在运行的进程的某个 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")

【问题讨论】:

  • 使用szModule 成员的MODULEENTRY32 结构获取dll 名称。
  • Hello @Ari0nhh 在我的代码循环时添加“cout
  • szModule 最有可能使用 UTF-16。请改用wcout
  • 谢谢你,成功了!

标签: c++ memory module


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    相关资源
    最近更新 更多