UPack(Ultimate PE压缩器),是一种PE文件的运行时压缩器,特点是使用独特的方法对PE头进行变形。UPack会使许多的PE分析程序无法正常运行,因此很多恶意代码都是通过UPack进行压缩。
UPack PE文件头分析
使用UPack压缩notepad.exe:
UPack会直接压缩源文件而不会进行备份。压缩后的notepad文件更名为notepad_upack。
使用PEView尝试能否正常查看:
可以看到,新版的PEView也无法正常读取PE头信息,没有读取到NT头和节区头等信息。
使用Stud_PE工具查看PE头信息:
Stud_PE可以读取UPack压缩后的PE文件信息。
比较PE文件头:
用Win Hex打开正常的notepad.exe文件:
可以看到,这是典型的PE头格式,依次的顺序为IMAGE_DOS_HEADER、DOS Stub、IMAGE_NT_HEADERS、IMAGE_SECTION_HEADER。
用Win Hex打开使用UPack压缩后的notepad文件:
可以看到,MZ与PE签名离得很近,并且没有了DOS存根,出现了大量字符串,中间夹杂着一些代码。
分析UPack的PE文件头:
1、重叠文件头:
重叠文件头是压缩器常用的技法,可以把MZ文件头(IMAGE_DOS_HEADER)与PE文件头(IMAGE_NT_HEADERS)重叠在一起,可有效节约文件头的空间。
使用Stud_PE查看MZ文件头(Headers选项卡的Basic HEADERS tree view in hexeditor):
可以看到,该DOS头确实含有e_magic和e_lfanew两个重要成员,其余的成员对程序运行并不会产生影响。
根据PE文件格式规范,IMAGE_NT_HEADERS的起始位置是可变的,即由e_lfanew的值确定,在一般的PE文件中,e_lfanew = DOS头大小(40) + DOS存根大小(可变,VC++的为A0) = E0。这里可看到UPack中e_lfanew的值为10,其并不违反PE规范,使得DOS头与NT头得以整合到一起。
2、IMAGE_FILE_HEADER.SizeOfOptionalHeader
修改IMAGE_FILE_HEADER.SizeOfOptionalHeader的值,可以向文件头插入解码代码。
SizeOfOptionalHeader表示PE文件头中IMAGE_OPTIONAL_HEADER结构体的长度(E0)。UPack将该值修改为148: