-
-
[原创]关于徒手脱壳的几种方法
-
发表于:
2017-6-20 07:50
14810
-
首先我们先来说说壳的原理吧,简单说下就好,带壳程序运行以后,都会做哪些事情呢? (想要了解更多的朋友们就去读看雪大哥的《加密与解密(第三版)》吧)
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等少量壳。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!