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 顶起,感谢楼主分享经验咯,让我等小菜可以少走弯路!!!! 顶起,感谢楼主分享经验咯,让我等小菜可以少走弯路!!!! 不错.加精鼓励 厉害。。。she一直看不懂是啥=-= 还是看不懂吖。。。好晕。。。一直看不懂SetUnhandledExceptionFilter这种异常怎么绕过 來學習。填補這方面空白~:loveliness: 我是菜鸟,进来参观一下,顺便学习并顶一下楼主,:$ very good!
强烈学习
一直对SEH一知半解 向楼主学习~! 还是不太明白,看完那几个cm再好好品品. 不错,学习了