打造最小的PE文件
打造最小的PE文件
打造最小的PE文件
(bkbll#cnhonker.net 2005-9-18 9:01)一. 前言.
最近在鼓捣windows下PE文件格式, 在达到既定目标后, 对生成最小PE文件产生了兴趣, 恰好
看到 watercloud(watercloud_at_xfocus.org)在近2年前写过一篇文章<<手工打造微型Win32 可执行文件
>>(http://www.xfocus.net/articles/200302/482.html), 我也依葫芦画瓢,打造
一下我认为最小的PE文件,由于是初次接触PE格式,如有差错,敬请斧正.
本文所有程序均在win2k sp4 cn和windows xp sp1 cn上测试通过.二. PE文件格式,结构
在winnt.h中,有PE各种结构的定义,这里就不一一列举, 仅将相关结构名列举如下:
IMAGE_DOS_HEADER,IMAGE_NT_HEADERS,IMAGE_F
ILE_HEADER,IMAGE_OPTIONAL_HEADER,
IMAGE_DATA_DIRECTORY,IMAGE_SECTION_HEADER,IMAGE_IMPORT_DESCRIPTOR
因为目标是打造最小的PE文件,所以仅用到一个IMPORT表.
PE整个文件框架大致如下:
| IMAGE_DOS_HEADER |
| Signature |
| IMAGE_NT_HEADER | -> | IMAGE_FILE_HEADER | |
IMAGE_OPTIONAL_HEADER | ->
| IMAGE_DATA_DIRECTORY |
......
| IMAGE_SECTION_HEADER |
........
| 代码段 | 三. 不一样的地方
watercloud 的PE已经比较小了,但还有几个地方我处理的不大一样:
1. WindowsXP 可以允许PE section为1个. 试验系统是xp sp1 cn
2. 文件对齐 windows是规定是2的幂, 当然可以比0x200小.
当然,除了上面2点以外,我还有用到一种比较巧妙的技巧.
运行PE文件,会在屏幕上打印Hello,world信息.
四. 打造过程. 1. 过程一:
最开始我们按照PE结构和顺序一步步填充结构,看能有多大:
我们先选取对齐值为0x20. 这里我们选
MAGE_OPTIONAL_HEADER.DataDirectory个数为16个