【安卓逆向】徒手脱壳的几种方法!

首先我们先来说说壳的原理吧,简单说下就好,带壳程序运行以后,都会做哪些事情呢? (想要了解更多的朋友们就去读看雪大哥的《加密与解密(第三版)》吧)

1、保存现场(pushad/popad,pushfd/popfd)>>2、获取壳自己需要的API地址>>3、解密原程序各个区块>>4、IAT的初始化>>5、重定位>>6、Hook-API>>7、跳到 OEP

首先我们先用DIE来查一下带壳程序是什么语言编写的,然后再用OD载入。

在脱壳之前呢,我们一定要知道各个语言的OEP特征是什么,免得到时候就算到了OEP,自己都不知道,那可就悲剧了,这里列出各个语言的OEP(请忽略地址):

VC++:【安卓逆向】徒手脱壳的几种方法!VB:【安卓逆向】徒手脱壳的几种方法!BC++:【安卓逆向】徒手脱壳的几种方法!Delphi:【安卓逆向】徒手脱壳的几种方法!易语言:【安卓逆向】徒手脱壳的几种方法!【安卓逆向】徒手脱壳的几种方法!MASM32 / TASM32入口:【安卓逆向】徒手脱壳的几种方法!VC8入口:【安卓逆向】徒手脱壳的几种方法!脱壳方法:

知道了入口我们就开始脱壳吧!

脱壳方法一:单步跟踪,其实就是f8,f7配合啦

需要注意的几点:当你遇到近Call的时候需要用f7跟进;当你遇到远Call的时候,用f8跳过就行;当遇到循环的时候,直接用f4跳出;当遇到大的跳转就要注意了,很快就到OEP了

我们拿《加密与解密》的RebPE.exe举栗子,die查VC++写的,来看看吧:【安卓逆向】徒手脱壳的几种方法!【安卓逆向】徒手脱壳的几种方法!脱壳方法二:最后一次异常法【安卓逆向】徒手脱壳的几种方法!脱壳方法三:两次断点法(内存镜像法):外壳会先解压各个区段,然后再跳回代码段执行,根据这个原理:【安卓逆向】徒手脱壳的几种方法!脱壳方法四:ESP定律:外壳在开始的时候一定要保存环境(例如pushad),结束的时候还原环境(例如popad),最重要的是堆栈一定要平衡,这样,当执行pushad后,我们就可以在ESP下断点:【安卓逆向】徒手脱壳的几种方法!脱壳方法五:直接搜索popad法

这方法原理特别简单,既然popad是还原环境,那么直接搜索ctrl+f搜索popad,然后下f2断点,运行断下就好了。

当然,这种方法有很大的局限性,只适合UPX,ASPACK等少量壳。

脱壳方法六:模拟跟踪法

tc的意思:Trace in till condition 跟踪进入直到条件满足

eip是当前指令指针【安卓逆向】徒手脱壳的几种方法!脱壳方法七:sfx法,这方法就是太慢了

【安卓逆向】徒手脱壳的几种方法!脱壳方法八:一步到达法【安卓逆向】徒手脱壳的几种方法!【安卓逆向】徒手脱壳的几种方法!以上就是我掌握的徒手脱壳的方法了,不是每个方法都适合所有的壳,怎么说呢,挨个试试吧。交流学习+Q群:823938389

当然也可以脱壳机或者用一堆脚本,不过这篇文章的主题是‘徒手’脱壳,就列出这几种方法,如果有什么不对的,还请指正。