运行时压缩器

定义:针对于PE文件而言,可执行文件内部含有解压缩代码,文件在运行瞬间于内存中解压后执行。

运行时压缩文件也是PE文件,含有原PE文件和解码程序。在程序的EP代码中执行解码程序,在程序入口(EP)处执行解码程序,同时在内存中解压缩后执行。

1分类

分为压缩器和保护器。

1.1压缩器

目的:

减小PE文件大小,便于传输和保存

隐藏PE文件内部代码和资源

1.2保护器

目的:

保护PE文件免受代码逆向分析,应用多种防止代码逆向的技术(反调试,反模拟,代码混淆,多态代码,垃圾代码,调试器监视等)。压缩后比源文件大

防破解,保护代码与资源

2UPX

一种压缩器,比较主流

2.1压缩后特点

  • PE头和原来相同
  • 节区名称改变(.text变为UPX0,.data变为UPX1)
  • 第一个节区的RawDataSize=0(空节区)
  • EP在第二个节区
  • 资源节区大小几乎无变化
  • 入口点改变

2.2补充

为什么第一个节区是空节区

节区头中,第一个节区(UPX0)的RawDataSize为0,但是VirtualSize为10000.代码和数据都在UPX1中.UPX解压后,PE文件运行瞬间将解压的代码解压到第一个节区,解压结束后,运行源文件的EP代码.

入口点的变化

修改后,程序入口点EP到了UPX1的末端,而真实入口点OEP在EP之前。压缩后EP处指令为PUSHAD(和PUSHA相同),是将EAX~EDI的值保存到栈,然后为MOV ESI,x,x是UPX0的起始地址

2.3UPX额外执行的操作

  1. PUSHAD(和PUSHA相同),将EAX~EDI的值压入栈
  2. mov esi,x(或offset x),将x(一个地址,如果是offset则是x的地址)装入esi寄存器中,这是把UPX1的 起始地址放到ESI中
  3. LEA EDI,DWORD PTR DS:[ESI+y]或lea edi, [esi-y]这个的作用是把UPX0的起始地址放到EDI中
  4. PUSH EDI是把首地址入栈
  5. 解密循环:(从EDX中读取一个字节写入EDI??存疑)具体的解密算法按照加密来选择
  6. 解压缩循环:从ESI所指的UPX1中依次读值,经过LZMA解压缩填充到之前为NULL的EDI所指的UPX0中
  7. 重定位循环:把所有基于地址的位置无关代码(PIC)重定位,PIC是只使用相对位置的指令.如(CALL,JMP等),PIC在.data开头创建了全局偏移表(GOT)

然后会进行IAT的建立。最后再开始执行源代码。