首页
社区
课程
招聘
[求助]关于利用S.E.H 来反调试的一个疑问
发表于: 2009-9-23 11:56 3914

[求助]关于利用S.E.H 来反调试的一个疑问

2009-9-23 11:56
3914
关于利用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却不会出现无法调试的提示。
希望高手指点指点小弟。。。。。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
因为你是单步到00401016的,所以OD在执行这语句前置TF为1了,但因为发生异常,OD失去了对TF的控制
解决办法就是在执行00401016时不要用单步,或者你在异常处理函数里把Context的TF清掉
另一个程序可能是OD还能认出这个TF是它自己设的,就可以安全的忽略它了
如果OD认为这个TF不是自己设的,那按照正常流程(调试器不存在时),这个指令应该引发异常,单步标志将失效
2009-9-23 12:54
0
雪    币: 440
活跃值: (87)
能力值: ( LV9,RANK:200 )
在线值:
发帖
回帖
粉丝
3

谢谢2楼的。的确是这样。F9的话就可以过了。
2009-9-23 14:44
0
游客
登录 | 注册 方可回帖
返回