hkfans007 发表于 2009-1-7 11:22

SEH的反调试原理菜鸟版

一直对SEH的反调试原理不明白,今天终于弄清楚了,放上来看看对那些我一样弄不明白SEH反调试原
理的菜菜看看。并附上相关的CM以及该CM的破解教程的链接地址。

在看过几款CrackMe后大概明白了其做法:

1. 首先利用异常处理例程来进行反跟踪,很多CM都是首先安装好一个异常处理例程,然后故意制造一
个异常,如果 xor eax, eax;   mov eax, 1或者 mov eax, 0   jmp eax 之类的,然后程序抛出异
常,在onllydebug下用shift + F7 或者 shift + F8 进入 ntdll.KiUserExceptionDispatcher,单步
跟踪后最后系统调用用户模块中的异常处理例程. 很多CM都是在异常处理例程编写一个算法来重新将
EIP定位到一个会造成异常的指令地址,重复这个过程几次,这样给调试者一种很难跟踪的假象,这种
一般只要用 shift + F9 (OnllyDebug:该组合键是将异常交给用户程序的异常处理例程来处理,如果
我们想弄清楚异常处理例程到底在做什么,我们可以在异常处理例程下个断点来查看其实现过程。

PS: 见过一个CM是用异常处理例程是每次INT3异常对应一条MSAM语句,这条语句就是注册码生成用的
,所有有时候有必要跟踪异常处理例程。如果整个注册算法很大的话.......

2.未处理异常用于反跟踪的原理 [要是早知道这个我就不会一值很困惑了。。。]
根据MSDN的描述,UnhandledExceptionFilter在没有debugger attach的时候才会被调用。所以,
SetUnhandledExceptionFilter函数还有一个妙用,就是让某些敏感代码避开debugger的追踪。比如你
想把一些代码保护起来,避免调试器的追踪,可以采用的方法:
.         在代码执行前调用IsDebuggerPresent来检查当前是否有调试器加载上来。如果有,就
退出。
.         把代码放到SetUnhandledExceptionFilter设定的函数里面。通过人为触发一个
unhandled exception来执行。由于设定的UnhandledExceptionFilter函数只有在调试器没有加载的时
候才会被系统调用,这里巧妙地使用了系统的这个功能来保护代码。

第一钟方法很容易被绕过。看看IsDebuggerPresent的实现:
0:000> uf kernel32!IsDebuggerPresent
kernel32!IsDebuggerPresent:
281 77e64860 64a118000000   mov   eax,fs:
282 77e64866 8b4030         mov   eax,
282 77e64869 0fb64002         movzx   eax,byte ptr
283 77e6486d c3               ret
IsDebuggerPresent是通过返回FS寄存器上记录的地址的一些偏移量来实现的。([FS: [18]]:30
保存的其实是当前进程的PEB地址)。在debugger中可以任意操作当前进程内存地址上的值,所以只需
要用调试器把[[FS:[18]]:30]:2的值修改成0,IsDebuggerPresent就会返回false,导致方法1
失效。
对于第二种方法,使用[[FS:[18]]:30]:2的欺骗方法就没用了。因为
UnhandledExceptionFilter是否调用取决于系统内核的判断。用户态的调试器要想改变这个行为,要
破费一番脑筋了。
Kwan Hyun Kim提供了一种欺骗系统的方法:
How to debug UnhandleExceptionHandler
http://eparg.spaces.msn.com/blog/cns!59BFC22C0E7E1A76!1208.entry

3.提供几个CM的链接地址
[使用多次异常和未处理异常来反跟踪]
http://bbs.pediy.com/showthread.php?threadid=8155
[使用中断异常产生对应的注册算法,需要很大的耐性。。。。]
http://bbs.pediy.com/showthread.php?t=27224
[利用未处理异常,还没弄明白。。]
http://bbs.pediy.com/showthread.php?t=12217

http://bbs.pediy.com/showthread.php?t=9023

bensonhb 发表于 2009-1-7 12:47

顶起,感谢楼主分享经验咯,让我等小菜可以少走弯路!!!!

bensonhb 发表于 2009-1-7 12:45

顶起,感谢楼主分享经验咯,让我等小菜可以少走弯路!!!!

ximo 发表于 2009-1-7 12:15

不错.加精鼓励

rain灿 发表于 2014-11-1 21:19

厉害。。。she一直看不懂是啥=-=

蚯蚓翔龙 发表于 2014-11-1 16:30

还是看不懂吖。。。好晕。。。一直看不懂SetUnhandledExceptionFilter这种异常怎么绕过

Squn 发表于 2009-1-7 13:08

來學習。填補這方面空白~:loveliness:

iawen 发表于 2009-1-7 13:12

我是菜鸟,进来参观一下,顺便学习并顶一下楼主,:$

zapline 发表于 2009-1-7 13:40

very good!
强烈学习
一直对SEH一知半解

xiaobai 发表于 2009-1-7 14:40

向楼主学习~!

西氏 发表于 2009-1-7 18:58

还是不太明白,看完那几个cm再好好品品.

天下无雪 发表于 2009-1-8 01:40

不错,学习了
页: [1] 2 3
查看完整版本: SEH的反调试原理菜鸟版