exe的基地址?

时间:2013-11-23 18:30:29

标签: 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;

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

1 个答案:

答案 0 :(得分:5)

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

  1. 使用EnumProcessModules检索加载到流程中的所有模块句柄。
  2. 使用GetModuleFileNameExGetModuleBaseName迭代模块句柄列表并查询模块名称,直至找到匹配项。
  3. 从步骤2获得的模块句柄是查询进程的地址空间中模块的基址。

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