exe的基地址?

Dav*_*log 0 c++ winapi

    tibiaWindow = FindWindow( L"TibiaClient", NULL);

    DWORD PID;
    GetWindowThreadProcessId( tibiaWindow, &PID );

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID); //Open Process for Read/Write
    short mana = 0;
    void* ptr = (void*)hProcess+0x3C2D00;
    if( !ReadProcessMemory(hProcess, ptr, &mana, 2, 0) ){
        return false;
    }
    else{
        statusBar()->showMessage( QString::number(mana), 3000 );
    }

    return true;
Run Code Online (Sandbox Code Playgroud)

这应该是从位于tibia.exe + 0x3CD2D00的游戏中读取法术力.但它不起作用.谁能帮我?如何获取该窗口的基址?

IIn*_*ble 5

要在另一个进程中获取模块的基址,需要执行两个步骤:

  1. 使用获取加载到进程中的所有模块句柄EnumProcessModules.
  2. 迭代模块句柄列表并使用或者查找模块名称GetModuleFileNameEx,GetModuleBaseName直到找到匹配项.

从步骤2获得的模块句柄是查询进程的地址空间中模块的基址.

您发布的偏移(0x3CD2D00)可能不是实际图像的一部分tibia.exe.这意味着该模块的大小至少为63MB,听起来不对.它可能驻留在某些其他模块的静态数据中,或者可能驻留在堆内存中,这使得您提出的方法无用.