反调试学习

本文深入探讨了INT2D指令在操作调试器OD中的特性,包括其如何触发异常及在调试过程中的行为。同时介绍了陷阱标记(TF)的设置与作用,以及如何通过PUSHFD/POPFD指令与OR指令来修改陷阱标识的TF,以实现对异常的处理。此外,文章还阐述了如何在调试情况下忽略EXCEPTION_SINGLE_STEP异常,让程序自行处理此异常。

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

1. INT 2D

INT 2D 原为内核模式中用来触发断点异常的指令,也可以再用户模式下触发异常。但程序调试时不会触发异常,只是忽略。在调试模式中执行完INT 2D后,下条指令的第一个字节将被忽略,后一个字节会被识别为新的指令继续执行。INT 2D的另一个特征是,使用F7 F8命令跟踪INT 2D时,程序不会停在下条指令开始的地方,而是一直运行,知道遇到断点,就像使用F9命令运行程序一样,原因在于,执行完INT 2D后,原有的代码字节顺序被打乱了,也就是说,若指令在程序执行过程中改变,则程序不能单步暂停,而是一直执行,可以将其视为一种bug。 (以上只是INT 2D指令在OD调试中的表现,其他调试器中略有不同)


2. 陷阱标记

TF 值设置为1时,CPU将进入单步执行模式。单步执行模式中,CPU执行完一条指令后出发一个EXCEPTION_SINGLE_STEP异常,然后将陷阱标记自动清零。该EXCEPTION_SINGLE_STEP异常可以与SEH技法结合,在反调试技术中用于探测调试器。


因无法直接修改EFLAGS寄存器的值,故使用PUSHFD/POPFD指令与or指令修改陷阱标识的值。在调试的情况下不会执行SEH回调。而正常运行则执行。

修改OD的调试选项,忽略(EXCEPTION_SINGLE_STEP异常),让程序来处理异常。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值