第14章 运行时压缩
本文最后更新于:2022年5月19日 晚上
第14章运行时压缩
运行时压缩器(Run-Time Packer)是软件逆向分析学的常见主题。为了理解好它,需要掌握有关PE文件格式、操作系统的基本知识(进程、内存、DLL等),同时也要了解有关压缩/解压缩算法的基本内容。其中许多部分已经在前面讲解过了,学习运行时压缩能够进一步帮助大家把前面学过的逆向分析知识系统化,做到融会贯通。
14.1 数据压缩
大家对于数据压缩都比较熟悉,下面简单梳理一下相关知识。数据压缩(DataCompression)是计算机工程的主要研究内容,经过数十年发展已经有了深入研究,今后还会不断岀现更多、更好的算法。
如果日常生活中能够非常容易地压缩某个物体该多么方便啊!也就不再需要仓库、停车场、集装箱了,当然,得能压缩才行。而在数码世界,(只要不是压缩过的信息)任何信息都能轻松压缩。
不论哪种形态的文件(数据)都是由二进制( 0或1 )组成的,只要使用合适的压缩算法,就能缩减其大小。经过压缩的文件若能100%恢复,则称该压缩为“无损压缩”(Lossless Data Compression );若不能恢复原状,则称该压缩为“有损压缩”(Loss Data Compression )。
14.1.1 无损压缩
无损压缩用来缩减文件(数据)的大小,压缩后的文件更易保管、移动。使用经过压缩的文件之前,需要先对文件解压缩(此过程中应该保证数据完整性)。
各位肯定用过类似7-zip、“面包房”的压缩程序,用它们压缩文件就是无损压缩算法。最具代表性的无损压缩算法有Run-Length、Lempel-Ziv、Huffman等。此外还有许多其他压缩算法,它们都是在上面3种压缩算法的基础上改造而成的。只要准确理解了上面3种,就能轻松掌握其他各种压缩算法。ZIP、RAR等是具有代表性的压缩文件格式,它们最根本的压缩理念也是Run-Length、Lempel-Ziv、Huffman,然后应用了一些各自特有的技术(压缩率、压缩/解压时间)。
14.1.2 有损压缩
相反,有损压缩允许压缩文件(数据)时损失一定信息,以此换取高压缩率。压缩多媒体文件)jpg, mp3、mp4)时,大部分都使用这种有损压缩方式。从压缩特性来看,有损压缩的数据解压缩后不能完全恢复原始数据。入类的肉眼与听觉几乎无法察觉到这些多媒体文件在压缩中损失的数据。经过有损压缩后,虽然压缩文件与原文件(从数据层面上看)存在差异,但重要的是入们几乎区分不出这种微小的差别。以mp3文件为例,mp3的核心算法通过删除超越入类听觉范围(20〜20000Hz)的波长区段来缩减(不需要的)数据大小。
14.2 运行时压缩器
顾名思义,运行时压缩器是针对可执行(PE,Portable Executable )文件而言的,可执行文件内部含有解压缩代码,文件在运行瞬间于内存中解压缩后执行。运行时压缩文件也是PE文件,内部含有原PE文件与解码程序。在程序的EP代码中执行解码程序,同时在内存中解压缩后执行。表14-1列出了运行时压缩与普通ZIP压缩的不同点。
表14-1普通压缩与运行时压缩的比较
项 目 普通压缩 运行时压缩
对象文件 所有文件 PE文件)exe、dll、sys)
压缩结果 压缩文件(zip、rar) PE文件)exe、dll、sys)
解压缩方式 使用专门解压缩程序 内部含有解码程序
文件是否可执行 本身不可执行 本身可执行
优点 可以对所有文件以高压缩率压缩 无须专门解压程序便可直接运行
缺点 若无专门解压缩软件则无法使用压缩文件 每次运行均需调用解码程序导致运行时间过长
与普通压缩器相比,运行时压缩器的一个明显不同是“PE文件的可运行性”。把普通PE文件创建成运行时压缩文件的实用程序称为“压缩器”(Packer),经反逆向)Anti-Reversing )技术特别处理的压缩器称为保护器(Protector )。
14.2.1压缩器
PE压缩器是指可执行文件的压缩器,准确一点应该称为“运行时压缩器”,它是PE文件的专
用压缩器。
#1.使用目的
•缩减PE文件的大小
文件尺寸小是其突出的优点之一,更便于网络传输与保存。 •隐藏PE文件内部代码与资源使用压缩器的另一个原因在于,它可以隐藏PE文件内的代码及资源(字符串、API名称字符串)等。压缩后的数据以难以辨识的二进制文件保存,从文件本身来看,这能有效隐藏内部代码与资源(当然解压缩后可以通过内存的Dump窗口查看)。 .
#2.使用现状
运行时压缩的概念早在DOS时代就岀现了,可当时并未广泛使用。因为那时的PC速度不怎么快,每次执行文件时,解压缩的过程会引起很大的系统开销。而现在的PC速度已经变得非常快,用户不能明显察觉运行时压缩文件与源文件在执行时间上的差别。因此,现在的实用程序、 “打补丁”文件、普通程序等都广泛应用运行时压缩。
#3.压缩器种类
下面介绍几个有名的压缩器。PE压缩器大致可分为两类:一类是单纯用于压缩普通PE文件的压缩器;另一类是对源文件进行较大变形、严重破坏PE头、意图稍嫌不纯的压缩器。这里说的“意图不纯的压缩器”是指专门用于恶意程序(如:Virtus、Trojan, Worm等)的压缩器。本书中出现的“纯粹与不纯粹”的划分标准基于我的经验以及www.virustotal.com网站诊断的结果。
目的纯粹的压缩器(未经VirusTotal诊断):UPX、ASPack等。
目的不纯的压缩器(经VirusTotal诊断):UPack、PESpin、NSAnti等
14.2.2保护器
PE保护器是一类保护PE文件免受代码逆向分析的实用程序。它们不像普通的压缩器一样仅对PE文件进行运行时压缩,而应用了多种防止代码逆向分析的技术(反调试、反模拟、代码混乱、多态代码、垃圾代码、调试器监视等)。这类保护器使压缩后的PE文件尺寸反而比源文件要大一些,调试起来非常难。
详细分析保护器需要丰富的逆向分析经验。当然,网络上提供了各种解除保护器的技巧,运气好的话,即便是新手也可能顺利找到源文件的OEP )Original Entry Point,原始入口点),但大多数情况没这么幸运。
#1.使用目的
- 防止破解
相信没入愿意自己编写的程序被非法破解并使用。此时使用保护器可有效保护PE文件。 - 保护代码与资源保护器不仅可以保护PE文件本身,还可在文件运行时保护进程内存,防止打开Dump窗口。因此,使用保护器可以比较安全地保护程序自身的代码与资源。
#2.使用现状
这类保护器大量应用于对破解很敏感的安全程序。比如安装在线游戏时会自动安装安全保护程序,游戏安全保护程序就是为了防止游戏“破解工具”运行的。
恶意的游戏破解者总是想方设法破解游戏的安全保护程序,因为破解成功后他们可以利用“游戏内核”获取金钱回报。所以,安全保护程序为了防止恶意破解而使用各种保护器来保护自己(不断更换保护器会让游戏破解者们发疯)。
另一方面,常见的恶性代码(Trojan, Worm)中也大量使用保护器来防止(或降低)杀毒软件的检测。有些保护器还能提供“多变的代码”,每次都会生成不同形态(但功能相同\的代码,这给病毒诊断带来很大困难。
#3.保护器种类
保护器种类多样,有公用程序、商业程序,还有专门供恶意代码使用的保护器。
商用保护器:ASProtect、Themida, SVKP等。
公用保护器:UltraProtect, Morphine等。
压缩器与保护器在代码逆向分析学习中占有非常重要的地位。开始分析PE文件时 必须先转到PE文件的OEP处才行,这就要求分析者拥有大量相关知识。此外,分析 压缩器与保护器本身也能学到很多,对提高逆向分析技术有很大帮助。保护器中使用的反调试技术往往水平非常高,需要具备关于CPU与OS的精深知识。
14.3 运行时压缩测试
本节将以notepad.exe为例进行运行时压缩测试。
本节示例使用的是Windows XP SP3中的notepad.exe程序。
但调试环境是Win7
我使用的压缩器为UPX,它操作简单、功能强大,且完全免费,受到很多入的青睐。
进入 http://upx.sourceforge.net 网站,下载 “Win32 Console Version” 后在命令行窗口运行,岀现图14-1所示的界面,显示岀UPX的使用说明。
把notepad.exe文件复制到工作文件夹后,使用如图14-2所示的命令参数,对notepad.exe文件进行运行时压缩。
从列出的压缩摘要中可以看到,压缩后的文件尺寸明显减小了(66560→48128 )。若使用ZIP压缩,则文件大小缩减为35231。也就是说,运行时的压缩率要比普通的ZIP压缩低一些,这是由 于其压缩后得到的是PE文件,需要添加PE头,并且还要放入解压缩代码。
比较 notepad.exe 与 notepad_upx.exe 文件
图14-3是从PE文件视角比较2个文件的示意图,很好地反映出了UPX压缩器的特点(选用不同类型的压缩器与选项,运行时压缩文件的形态也不相同)。
- PE头的大小一样(0〜400h)。
- 节区名称改变(“.text” → “UPX0”,“.data” → “UPX1”)
- 第一个节区的RawDataSize=0 )文件中的大小为0)。
- EP位于第二个节区(原notepad.exe的EP在第一个节区)。
- 资源节区).rsrc)大小几乎无变化。
需要引起注意的是,第一个节区(UPX0)的RawDataSize为0,即第一个节区在磁盘文件中是不存在的。UPX为何要创建这个空的节区呢?下面使用LordPE查看第一个节区头,如图14-4所示。
从VirtualSize值可以发现蛛丝马迹。第一个节区的VirtualSize值竟被设置为10000 )而SizeOfRawData值为0 )。这就是说,经过UPX压缩后的PE文件在运行瞬间将(文件中的)压缩的 代码解压到(内存中的)第一个节区。说得更详细一点,在磁盘文件中,解压缩代码与压缩的源代码都在第二个节区。文件运行时首先执行解压缩代码,把处于压缩状态的源代码解压到第一个节区。解压过程结束后即运行源文件的EP代码。
下一章将使用调试器调试实际的解压缩过程。
参考
《逆向工程核心原理》 第14章