首页
社区
课程
招聘
[求助]DebugAPI单步调试
发表于: 2007-1-22 13:52 4163

[求助]DebugAPI单步调试

2007-1-22 13:52
4163
不知道怎么成空的了 还出现了两个帖子, 补充:
代码如下:
.while TRUE
   invoke WaitForDebugEvent,offset DebugEvent,INFINITE
    .if DebugEvent.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT
      .break
    .elseif DebugEvent.dwDebugEventCode==CREATE_PROCESS_DEBUG_EVENT
       invoke  WriteProcessMemory,pi.hProcess,\
            BREAK_POINT1,addr dbInt3,1,NULL  ;入口处设置断点
    .elseif  DebugEvent.dwDebugEventCode == EXCEPTION_DEBUG_EVENT
       .if DebugEvent.u.Exception.pExceptionRecord.ExceptionCode\
                                == EXCEPTION_BREAKPOINT
        mov ThreadContext.ContextFlags,CONTEXT_FULL
        invoke GetThreadContext,pi.hThread,addr ThreadContext
        .if  ThreadContext.regEip == BREAK_POINT1+1
            dec  ThreadContext.regEip
            invoke  WriteProcessMemory,pi.hProcess,BREAK_POINT1,addr dbOldByte,1,NULL ;清除入口处断点
        or ThreadContext.regFlag,100h                                 
         invoke  SetThreadContext,pi.hThread,addr ThreadContext
            .endif
        .elseif DebugEvent.u.Exception.pExceptionRecord.ExceptionCode\
                             == EXCEPTION_SINGLE_STEP
         mov ThreadContext.ContextFlags,CONTEXT_FULL
          invoke   GetThreadContext,pi.hThread,addr ThreadContext
           .if     ThreadContext.regEip == BREAK_POINT2
              mov eax,offset Regbuffer
              mov ebx,ThreadContext.regEax
              mov dword ptr [eax],ebx
              invoke MessageBox,hWinMain,addr Regbuffer,addr\ Regbuffer,MB_OK
              .break
            .else
             or      ThreadContext.regFlag,100h
              invoke  SetThreadContext,\
                pi.hThread,addr ThreadContext
            .endif
         .endif
   .endif
      invoke  ContinueDebugEvent,DebugEvent.dwProcessId,\
                    DebugEvent.dwThreadId,DBG_CONTINUE            
    .endw

   此单步功能是完成了的
               BREAK_POINT1    equ 0049CC5Ch ;入口点
                BREAK_POINT2    equ 00497497h ;中断在这里取此时EAX的值
BREAK_POINT2是我想单步调试的重点地方,取得此处的eax值,但是OD调试发现一直无法满足 ThreadContext.regEip == BREAK_POINT2  
入口点周围的代码是能够单步到的
也不至于是BREAK_POINT2距BREAK_POINT1太远不适合单步调试吧?OD中调试程序F9会运行到00497497,OD单步会出现"不知如何单步,因为内存XXXX不可读,请尝试更改EIP.." 我该如何解决呢?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 154
活跃值: (75)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
没办法,只有把BREAK_POINT1放在出现注册码的CALL的开始了
00497492  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
00497495  |.  8BD6          MOV EDX,ESI
00497497  |.  E8 E8D0F6FF   CALL dnwxzs.00404584

到00497495处
EAX 00EA40D4 ASCII "UOZ4MR/pMcEo"

上面的程序弹出的是乱码,请教如何获取这个EAX的值并显示出来呢?
2007-1-22 21:58
0
游客
登录 | 注册 方可回帖
返回
//