一种基于PE文件的信息隐藏技术研究
2021-06-05雷冲,梁丽
雷 冲, 梁 丽
(1.四川文理学院 智能制造学院; 2.招生就业处,四川 达州635000)
0 引 言
信息隐藏指把一个特定的信息隐藏在另一个公共载体的信息中而得到的隐蔽载体,非法者不知道这个普通信息中是否隐藏了其他的信息,即便知道也很难提取或去除隐藏的信息.所用载体可以是文本、图像、声音及视频等.[1-2]
PE文件的全称是Portable Executable,意为可移植的可执行的文件,常见的EXE、DLL、SYS,COM等都是PE文件,PE文件是微软Windows操作系统上的程序文件,而PE文件信息隐藏是指利用PE文件的存储空间冗余、结构特性和PE文件执行等特点,在不破坏PE文件的基本特性和使用价值的前提下,将受保护信息隐藏在载体PE文件中,实现版权保护、隐蔽通信等功能.[2]
1 PE文件结构
PE文件结构如图1所示,以Windows 32位操作系统为例,一个标准的PE文件一般由四大部分组成:DOS头、PE头、节表、节内容.其中DOS头由DOS MZ头和DOS Stub构成,DOS MZ头即IMAGE_DOS_HEADER,占据了PE文件的头64个字节,其中最重要的两个字段是e_magic和e_lfanew,e_magic是位于偏移0处的“MZ标志”,其值为0x5A4D,e_lfanew(0x3c处)指出了PE头的起始偏移量,紧接着是DOS Stub,它是一个字节块,其内容随着链接时使用的链接器不同而不同,其大小不固定,在Windows NT系统下被当做是冗余数据.紧接着是PE头,其由四个字节的PE头标识Signature,20个字节的标准PE头和224个字节的扩展PE头组成,紧接着是节表,由多个IMAGE_SECTION_HEADER结构组成,一个IMAGE_SECTION_HEADER结构占40个字节,用来描述一个区块(又名节)的属性和位置信息,它们之间是一一对应关系,有多少个区块就有多少个这样的结构.[3-6]
节内容....reloc节.rsrc节.data节.text节节表n×IMAGE_SECTION_HEADER结构PE头16×IMAGE_DATA_DIRECTORY结构IMAGE_OPTIONAL_HEADER32结构IMAGE_FILE_HEADER32结构“PE”, 0, 0DOS头DOS StubIMAGE_DOS_HEADER结构
2 PE文件冗余空间分析
由以上内容可知,PE文件的结构较为复杂,其不可避免地会存在一些冗余空间,主要分为如下几种.
(1)PE文件中存在多种不同的结构,这些结构本身存在未被使用的字段空间.
(2)PE文件中存在多个区块,存储在磁盘上的PE文件,组成块的数据应保证从本字段的倍数地址开始,即区块对齐.对于运行于x86的可执行文件,文件对齐的值由扩展PE头的FileAlignment字段决定,通常为200h或者1000h,因而每个区块所占用的磁盘空间往往会大于它真实的数据所需要的空间,这通常会在每个区块的末尾为了对齐而存在冗余空间.
(3)在原来节后面人为新增一个节,添加到原来节的后面,并修改相应的节表,使得新增的节更具隐蔽性.[7-8]
第一、二种冗余存在着冗余空间有限的问题,第三种冗余通过新增节的方法理论上可实现无容量限制的信息隐藏.新增一个节需要添加一个IMAGE_SECTION_HEADER结构,要求PE文件在节表处至少有连续40个字节的冗余空间,如无法满足则需要进行节的合并从而留出足够的空间,本文接下来将介绍如何新增节以及合并节从而留出足够的冗余空间来隐藏信息.
3 信息隐藏方法
在win7环境下,以QQScLauncher.exe为例,新增一个节的步骤如下:<1>判断是否有足够的空间,可以添加一个节表.用UltraEdit软件查看,可知FileAlignment的值为200h,在节表与第一个节之间因文件对齐存在着远超过40个字节的冗余空间.<2>在节表中新增一个成员.复制.text节的四十个字节并添加到节表的最后.<3>修改PE头中节的数量.NumberOfSections字段的值加1.<4>修改SizeOfImage的大小.其值为原SizeofImage值与新增节数据之和并按照内存对齐后的结果.<5> 在原有数据的最后,新增一个节的数据(须满足内存对齐的整数倍).<6> 修正新增节表的属性.Name字段的值可随便修改,但不能超过8个字节;VirtuallAddress字段的值按照内存对齐并参照上一个节VirtuallAddress的值进行修改;SizeofRawData字段的值为添加的节数据的大小并按照文件对齐后的要求修改;PointerToRawData字段的值为上一个节的PointerToRawData值与上一个节SizeofRawData值之和.
并非所有的PE文件都有足够的空间来存放一个节表,例如notepad.exe二进制文件,其解决方案一种方法是将整个PE头以及节表都上移,覆盖DOS Stub这部分内容,同时修改e_lfanew的值,使其指向新的PE签名地址,但如果该二进制文件是被PE编辑工具编辑过的,DOS Stub这部分内容则很可能不再是垃圾数据而是有用的数据,此种方案无法采用.另一种解决方案是进行节的合并,假设将所有的节合并为一个节,那么对应的节表只需要有一个结构描述其属性和位置,这样即可留出足够的空间来进行新增节的操作,其步骤如下:<1>按照内存对齐展开.<2>将第一个节的内存大小、文件大小改成一样Max=SizeOfRawData>VirtualSize?SizeOfRawData:virtualSize,其值为其中的大者,将所有节合并为一个节后,其值为SizeOfRawData=VirtualSize=最后一个节的VirtualAddress+Max-SizeOfHeaders内存对齐后的大小.<3>将第一个节的属性改为包含所有节的属性.<4>将节的数量修改为1.
为了增强所隐藏信息的安全性和系统抗攻击性,可对需要隐藏的信息进行加密处理,加密后将其嵌入选定的PE文件中,信息的提取是信息隐藏的逆过程,其主要操作是从嵌入的地方提取信息,将加密信息解密后即可获得明文信息.
结 语
本文通过对PE文件冗余空间的分析,列举出了基于PE文件进行信息隐藏的一些方案,并针对通过新增节的方式进行信息隐藏的方案中存在的问题,即PE文件被PE编辑工具编辑过后导致无足够的冗余空间,提出了一种先合并节再新增节的方式实现无容量限制的信息隐藏技术.此种方案对原PE文件的大小有所改变,因此在选择PE文件时应比隐藏的信息大两个数量级以上,如何在不改变PE文件大小的情况下实现无容量限制的信息隐藏有待进一步研究.