对于附加数据(overlay),相信那些经常接触壳的朋友们都不会感到陌生,当我们查壳的时候,有时会在查出的壳的名字后面跟着一个“[Overlay]”,这就表示带有附加数据。在这种情况下,我们按照平时使用的方法脱壳后,有的程序可以正常运行,有的却又不能正常运行,这是怎么回事呢?接下来就让危险漫步带着大家去深入的了解一下吧。
首先我们来了解一下附加数据,我们平时使用的一些软件,有一些需要处理数据流文件,一个mp3文件(数据文件)没有播放器是不能播放的,一个txt文件没有notepad也是打不开的,而overlay真正的意思就是取消打开功能,将这些需要读取的数据存放到pe文件的后面,让程序能够自动的执行打开功能。其最典型的应用,就是一些软件可以把数据流文件生成exe文件,比如flash生成器,一些制作电子书的工具,以及我们用来制作动画的S-demo等,它们的作用就是把数据对pe进行捆绑。
我们来做一个试验,使用lordPE的pe编辑器打开一个test.exe文件(这是一个普通的未经任何处理的可执行文件,大家可以先使用PEID查看一下),然后查看它的区段,把它最后一个区段的文件偏移大小RS修改成00008200,接着再使用PEID打开查看一下显示为“vc8->Microsoft Corporation [Overlay]*”,带有附加数据了,这是怎么回事呢?下面我就给大家补充一下文件映射的相关基础知识。
PE文件中排列着的数据在运行的时候将会被映射到内存空间,假设一个PE文件只存在两个区段,第一个区段是".text VA=400000 VS=1000 RA=100 RS=100”,第二个区段是“.data VAT401000 VS=1000 RA=200 RS=100”,如果我们打开winhex并来到文件偏移200处,其情况是这样的:RA-1FF处的数据是15,RA-200处的数据是16。那么当该PE文件装载人内存的时候,文件偏移中的100开始的100个字节将会被映射到内存的400000开始的100个字节中,后面的FOO个字节将会使用0填充,而文件偏移中的200开始的100个字节将会被映射到内存的401000开始的100个字节中,后面的FOO个字节将会使用0填充,这样在磁盘上相邻的两个数据15和16,在内存中一个在40000FF处,一个401000处,分开很远。
区段一般是会被映射到内存中的,如果我们将.data去掉,那么该PE文件就将会留下从RA=200到RA=300,大小为100的数据而不会被映射到内存中去,这部分数据就将被认为是附加数据。
这只是我随便举的一个例子,在实际的应用中,由于文件的对齐机制,在磁盘上每个段的结束都是填充了大量的0。通过上面介绍的这些基础知识,我们就可以得知,附加数据只是数据,不会被映射到内存中去,它将会被程序以打开自己的方式来读取数据,所以dump下来的时候是没有附加数据的,需要我们手工把这一部分的数据粘贴到dump下来的数据的后面才行。结合实验也可以得知,只要不是区段里面包括的文件的大小,也都将被视为附加数据,并且附加数据紧跟在所有区段的最后,这也就是说,附加数据的开始位置,就是最后一个区段的RA+RS。
理论知识介绍完了,我们来实际的操作一下,演示的程序就是今年第二期杂志光盘中收录的一个exe电子书——扑克麻将入门秘籍。第一步当然是检查一下壳,使用PEID打开程序,提示程序加的是ASPac的壳,后面的“[Overlay]”就表示存在附加数据。接下来我们使用OD载入程序,使用ESP定律法脱掉这个壳。首先按F8单步步过,寄存器窗口ESP处数据变成红色时就在其上面点击右键,选择“数据窗口中跟随”,然后来到数据窗口选中第一行反汇编代码,点击右键,依次选择“断点”——“硬件访问”——“WORD”,下完断点后我们按F9运行程序,然后继续按F8单步步过,不久就会来到程序的OEP处了,接下来我们就可以dump了,点击右键选择“用OllyDump脱壳调试进程”,在弹出的窗口中直接点击脱壳,保存为dump.exe,最后我们还要使用工具来修复一下输入表。
接下来运行处理后的程序,出现了的错误提示,当程序的附加数据损坏或是没有修复的时候都会出现这个错误提示,因此我们还需要进行附加数据的修复工作。步骤就是先找到附加数据开始的位置,然后将附加数据复制到脱壳后的程序中去。再次使用peid打开未脱壳的文件,点击“EP区段”后面的箭头来打开节查看器,记录下最后一个区段.adata的文件偏移和大小,并将其相加,得到的值0004A200就是附加数据的开始位置,然后我们使用C32ASM以十六进制模式打开未脱壳的文件,按Ctrl+G跳到0004A200处,从此处开始便是程序的附加数据了。
我们要将这些附加数据全选中,因为附加数据是很长的一段,因此我们可以直接在开始位置按住shift同时点击鼠标左键,然后在结尾处按住shift同时点击鼠标左键来将其全部选中,接下来点击右键选择“拷贝”——“拷贝”。使用C32ASM以十六进制方式打开脱壳后的文件,直接拉到最下面,将附加数据复制到程序的最后并保存文件就行了,最后我们运行一下修改后的程序,发现可以正常执行了。
以上介绍的复制粘贴附加数据的方祛也并不是通用的,当我们碰到不是使用FILE_END为指针的程序时,这种方法就行不通了,但好在大多数的程序还都是使用FILE_END的。
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法破解行为。