首页
社区
课程
招聘
[原创]关于徒手脱壳的几种方法
发表于: 2017-6-20 07:50 14810

[原创]关于徒手脱壳的几种方法

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等少量壳。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 35
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
各程序入口特征都有,方法也很多很详细,学习了,谢谢。
2017-6-20 10:23
0
雪    币: 804
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
对脱壳不熟悉,正在学习,感谢分享...
2017-7-10 11:35
0
雪    币: 22
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我已经保存为pdf了
2017-7-20 23:25
0
雪    币: 542
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

正在学习,感谢分享.
2019-8-17 20:55
0
雪    币: 3250
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
初学脱壳,感谢分享经验
2019-8-18 09:54
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
干货,正在学习。感谢分享
2019-10-20 22:02
0
雪    币: 2248
活跃值: (848)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
资料很有用。感谢分享。
2019-10-21 08:44
0
游客
登录 | 注册 方可回帖
返回
//