标签:技术 ges 查看 文件的 jmp 大小 解压 解决 s系列
在理解什么是压缩壳的时候,我们先了解一下什么是壳
壳可以简单理解为就是在自己的PE文件中包含了代码.而有不影响我们的PE文件的执行.
压缩壳指的是让我们的PE文件变小.
首先可以看到,我们的PE文件
一个PE头,两个节数据,其中节和节之间还有对齐值.而上图是我们的一个正常壳映射到内存中的示意图.
从上图可以看出, 我们的PE文件,压缩一下变成了一个新的PE文件,其中我们的PE文件,压缩的数据是节里面的数据
也就是说,压缩壳的原理就是压缩PE文件中节的数据.然后产生新的PE,这个新的PE我们成为带壳的PE
而我们运行带壳PE的时候,这时候壳中的解压缩代码开始执行,从而把我们以前压缩数据的节重新映射到内存.
此时观察方法1我们会发现,我们新的PE, 解压缩的代码在压缩数据(节)的上面,那么这个时候则会面临一个问题
如果我们解压缩的时候,那么压缩数据的地址应该在我们解压缩代码的哪里,那么此时我们一边解压缩,一边压缩数据会覆盖解压缩代码,此时我们不知道是先解压完成,还是先覆盖完成
解决方法:
首先我们知道原PE的节的个数以及大小,那么此时我们生成的新的带壳PE,则会获得大小.然后在其带壳PE的下面申请怎么大小的节用来占位置即可.
那么此时我们解压的数据,则会写到我们占位置的地方.
如果不懂可以看下图理解
此时Shell(中文翻译为壳)代表的就是解压缩的代码
这个图是映射到内存中的带壳PE分布图.
很简单,解压缩代码执行,然后解压的代码正好在我们占地方的位置.
首先我们知道压缩壳了,压缩壳就是缩小PE文件
那么在壳的世界 还有加密壳. 原理是一样的,只不过
压缩壳: 用来压缩数据,减小PE体积
加密壳:用来防住你们我们他们等等逆向人员的 ^_^
1.查找OEP(入口点 )
方法: 经验,这个主要看经验
不过这个经验也好分辨.
2.脱壳手法
2.1 ESP 定律
2.2 API
2.3 单步跟踪(步过循环,只向下跳转)
3. 经过上面步骤开始脱壳
手工DMP内存(把内存拷贝下来)
然后修复PE (一般加密壳汇编PE中的导入表给抹掉)
首先ESP定律,在壳的第一讲已经讲解过了
这里我们说下怎么查看入口点,以及脱壳手法的API 跟踪,和单步跟踪.
如果要识别入口点,这里只简单说下,因为比如 VC++6.0 VSXXX VB...等等入口点都是不一样的
这里直说一下VC和VS入口点的识别方法.
首先随便打开一个没有加壳的程序(VC++6.0的)OD打开查看.
1.VC6.0的识别
往下拖动一下
可以看出,VC6.0的入口点会固定的调用这三个API
只需要记住即可.看下VS的识别方法
不知道还是电脑原因还是编译器原因,编译的程序不能在XP下使用OD打开,所以只能用IDA说下了
如果OD能打开,那么则是一个Call 然后下方紧接着跟着一个JMP跳转
那么它的入口点特征则是调用以上的API
因为ESP定律已经说过了,这里使用API进行脱壳.
思路:
因为我们知道入口点的特征,比如VC6.0的,它会调用API,那么我们API下段点即可.肯定会过去的.
首先我们脱一个VC6.0的upx压缩壳.
首先我们知道入口点会调用的API
那么我们下断点即可.
(注意,这里使用UPX随便压缩了一个VC的程序,UPX可以官网下载,VC程序也可以自己编写一个)
F9以下,看看能不能断下来.
断下来了,只不过是断在里面了,然后我们执行到返回 CTRL + F9 即可看到我们的熟悉的特征
确实使我们的入口点位置
那么此时移动汇编代码到入口点,也就是一开始的地方,(因为此时程序已经执行的API可能数据已经破坏了,所以我们在入口点位置下段点,重新运行则可以断在入口点)
此时重新运行程序,当我们的EIP 位置是4014EC的地方我们则可以DMP内存了.
保存一份即可.
这个就比较简单了,我们遇到循环,不看直接往下单步走,直到走到一个远跳即可.
比如我模拟一下OD
地址: 汇编代码
1 add eax,eax
2 mov eax,eax
3 jnz 1 EIP = 3
4 mov edx,edx
5 jmp 00401000
此时EIP = 3,那么会跳转到1,那么这个时候我们在4地址下段点即可,不看它的循环,一直到5地址,有个远跳,即可.
关于DMP内存和上面一样,不说了.
标签:技术 ges 查看 文件的 jmp 大小 解压 解决 s系列
原文地址:http://www.cnblogs.com/iBinary/p/7764483.html