【问题标题】:Base address of exe?exe的基地址?
【发布时间】:2013-11-24 03:05:55
【问题描述】:
    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 的游戏中读取法力值。但它不起作用。谁能帮我?如何获取该窗口的基地址?

【问题讨论】:

  • 定义“不起作用”,如果您遇到看不见的错误,您需要检查返回码。
  • PID 有效吗?进程句柄是否有效?你的偏移量有效吗?游戏有反作弊吗?不工作的信息量不是很大。
  • hProcess 是一个进程 HANDLE。解释为指向进程基地址的指针是相当有创意的。当然不是你想要的。
  • 你要窗口的地址还是控制窗口的程序的地址?
  • @Thomas "窗口的地址"当然没有意义。 Windows 没有地址。

标签: c++ winapi


【解决方案1】:

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

  1. 使用EnumProcessModules检索加载到进程中的所有模块句柄。
  2. 遍历模块句柄列表并使用GetModuleFileNameExGetModuleBaseName 查询模块名称,直到找到匹配项。

从第 2 步得到的模块句柄是模块在被查询进程地址空间中的基地址。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多