关于利用S.E.H 来反调试的一个疑问
我在调试一个程序的时候,发现了这个问题,可能我对《加密与解密第三版》书上某些内容理解有误。还请高手指点一二。
程序来自http://bbs.pediy.com/showthread.php?t=92330
附件里面也有,文件名CorePlayer.exe。
程序入口点是00401000
00401000 > B8 8C0F7200 mov eax, 00720F8C
00401005 50 push eax
00401006 64:FF35 0000000>push dword ptr fs:[0]
0040100D 64:8925 0000000>mov dword ptr fs:[0], esp
00401014 33C0 xor eax, eax
00401016 8908 mov dword ptr [eax], ecx
首先安装了一个异常处理程序,回调函数地址为00720F8C。然后制造一个写入异常。在00720F8C地址处下好INT3断点。SHIFT + F9 运行程序。程序在00720F8C处停了下来。
00720F8C B8 11FD71F0 mov eax, F071FD11
00720F91 8D88 9E120010 lea ecx, dword ptr [eax+1000129E]
00720F97 8941 01 mov dword ptr [ecx+1], eax
00720F9A 8B5424 04 mov edx, dword ptr [esp+4]
00720F9E 8B52 0C mov edx, dword ptr [edx+C]
00720FA1 C602 E9 mov byte ptr [edx], 0E9
00720FA4 83C2 05 add edx, 5
00720FA7 2BCA sub ecx, edx
00720FA9 894A FC mov dword ptr [edx-4], ecx
00720FAC 33C0 xor eax, eax
00720FAE C3 retn
回调函数通过系统传给它的第一个参数(指向EXCEPTION_RECORD结构的指针)获得异常发生的地址00401016,然后修改该处的代码---改为一条跳转指令。然后回调函数返回0.表示系统将线程环境设置为_lpContext参数指定的CONTEXT 结构并继续执行。在00401016处下INT3断点,F9 就会停在00401016 处。
00401016 - E9 94FF3100 jmp 00720FAF
0040101B 6F outs dx, dword ptr es:[edi]
0040101C 6D ins dword ptr es:[edi], dx
然后就有问题了。此时TF 是1. F8 单步的话,OD 会弹出提示:被调试的程序设置了单步调试标志,我不知如何在地址00401016 正确执行单步命令。。。。。
此时如果修改TF 为0的话,就可以正常调试了。
重新载入程序,在异常处理回调函数里面查看CONTEXT结构就会发现 regFlags (偏移 0xC0)的值是00010346.TF标志位确实是1.我不明白为什么这里的TF标志位会是1.。。。。
另外,我找了个程序(附件里的seh2.exe),发现了同样的问题---在异常处理回调函数里面查看CONTEXT结构就会发现 regFlags的TF位也为1.回调函数返回后TF也是1.但是F8单步OD却不会出现无法调试的提示。
希望高手指点指点小弟。。。。。
[培训]科锐逆向工程师培训第53期2025年7月8日开班!