anti-debug2——扰乱

本文探讨了多种反调试技术,包括利用SEH(Structured Exception Handling)机制,通过异常处理函数检测调试状态;通过 Timing Check 检测程序运行速度差异来判断是否被调试;以及通过陷阱标志、0xcc 探测和 API 断点等方法进行反调试。这些技术通常组合使用,以提高反调试的难度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用SEH反调试

在SEH的机制下,当发生异常时,操作系统会接收这个异常然后调用进程中注册的SEH处理,但这样的异常发生在调试中时,异常就会由调试器来接收处理,根据这个特征就可用来反调试。

 

EXCEPTION_BREAKPOINT是断点异常,若程序处于调试运行状态。则系统会立刻停止运行程序,并将控制权交给调试器。所以当遇到int3指令时,正常运行的程序会调用SEH中的代码处理,而调试中的程序什么也不做直接运行后面的代码,而后面的代码通常是错误的。那么关键点就在SEH的处理函数中了,通常会修改EIP的值。不过我们可以使调试器忽略int3异常来简单的使这种反调试无效

 

UnhandledExceptionFilter函数在没有注册SEH且发生异常时被操作系统调用,这个函数内部会运行系统内部最后一个异常处理器,这个异常处理器通常叫做Top Level Exception Filter或Last Exception Filter,而这个函数可以通过使用SetUnhandledExceptionFilter来设置,它的参数就是Last Exception Filter函数的地址。在UnhanledExceptionFilter函数中,会使用NtInformationProcess函数,且第2个参数为7,表示DebugPort,来检测调试状态,若程序处于非调试状态,则正常运行异常处理器,若程序是在调试状态运行,则将异常处理工作交个调试器,这样异常处理器无法执行,使得程序运行会出错,就可以用来进行反调试,并且我们可以在异常处理器中再进行一次调试检测来反调试,这样的保护要去除是比较麻烦的。要除掉这种反调试,需要先跟入UnhandledException API中,修改NtInformationProcess函数的返回结果,然后跟进Last Exception Filter中,这时才是真的反调试代码,分析并去除即可。

 

Timing Check

显然,在调试器中执行程序比正常执行要慢得多,Timing check通过检测时间差来判断程序的调试情况,若时间差大于了某一个数值,则判断为调试状态。

时间间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值