注册

CpuDbg x96

查看: 1193|回复: 0
收起左侧

[多款调试器] 内存访问断点,中断处理方式的bug

[复制链接]
发表于 2022-4-27 13:49:25 | 显示全部楼层 |阅读模式
[Asm] 纯文本查看 复制代码
0040D066 >/$  55                   PUSH EBP
0040D067  |.  8BEC                 MOV EBP,ESP
0040D069  |.  6A FF                PUSH -1
0040D06B  |.  68 D02C4400          PUSH mfc多线?00442CD0
0040D070  |.  68 60254100          PUSH mfc多线?00412560                      ;  SE handler installation
0040D075  |.  64:A1 00000000       MOV EAX,DWORD PTR FS:[0]
0040D07B  |.  50                   PUSH EAX
0040D07C  |.  64:8925 00000000     MOV DWORD PTR FS:[0],ESP
0040D083  |.  83EC 58              SUB ESP,58
0040D086  |.  53                   PUSH EBX
0040D087  |.  56                   PUSH ESI                                 ;  mfc多线?<ModuleEntryPoint>
0040D088  |.  57                   PUSH EDI                                 ;  mfc多线?<ModuleEntryPoint>
0040D089  |.  8965 E8              MOV DWORD PTR [EBP-18],ESP
0040D08C  |.  FF15 60F34300        CALL DWORD PTR [<&KERNEL32.GetVersion>]  ;  KERNEL32.GetVersion
0040D092  |.  33D2                 XOR EDX,EDX                              ;  mfc多线?<ModuleEntryPoint>
0040D094  |.  8AD4                 MOV DL,AH
0040D096  |.  8915 E04B4500        MOV DWORD PTR [454BE0],EDX               ;  mfc多线?<ModuleEntryPoint>
0040D09C  |.  8BC8                 MOV ECX,EAX



比如类似上面的代码, 改成如下代码:

[Asm] 纯文本查看 复制代码
0040D066 >/$  55                   PUSH EBP
0040D067  |.  8BEC                 MOV EBP,ESP
0040D069  |.  6A FF                PUSH -1
0040D06B  |.  68 D02C4400          PUSH mfc多线?00442CD0
0040D070  |.  68 60254100          PUSH mfc多线?00412560                      ;  SE handler installation
0040D075  |.  64:A1 00000000       MOV EAX,DWORD PTR FS:[0]
0040D07B  |.  50                   PUSH EAX
0040D07C  |.  64:8925 00000000     MOV DWORD PTR FS:[0],ESP                 ;  <-- 这里下内存访问断点
0040D083  |.  83EC 58              SUB ESP,58
0040D086  |.  53                   PUSH EBX
0040D087  |.  56                   PUSH ESI                                 ;  mfc多线?<ModuleEntryPoint>
0040D088  |.  57                   PUSH EDI                                 ;  mfc多线?<ModuleEntryPoint>
0040D089  |.  8965 E8              MOV DWORD PTR [EBP-18],ESP
0040D08C      A1 7CD04000          MOV EAX,DWORD PTR [40D07C]               ;  <-- 这里改成访问上面的内存断点
0040D091      90                   NOP
0040D092  |.  33D2                 XOR EDX,EDX                              ;  mfc多线?<ModuleEntryPoint>
0040D094  |.  8AD4                 MOV DL,AH
0040D096  |.  8915 E04B4500        MOV DWORD PTR [454BE0],EDX               ;  mfc多线?<ModuleEntryPoint>
0040D09C  |.  8BC8                 MOV ECX,EAX
0040D09E  |.  81E1 FF000000        AND ECX,0FF
0040D0A4  |.  890D DC4B4500        MOV DWORD PTR [454BDC],ECX               ;  mfc多线?<ModuleEntryPoint>
0040D0AA  |.  C1E1 08              SHL ECX,8
0040D0AD  |.  03CA                 ADD ECX,EDX                              ;  mfc多线?<ModuleEntryPoint>
0040D0AF  |.  890D D84B4500        MOV DWORD PTR [454BD8],ECX               ;  mfc多线?<ModuleEntryPoint>


我们下内存访问断点, 正常情况, 应该是执行到 0040D08C 的时候, 会中断下来. 因为我们对 0040D07C 下了内存访问断点.
而  0040D08C , 正好对0040D07C 地址访问了, 所以理应中断下来.

但在实际测试中

od1.x 给的反馈是 0040D07C 0040D08C 都会中断下来.
od2.x 给的反馈是只有  0040D08C 会中断下来.
yzdbg 测试是一个都没有中断下来
x64dbg 的反馈很喜感, 直接提示如下:

1.png


3.png


x64dbg的反汇编窗口, 本人必未找到内存断点的选项. 我是从数据窗口跟随过去下的内存访问断点.
只要对 0040D07C 下了内存访问断点, 再修改 0040D08C 处的代码,就会报上面的错误提示. 这个设计似乎不合逻辑.
用户自己的内存访问断点, 确不能自己修改代码?  这就好比 用户下了个INT3断点, 断点 HEX 值没有对用户隐藏一样. 不合逻辑.

最后为了测试, 就只能先修改代码, 再下内存访问断点. 然后 F9 运行, 结果x64dbg确变成了step执行

目前本人只试了这四款调试器, (其它的如ida windbg 有空再测吧.) 其中个人觉得od2.x的断点处理方式是最合适的. 您觉得呢?


回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-5-18 16:42 , Processed in 0.078125 second(s), 20 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表