加密与解密 第三版 Page 434
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
int 2d 本来是被内核 ntroskrnl.exe 运行DebugServices 用的,但是也可以在RING 3模式下使用它.如果在一个正常的程序中使用 int 2d ,将会发生异常,然而如果知道了这个程序被附加了调试器,就不会产生异常.
push offset _seh
push fs:[0] ;设置SEH
mov fs:[0], esp
int 2dh ;如果有调试器,正常运行;否则,会触发异常
nop
pop fs:[0]
add esp, 4
检测到调试器
_seh:
未检测到调试器
int 2d 不仅能够用来检测RING 3下的调试器,同时也能检测 DbgMsg 驱动,这意味着,它可以用来检测RING 0 下的SoftICE.
除此之外, int 2d 还有个妙用,因为附加调试器的程序在运行完 int 2d 后,会跳过此指令之后的一个字节.
int 2dh
nop ; 会被跳过
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
读完这段内容后,我调试了一个采用 INT 2D来反调试的程序-----ShellWolf 编写的 AntiDebug Tester . 这个程序就采用了上面的"利用INT 2d(结合 SEH)反调试"的方法.
OD 载入程序,在代码段内搜索二进制 CD 2D(INT 2d的机器码),在 INT 2d 的前面一条指令上 F2下 INT 3 断点. F9 运行程序.只把 FD_INT_2d 钩选上,然后点击 DETECT . OD 就把程序断下来了.
为了使程序按正常流程运行,我们必须进入SEH Handler .
这里我就有个疑问了:
普通的异常, OD 里面有设置可以将其忽略,然后程序会进入 SEH Handler . 但是这个 INT 2d 好像不能这样做.那么直接把 SEH Handler 设置为新的 EIP ,可以吗?
想了想,是不行的.因为异常处理函数是有参数的,而我们没有将参数压栈,就直接进入了异常处理函数,肯定是有问题的.
那怎么才能顺利进入SEH Handler 呢?
目前,我想到的处理方式是:把INT 2d 这条指令改成 INT 3 或者其他能够产生异常的指令.
我想知道的是:有没有其他的方法?书上怎么没有讲如何反INT 2d 呢?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课