SHIFT+F4条件断点变成内存不可恢复INT3断点
发现环境:
win10
od1.x
调试目标:
yzdbg32
复现过程:
od 载入 yzdbg go到 SymFromAddrW 下条件断点. 中断触发 "run" 指令. 如下图:
下好断点后, 切换到内存窗口, 对 dbghelp 的 .text 段下F2断点.
完事后,运行, 中断, 就能看到如下效果:
可以看到 02530AF2 IP处 指令已经变成INT3了. od1.x应该"隐形" 操作的INT3断点, 变成肉眼可见的真实INT3了.
大胆猜测一下, 这个INT3断点, 应该没有在od1.x自身维护的断点列表中.
来测试一下.
我们接着按F9运行, 程序就结束了. 因为遇到INT3 无人处理. 说明我们猜对了, INT3 断点是真实的, 并不在od的断点列表中.
作者应该是在处理中断事件中, 内存断点时忘了先恢复INT3断点了.
我在写反汇编窗口数据时,也犯过类似的错. 比如下面代码:
[Asm] 纯文本查看 复制代码
0040113E > 6A 00 PUSH 0x0
00401140 E8 2D000000 CALL <JMP.&KERNEL32.GetModuleHandleA>
00401145 A3 E8314000 MOV DWORD PTR [0x4031E8],EAX
0040114A E8 47000000 CALL <JMP.&comctl32.InitCommonControls>
0040114F 6A 00 PUSH 0x0
00401151 68 C8104000 PUSH CrackM2.004010C8
00401156 6A 00 PUSH 0x0
00401158 6A 65 PUSH 0x65
0040115A FF35 E8314000 PUSH DWORD PTR [0x4031E8]
00401160 E8 13000000 CALL <JMP.&user32.DialogBoxParamA>
00401165 6A 00 PUSH 0x0
00401167 E8 00000000 CALL <JMP.&KERNEL32.ExitProcess>
0040116C - FF25 04204000 JMP DWORD PTR [<&KERNEL32.ExitProcess>] ; KERNEL32.ExitProcess
00401172 - FF25 00204000 JMP DWORD PTR [<&KERNEL32.GetModuleHandleA>] ; KERNEL32.GetModuleHandleA
00401178 - FF25 24204000 JMP DWORD PTR [<&user32.DialogBoxParamA>] ; user32.DialogBoxParamA
0040117E - FF25 20204000 JMP DWORD PTR [<&user32.EndDialog>] ; user32.EndDialog
00401184 - FF25 1C204000 JMP DWORD PTR [<&user32.GetDlgItem>] ; user32.GetDlgItem
0040118A - FF25 28204000 JMP DWORD PTR [<&user32.GetWindowTextA>] ; user32.GetWindowTextA
00401190 - FF25 2C204000 JMP DWORD PTR [<&user32.MessageBoxA>] ; user32.MessageBoxA
00401196 - FF25 0C204000 JMP DWORD PTR [<&comctl32.InitCommonControls>] ; comctl32.InitCommonControls
0040119C 0000 ADD BYTE PTR [EAX],AL
如果此时, 在 00401172 地址,双击 下一个INT3断点, 那么按我之前写的, 在地址 00401140 处就不能显示后面的 GetModuleHandleA 函数.
因为判断目标地址是否是函数前, 要先恢复一下INT3断点, 否则肯定读不到INT3断点.就会导致判断是否是函数失败.
|