You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将OllyDBG断点地址导入C++代码并读取EAX寄存器?

问题解决方法

核心问题分析

地址匹配失败主要源于两个关键问题:

  1. ASLR(地址空间布局随机化):目标程序开启ASLR后,每次启动的模块基址都会随机变化,OllyDBG显示的0x0026D320是模块基址+偏移的结果,硬编码该地址必然与目标进程真实运行地址不匹配。
  2. 调试寄存器配置错误:你对Dr7的设置不符合硬件断点的触发要求,导致断点未正确生效,后续地址判断自然失效。

具体修复步骤

1. 计算目标进程的真实断点地址

先从OllyDBG中提取模块基址和偏移量,再在代码中动态计算真实地址:

  • OllyDBG中,0x0026D320 = 模块基址 + 偏移量,先算出偏移值:偏移 = 0x0026D320 - OllyDBG显示的模块加载基址
  • 在代码中通过模块信息获取目标进程的实时基址,再计算真实断点地址:
// 获取目标进程主模块基址
HMODULE hModule = nullptr;
GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, 
                  (LPCSTR)targetBaseAddrPlaceholder, &hModule);
MODULEINFO modInfo;
GetModuleInformation(hProcess, hModule, &modInfo, sizeof(MODULEINFO));
DWORD moduleBase = (DWORD)modInfo.lpBaseOfDll;

// 替换为你从OllyDBG算出的偏移值,示例偏移为0x6D320
DWORD offset = 0x6D320;
DWORD realAddress = moduleBase + offset;

2. 正确配置调试寄存器

硬件执行断点需要设置Dr7的第0位(本地断点)和第1位(全局断点),确保断点生效:

CONTEXT ctx = {0};
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS | CONTEXT_INTEGER;
ctx.Dr0 = realAddress;
// 配置Dr7:开启Dr0的全局+本地执行断点
ctx.Dr7 = 0x00000003; 
SetThreadContext(hThread, &ctx);

3. 修正异常事件判断逻辑

硬件断点触发的是EXCEPTION_BREAKPOINT(0x80000003),而非EXCEPTION_SINGLE_STEP,同时需兼容EIP自动跳转的情况:

DEBUG_EVENT dbgEvent;
while (true)
{
    if (WaitForDebugEvent(&dbgEvent, INFINITE) == 0)
        break;

    if (dbgEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT)
    {
        if (dbgEvent.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT)
        {
            // 兼容CPU自动将EIP指向断点下一条指令的情况
            DWORD exceptionAddr = (DWORD)dbgEvent.u.Exception.ExceptionRecord.ExceptionAddress;
            if (exceptionAddr == realAddress || exceptionAddr == realAddress + 1)
            {
                GetThreadContext(hThread, &ctx);
                DWORD eax = ctx.Eax;
                // 处理读取到的EAX值
            }
        }
    }

    ContinueDebugEvent(dbgEvent.dwProcessId, dbgEvent.dwThreadId, DBG_CONTINUE);
}

额外注意事项

  • 确保调试程序以管理员权限运行,拥有足够权限操作目标进程。
  • 若目标是64位程序,需改用CONTEXT64结构体,地址类型替换为ULONGLONG。
  • 部分程序存在反调试机制,可能篡改调试寄存器,需额外处理这类情况。

内容的提问来源于stack exchange,提问作者alexbayker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 03:55:39