《逆核》02-运行时压缩器01
运行时压缩器
定义:针对于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额外执行的操作
- PUSHAD(和PUSHA相同),将EAX~EDI的值压入栈
- mov esi,x(或offset x),将x(一个地址,如果是offset则是x的地址)装入esi寄存器中,这是把UPX1的 起始地址放到ESI中
- LEA EDI,DWORD PTR DS:[ESI+y]或lea edi, [esi-y]这个的作用是把UPX0的起始地址放到EDI中
- PUSH EDI是把首地址入栈
- 解密循环:(从EDX中读取一个字节写入EDI??存疑)具体的解密算法按照加密来选择
- 解压缩循环:从ESI所指的UPX1中依次读值,经过LZMA解压缩填充到之前为NULL的EDI所指的UPX0中
- 重定位循环:把所有
基于地址的位置无关代码
(PIC)重定位,PIC是只使用相对位置的指令.如(CALL,JMP等),PIC在.data开头创建了全局偏移表(GOT)
然后会进行IAT的建立。最后再开始执行源代码。
评论