如何在 C 中获取进程的起始/基地址?

新手上路,请多包涵

我正在通过在 Microsoft 的 Spider Solitaire 上使用它来测试整个基本/静态指针。所以我得到了玩家使用的“移动”数量的基本指针,作弊引擎告诉我它是“SpiderSolitaire.exe+B5F78”。所以现在我被困在如何弄清楚 SpiderSolitaire.exe 的起始地址是什么(当然每次程序启动时都会改变)。如何找到 SpiderSolitaire.exe 的起始地址,以便我可以添加偏移量并获取“移动”值的真实地址(当然是在 c++ 中)?

原文由 ZimZim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 941
1 个回答

这是另一种方式,用 Visual Studio 2015 编写,但应该向后兼容。

 void GetBaseAddressByName(DWORD processId, const _TCHAR *processName)
{
    _TCHAR szProcessName[MAX_PATH] = _TEXT("<unknown>");

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
        PROCESS_VM_READ,
        FALSE, processId);

    if (NULL != hProcess)
    {
        HMODULE hMod;
        DWORD cbNeeded;

        if (EnumProcessModulesEx(hProcess, &hMod, sizeof(hMod),
            &cbNeeded, LIST_MODULES_32BIT | LIST_MODULES_64BIT))
        {
            GetModuleBaseName(hProcess, hMod, szProcessName,
                sizeof(szProcessName) / sizeof(_TCHAR));
            if (!_tcsicmp(processName, szProcessName)) {
                _tprintf(_TEXT("0x%p\n"), hMod);
            }
        }
    }

    CloseHandle(hProcess);
}

int notmain(void)
{
    DWORD aProcesses[1024];
    DWORD cbNeeded;
    DWORD cProcesses;

    // Get the list of process identifiers.
    if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
        return 1;

    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);

    // Check the names of all the processess (Case insensitive)
    for (int i = 0; i < cProcesses; i++) {
        GetBaseAddressByName(aProcesses[i], _TEXT("SpiderSolitaire.exe"));
    }

    return 0;
}

原文由 Orwellophile 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题