一、介绍: 什么是附加数据(overlay)摘自Lenus大神
实际当中的overlay
其实,overlay虽然大家在脱壳当中觉得很陌生,但是他离我们并不遥远。在我们平时使用的软件当中,有一些软件要处理一些数据流文件,比如 winamp。当我们下载了mp3文件(数据文件),没有播放器是不可能播放的,与此相关的还有很多,比如txt文件和notepad的关系也差不多。而这些数据文件被单独的保存在硬盘上,当我们使用notepad的打开功能的时候,就可以去读取数据文件里面的东西了。
overlay又是什么意思呢?
他其实真正的意思就是取消打开功能,将这些需要读取的数据放到pe文件的后面,让程序自动的运行打开的功能。这样的功能就变成了一个notepad的程序对应只能打开一个文件。
最典型的就是一些软件可以把一些数据流文件生成exe文件,比如一些mp3生成器,flash生成器,以及我们用来做动画的S-demo。他们的作用就是将数据对pe进行捆绑。(这样做的结果也就是为什么我们对这些文件用UPX等pe压缩工具却不能压缩他的原因
在我们对pe文件的overlay进行分析,普及一下文件映射的知识。在pe里面,有所谓的文件偏移RA,文件偏移大小RS和与其对应的虚拟地址偏移VA,虚拟地址偏移大小VS。
我们要深刻的理解以上的概念不是我这篇文章能说清楚的,但又是搞overlay必须得弄清楚的,于是我简单的说明一下。 在我们的磁盘上的pe文件里面,排列着的数据在运行的时候将被影射到内存空间。他们将被怎么映射呢?举个例子: 例1: 一个pe文件中只有两个区段(pe head不算) 第一个区段是.text VA=401000 VS=1000RA=200 RS=100 第二个区段是.data VA=402000 VS=1000RA=300 RS=100 假设我们打开winhex看到在文件偏移300处的情况是这样的: RA=2FF 处的数据是12RA=300处的数据是34 现在当pe文件装到内存中,那么会出现什么结果呢。 1.文件偏移中的200开始的100个字节将被影射到内存的401000开始的100个字节,后面的F000个字节将用0填充。 2.文件偏移中的300开始的100个字节将被影射到内存的402000开始的100个字节,后面的F000个字节将用0填充。 也就是说,在磁盘是上相邻的两个数据12和34,在内存空间中将分开得老远,12在40102FF处,而34却在402000处。 当然这只是我自己随便举的一个极端的例子,实际上由于文件的对齐机制在磁盘上每个段的结束都是填充了大量的0 为什么要讲这些 因为区段是一般将会被映射到内存的,如果上面的例子中。将.data区段去掉。那么在磁盘上就将会留下从RA=300到RA=400其大小为100的数据,不会被影射到内存中。而这部分数据就将被认为是附加数据-overlay。
【加壳方式】: UPX Inliner v1.0 by GPcH
【使用工具】: OllyDbg
PEID
Lord PE
WinHex
Imp Rec
Hex Wrokshop v6.5.1
【声明】: 主要展现脱壳后附加数据的快速解决,没有其他目的。
①、PEID看一下壳
②、DetectItEasy V1.0看一下什么编译器
然鹅,PE区段被改了,并看不出来
既然是UPX的壳,按照之前的文章步骤,脱壳吧
1、载入OD
2、
很明显是UPX的壳,ESP定律走起~~(单步跟踪、模拟跟踪都可以的)
3、F8单步往下走,F9运行程序,F8单步走,走,
4、
来到这,熟悉吧,右键分析-从模块中删除分析
5、
来到了熟悉的OEP,对照oep看一下是什么语言
6、
Vc++ 6.0的编译器
7、到达oep之后,下一步来脱壳
复制oep,3831,再用Lordpe脱壳
9、
修正镜像大小,在转存一下。
10、
再用 修复,不管能不能运行都得修复一下
11、修复完成后看一下壳子,打开程序运行一下
12、显示是vc++6.0,说明程序已经脱壳完成了
13、运行一下
14、OH!Shit!!
15、不出所料,因为刚开始就出现了这个东西
敲黑板!!!!
1、overlay只是数据它是不映射到内存的,它将被程序以打开自己的方式来读取数据
2、只要不是区段里面包括的文件的大小,将被视为overlay.
那怎么办呢,重点来了。。。。。。。。。。。。。
1、神器winhex
2、 这个东西
3、将未脱壳的程序放进去
4、
5、首先,把滑轮拖到最底部,依次往上找,找到第一处很多00的地方
6、
7、选择00结束第一个字符(alt+1)到末尾最后一个字符(alt+2)
8、
9、复制下来,关闭,拖入脱壳完成的文件
10、一直拉到最后,也是00很多的地方
11、
12、在末尾粘贴未脱壳程序的那段
13、
14、保存文件到脱壳后修复的文件
15、
16、有的在win7/xp情况下保存完成后可能会出错,版本不同
17、这是推荐使用Hex workshop ,使用方法与winhex一样,在吾爱破解工具包里都有
18、 运行试一下,无错误提示即可
使用lordpe,用PE编辑器打开加壳程序
依次打开区段,看到区段表
☆【重要属性介绍】
(1)Name : 这是一个8位的ASCII(不是Unicode内码),用来定义块名,多数块名以.开始(如.Text),这个.实际上不是必需的,注意如果块名超过了8个字节,则没有最后面的终止标志NULL字节,带有$的区块的名字会从编译器里将带有$的相同名字的区块被按字母顺序合并。
(2) VirtualSize: 指出实际的,被使用的区块大小,是区块在没有对齐处理前的实际大小.如果VirtualSize > SizeOfRawData,那么SizeOfRawData是可执行文件初始化数据的大小
(SizeOfRawData – VirtualSize)的字节用0来填充.这个字段在OBJ文件中被设为0.
(3)VirtualAddress: 该块时装载到内存中的RVA,注意这个地址是按内存页对齐的,她总是SectionAlignment的整数倍,在工具中第一个块默认RVA为1000,在OBJ中为0。
(4)SizeofRawData: 该块在磁盘中所占的大小,在可执行文件中,该字段包括经过FileAlignment调整后块的长度。例如FileAlignment的大小为200h, 如果VirtualSize中的块长度为19Ah个字节,这一块保存的长度为200h个字节.
(5) PointerToRawData: 该块是在磁盘文件中的偏移,程序编译或汇编后生成原始数据,这个字段用于给出原始数据块在文件的偏移,如果程序自装载PE或COFF文件(而不是由OS装载),这种情况,必须完全使用线性映像方法装入文件,需要在该块处找到块的数据。
虽然编译器自动产生一系列标准的区块,我们可以创建和命名自己的区块,在VC++中可以使用:
#pragma data_seg(“My_DATA”)
编译器有个很搞笑的特征,看见两个区块相似的属性的区块,那么连接时就合并成一个区块,这个取决于是否用/merge开关 /merge .rdata = .text
我们只需要ROffset和Rsize,计算一下这两个块的大小
400+C600=CA00 (16进制下)
我们把未脱壳的程序放入HexWorkshop,CTRL+G转到CA00处
l C9 F6加上 10个字节
l CA 04减去 4个字节
所到达的地方都是CA 00
就来到我们之前往上找到00末尾的位置
从A5开始,一直到最后复制下来
打开脱壳之后修复的文件,拖入HEXWORKSHOP
在最后末尾处,粘贴刚刚复制的代码
最后,保存一下,备份点一下,打开程序看一下能否正常运行。OK,数据处理完毕
最后看一下壳子
壳子已经脱掉,显示附加数据不用管,之后载入od,看一下oep
具体原理研究可以去寻找Lenus大神的《浅谈脱壳中的附加数据问题(overlay)》和《PE文件中区段的详细分析 》这两篇文章
总结:
1.简单介绍什么是附加数据
2.overlay又是什么意思
3.文件映射知识
4.回顾ESP定律
5.Winhex、HEXWORKSHOP使用方法
6.两种方法附加数据的处理
7.区段表小姿势
附件我打包了:点击查看
|