[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 的反馈很喜感, 直接提示如下:
x64dbg的反汇编窗口, 本人并未找到内存断点的选项. 我是从数据窗口跟随过去下的内存访问断点.
只要对 0040D07C 下了内存访问断点, 再修改 0040D08C 处的代码,就会报上面的错误提示. 这个设计似乎不合逻辑.
用户自己下的内存访问断点, 确不能自己修改代码? 这就好比 用户下了个INT3断点, 断点 HEX 值没有对用户隐藏一样. 不合逻辑.
最后为了测试, 就只能先修改代码, 再下内存访问断点. 然后 F9 运行, 结果x64dbg确变成了step执行
目前本人只试了这四款调试器, (其它的如ida windbg 有空再测吧.) 其中个人觉得od2.x的断点处理方式是最合适的. 您觉得呢?
|