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可选头的末尾的未使用字节处 ## 参考- http://www.phreedom.org/research/tinype/ ↩︎
PE文件-最小化
https://jfsas.github.io/2024/10/15/PE文件-最小化/