第13章 运行时压缩

1. 数据压缩

经过压缩的文件若能100%恢复,就称该压缩为”无损压缩”(Lossless Data Compression) ;若不能恢复原状,称之为”有损压缩”(Loss Data Compression).

1.1 无损压缩

它们最根本的压缩理念也是Run-Lenght, Lempel-Ziv, Huffman, 然后应有了一些各自特有的技术(压缩率,压缩/解压时间).

1.2 有损压缩

有损压缩允许压缩文件(数据)时损失一定信息,以此换取高压缩率.

2. 运行时压缩器

项目 普通压缩 运行时压缩
对象文件 所有文件 PE文件(exe,dll,sys)
压缩结果 压缩文件(zip,rar) PE文件(exe,dll,sys)
解压缩方式 使用专门解压缩程序 内部含有解码程序
文件是否可执行 本身不可执行 本身可执行
优点 可以对所有文件以高压缩率压缩 无须专门解压缩程序便可直接运行
缺点 若无专门解压缩软件则无法使用压缩文件 每次运行均需要解码程序导致运行时间过长

把普通PE文件创建后运行时压缩文件的实用程序称为”压缩器(Packer)”.经反逆向(Anti-Reversing)技术特别处理的压缩器称为保护器(Protector).

2.1 压缩器

PE压缩器是指可执行文件的压缩器,称为”运行时压缩器”,它是PE文件的专用压缩器.

  • 实用目的
    压缩PE文件的大小,便于网络传输保存
    隐藏PE文件内部代码与资源
    压缩后的数据以难以辨认的二进制保存,从文件本身来看,还能有效隐藏内部代码与资源.

  • 使用现状

现状的实用程序,”打补丁”文件,普通程序都广泛应用运行时压缩.

  • 压缩器种类
    PE压缩器大致分两类 : 一类是单纯用于压缩普通PE文件的压缩器;另一类是对源文件进行较大变形,严重破坏PE头的压缩器.

2.2 保护器

不但像普通压缩器一样仅对PE文件进行运行时压缩,而应用了多种防止代码逆向分析的技术.

  • 使用目的
    防止破解,保护代码与资源.

  • 使用现状
    安全保护程序为了防止恶意破解而使用各种保护器来保护自己,常见的恶性代码中也大量使用保护器来防止(或减少)杀毒软件的检测.有些保护器还提供”多变的代码”,每次都会生成不同形态(但功能相同)的代码,这给病毒诊断带来很大的困难.

  • 保护器种类
    保护器种类多样,有公用程序,商业程序,还有专门提供而已代码使用的保护器.

3. 运行时压缩测试

用压缩器UPX压缩notepad.exe,比较了下文件状态.

比较notepad.exe与notepad_upx.exe

比较notepad.exe与notepad_upx.exe

  • PE头的大小一样(0~400h)
  • 节区名称改变(“.text->”upx0”,”.data”->”upx1”).
  • 第一个节区的RawDataSize=0(文件中的大小为0).
  • EP位于第二个节区(原notepad.exe的EP在第一个节区).
  • 资源节区(.rsrc)大小几乎无变化.

我们用PEView查看第一个节区头,如图.

PEView

从VirtualSize值可以发现问题,第一个节区的VirtualSize值竟被设置为10000(而SizeOFRawData值为0).也就是说,经过UPX压缩后的PE文件在运行瞬间将(文件中)压缩的代码解压到(内存中的)第一个节区.