通用脱壳方法【转】
http://www.unpack.cn/viewthread.php?tid=32471&extra=page%3D1&page=1
通用脱壳方法
Nooby大牛的方法
脱壳成功与否是方法问题,能否运行是造诣问题.有时候脱壳不能运行未必就是失败的,反之脱壳后能运行未必就是脱壳成功,SDK,自效验,暗桩等着呢。
第一步,测试环境
首先确保你的OD不被anti猥琐掉,所以加载程序后直接F9,如果不能运行,就要检查插件设置等等。一般情况下只需海风插件隐藏调试器。
如果碰到无法在调试器运行的,要么你没设置好,要么就是壳太强了,第二种情况居多,不过如果你需要看此脱壳教程,说明那壳你肯定搞不定,shift+del。
确保OD能正常运行目标程序后,进入第二步。
第二步,确定壳入口
先看看海风插件选上REMOVE EP BREAKPOINT和BREAK ON TLS以后,能否在入口断下,如果断下了,就麻烦了。
麻烦一:
TLS回调函数有一个特点,在程序入口之前,但是在系统加载PE之后,也就是说,壳可以在这里把NT头干掉,把IAT干掉,把区段表干掉等等,只要保留TLS目录,就能正常执行。
麻烦二:
如果不选择那2个选项,调试器会在程序入口下断点,由于TLS回调函数在入口之前执行,可以用来检测此断点。
麻烦三:
自效验也可以在TLS回调函数里完成,另外TLS回调函数可以正常调用API,所以必须小心。
麻烦四:
如果开了内核调试模式,TLS里的异常会触发KD,导致未连接内核调试器的系统假死,或者直接结束被调试进程。
麻烦五:
TLS回调函数可以用来解码,写patch的时候要注意。
不过除了上面这些,TLS也没什么神奇,万变不离其宗。
如果没有TLS回调函数,那么好,去掉这2个选项就能停在程序入口,转到第三步。
第三步,解码
等壳解码,一般可以在VirtualAllocEx,VirtualProtect等等API下断,注意下在API入口后几条语句,以免被检查到。更猥琐一点,跟到第一个CALL里面下断,这样模拟API也不怕。
等到解码完了,找OEP吧,CTRL+G,这个看经验了,入口猥琐几字节无所谓的,找到个大概地方,下一个断点。这个可以参考大量别的文章,此文不详细深入。
第四步,修IAT
我从来不喜欢patch壳加载代码修复法,因为不但繁琐而且猥琐,效果未必好,简单的方法是直接在刚才那个断点停下后,找一个call跟进去,然后找一下最后进入API的地方,想个办法写成脚本,方法可看我的VMP IAT FIX。
如果碰到模拟API的,其实非常简单,得到的地址是API附近,但不是入口对吧?先XOR地址地位,找DLL的基址,然后枚举IAT找最近的API入口,KO。此方法出错概率比较小,也简单。
修复完成后,API调用变成直接调用了,这个时候拿UIF修复,然后再dump,最后用IMPREC修复dump文件,注意顺序。
-----------------------
其实脱壳就这样简单,那么多anti,修复,sdk等等,其实忽悠成分居多。
比如壳有VM,需要补区段,就可以先给文件加一个大段,过掉文件效验,然后重定向VirtualAlloc,那样补区段的工作量几乎没有。
Heap、CriticalSection、LoadLibrary等ANTI可以自己写一个小loader,谁说脱壳后非得要从原程序OEP执行?
剩下的是造诣问题了,教不会的,只能自己积累经验。
补充一下,其实壳有很多方法anti dump.
稍微总结一下.
比如,我在壳里CreateFile,把句柄保存了,然后在OEP之后用这个句柄,dump了就见鬼了吧?
在壳里HeapAlloc,OEP后的代码里用这个地址,又要见鬼了吧?
等等.
这些都是公开的秘密,只看个人功力问题,没有统一对策.
第一步,测试环境
首先确保你的OD不被anti猥琐掉,所以加载程序后直接F9,如果不能运行,就要检查插件设置等等。一般情况下只需海风插件隐藏调试器。
如果碰到无法在调试器运行的,要么你没设置好,要么就是壳太强了,第二种情况居多,不过如果你需要看此脱壳教程,说明那壳你肯定搞不定,shift+del。
确保OD能正常运行目标程序后,进入第二步。
第二步,确定壳入口
先看看海风插件选上REMOVE EP BREAKPOINT和BREAK ON TLS以后,能否在入口断下,如果断下了,就麻烦了。
麻烦一:
TLS回调函数有一个特点,在程序入口之前,但是在系统加载PE之后,也就是说,壳可以在这里把NT头干掉,把IAT干掉,把区段表干掉等等,只要保留TLS目录,就能正常执行。
麻烦二:
如果不选择那2个选项,调试器会在程序入口下断点,由于TLS回调函数在入口之前执行,可以用来检测此断点。
麻烦三:
自效验也可以在TLS回调函数里完成,另外TLS回调函数可以正常调用API,所以必须小心。
麻烦四:
如果开了内核调试模式,TLS里的异常会触发KD,导致未连接内核调试器的系统假死,或者直接结束被调试进程。
麻烦五:
TLS回调函数可以用来解码,写patch的时候要注意。
不过除了上面这些,TLS也没什么神奇,万变不离其宗。
如果没有TLS回调函数,那么好,去掉这2个选项就能停在程序入口,转到第三步。
第三步,解码
等壳解码,一般可以在VirtualAllocEx,VirtualProtect等等API下断,注意下在API入口后几条语句,以免被检查到。更猥琐一点,跟到第一个CALL里面下断,这样模拟API也不怕。
等到解码完了,找OEP吧,CTRL+G,这个看经验了,入口猥琐几字节无所谓的,找到个大概地方,下一个断点。这个可以参考大量别的文章,此文不详细深入。
第四步,修IAT
我从来不喜欢patch壳加载代码修复法,因为不但繁琐而且猥琐,效果未必好,简单的方法是直接在刚才那个断点停下后,找一个call跟进去,然后找一下最后进入API的地方,想个办法写成脚本,方法可看我的VMP IAT FIX。
如果碰到模拟API的,其实非常简单,得到的地址是API附近,但不是入口对吧?先XOR地址地位,找DLL的基址,然后枚举IAT找最近的API入口,KO。此方法出错概率比较小,也简单。
修复完成后,API调用变成直接调用了,这个时候拿UIF修复,然后再dump,最后用IMPREC修复dump文件,注意顺序。
-----------------------
其实脱壳就这样简单,那么多anti,修复,sdk等等,其实忽悠成分居多。
比如壳有VM,需要补区段,就可以先给文件加一个大段,过掉文件效验,然后重定向VirtualAlloc,那样补区段的工作量几乎没有。
Heap、CriticalSection、LoadLibrary等ANTI可以自己写一个小loader,谁说脱壳后非得要从原程序OEP执行?
剩下的是造诣问题了,教不会的,只能自己积累经验。
补充一下,其实壳有很多方法anti dump.
稍微总结一下.
比如,我在壳里CreateFile,把句柄保存了,然后在OEP之后用这个句柄,dump了就见鬼了吧?
在壳里HeapAlloc,OEP后的代码里用这个地址,又要见鬼了吧?
等等.
这些都是公开的秘密,只看个人功力问题,没有统一对策.