PE文件-最小化

对TinyPE[1]的简单总结

  • 在windows2000上的最小PE文件为: 133bytes

0x00 压缩MZ文件头

DOS文件头中只有两个区域需要用,e_magic("MZ")和e_lfanew(PE头偏移), 且MS-sub是不需要的,可以整个删除。先将MZ头的剩余位填充为0。但是MZ头是不能删除的。 MZ头的大小是0x3c
通过修改e_lfanew的值小于0x3c使pe头从MZ头的内部开始。
由于需要MZ头和PE头对齐,所以最小的PE头开始位置是0x04
e_lfanew和sectalign位于相同的偏移,所以值都为0x04

0x01 压缩PE文件头

修改PE文件头中的文件对齐字段为1,这样节不需要从0x200开始。
通过将NumberOfRvaAndSizes设置为0可以将数据目录从可选文件头删除。

0x02 压缩PE节表头

节表开始的计算方式是可选文件头开始加上可选文件头大小。
通过将可选文件头大小字段设置的小于实际大小,让节表头重叠在可选文件头中。

0x03 压缩代码节

将code代码放在未使用的PE头字段中,如时间戳。

0x04 压缩引入文件节

删除导入查找表,是IAT的副本。然后还可以折叠IAT和DLL名称,将其分别放在节表名称和PE可选头的末尾的未使用字节处 ## 参考
  1. http://www.phreedom.org/research/tinype/ ↩︎

PE文件-最小化
https://jfsas.github.io/2024/10/15/PE文件-最小化/
作者
JFSAS
发布于
2024年10月15日
许可协议