手工打造微型win32可执行文件pe

上传人:子 文档编号:43096142 上传时间:2018-06-04 格式:DOC 页数:20 大小:23.38KB
返回 下载 相关 举报
手工打造微型win32可执行文件pe_第1页
第1页 / 共20页
手工打造微型win32可执行文件pe_第2页
第2页 / 共20页
手工打造微型win32可执行文件pe_第3页
第3页 / 共20页
手工打造微型win32可执行文件pe_第4页
第4页 / 共20页
手工打造微型win32可执行文件pe_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《手工打造微型win32可执行文件pe》由会员分享,可在线阅读,更多相关《手工打造微型win32可执行文件pe(20页珍藏版)》请在金锄头文库上搜索。

1、手工打造微型手工打造微型 Win32Win32 可执行文件可执行文件 PEPE手工打造微型 Win32 可执行文件创建时间:2003-02-12文章属性:原创文章来源:文章提交:watercloud (watercloud_at_xfocus.org)本文是我在学习 PE 文件格式时打造小型 PE 文件的学习历程的一个记录性文字,最终我的目标是完全手工打造一个小的 EXE 文件,第一个为 1024 字节,最终改造到 512 字节。废话不多说,开始工作:写个汇编程序:start:xor ebx,ebxjz tcalltjmp: pop eaxpush ebxpush eaxadd eax,7pu

2、sh eaxpush ebxpush ExitProcesspush MessageBoxArettcall: call tjmpdb “ExeDIY“,0db “Hello!“,0用 masm32 编译链接后生成 Hello.exe该 exe 为 2k 大小,为了把它大小裁减下来,用 UltraEdit 新建一个16 进制文件,然后我们参考原来的文件来手工创建一个新的 hello.exe。文件如附件最终为 1k 大小,已经在 WinXp/2k/Nt 上测试。我们作的主要工作是:1. 把 Dos Stub 去掉;按照新的信息构造文件头。2. 新文件对齐值为 0x200,在 0x200 处填入指

3、令信息。3. 把数据段去掉。 (但由于 WinXp 上 section 个数不能为一个,否则报不是 Win32 程序,所以仍然保留了数据段的 section 信息,但把它指向都改为了.text段)4. 由于数据段已经被去掉,需要将 Imports 相关信息搬入.text段 0x300 处。并从新计算输入表的地址和输入地址表的地址及 Import 结构相关链表和指针的地址。由于我们在 0x300处,执行时内存映像中地址为 0x401100,需要按照 0x1100为参照修改链表的各个值。在制作过程中发现文件对齐 WinXp 不能小于 0x200,否则为非法win32 程序,而 NT 可以时 32

4、字节倍数的对齐,如果只针对 NT 的话可以把文件构造的更小.虽然我们只用到 1 个段,但 pe 文件还是必须要有两个 section!修改 Import 相关地址后必须修改指令信息中的地址。因为每次对API 的引用都是在操作编译器提供的一个地址,该地址存放的时一条 jmp xxxx 的指令, xxxx 地址即为 Import的函数指针数组,Loader 在加载程序时会根据调用的 DLL 函数的具体加载地址来填充这里,但我们已经把这一地址移到了 0x401100,要作修正。整个文件 dump 出来的内容如下(WinHex 真是强大呀!) 。具体意义在后面描述。你可以在这里下载它:http:/ 0

5、 1 2 3 4 5 6 7 8 9 A B C D E F00000000 4D 5A D5 E2 C0 EF BB F9 B1 BE B6 BC C3 BB D3 D0 MZ 这里基本都没有00000010 D3 C3 2C 44 4F 53 B1 A3 C1 F4 B5 C4 CD B7 B2 BF 用,DOS 保留的头部00000020 D0 C5 CF A2 2C CE D2 C3 C7 B6 BC B2 BB D3 C3 2E 信息,我们都不用.00000030 D2 BB D6 B1 B5 BD D5 E2 C0 EF C0 B2 40 00 00 00 一直到这里啦.00000

6、040 50 45 00 00 4C 01 02 00 00 00 00 00 00 00 00 00 PE.L.00000050 00 00 00 00 E0 00 0F 01 0B 01 00 00 00 02 00 00 .?.00000060 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 .00000070 00 00 00 00 00 00 40 00 00 10 00 00 00 02 00 00 .00000080 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 .00000090

7、00 30 00 00 00 02 00 00 00 00 00 00 02 00 00 00 .0.000000A0 00 01 00 00 00 00 00 00 00 01 00 00 00 10 00 00 .000000B0 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 .000000C0 10 11 00 00 3C 00 00 00 00 00 00 00 00 00 00 00 . 40116c - 40117c - ExitProcessName - 40118a - Kernel32.dllFirst - 401120Imp

8、ort2Org - 401174 - 401198 - MessageBoxAName - 4011a6 - User32.dllFirst - 401128dll 加载后在内存 401120 处存放了 ExitProcess 的地址内存 401128 处存放了 MessageBoxA 的地址程序代码的 jmp 表就是:40002c : jmp 401120400032 : jmp 401128然后程序里调用 API 就使用了 40002c 和 400032 这两个地址对应文件最终被加载了两分,一个在 400000 系统自身要使用的表结构,但我们同时把执行代码也放到了这里,并修改了程序入口指向

9、这里.另一个在 401000 处,这里我们主要利用了这个地址除了了Import 表.本来想使用 400000 处的导入表信息,但我把相关指针修改为 000后系统报非法 win32 程序,就没有办法了.文件布局如下:00-40 : dos 头,但我们把代码也放到这里了.40-58 : PE-File-Header58-C8 : PE-Option-Header,其中 B8-C8 为 DataDirectory (ExportDirectory 和ImportDirectory)我们把 DataDirectory 已经减到不能在小了,无论如何要ImportDirectory.c8-F0 : .te

10、xt Section-HeaderF0-118 : .rdata Section-Header (没有用处的节信息,但系统不允许只有一个节只好装模作样放一个.)好了真正的 PE 头部信息结束,后面本来是 文件对齐的填充,我们利用这里存放ImportTable.120-1B0: Import-Table而且从中可以看到,就算把 DataDirectory 都去掉(WinXp 去掉后会被认为非法 Win32 程序),把 Section 减到只有1 个(Winxp 最低也要两个才是合法文件) 文件头部信息也需要 0x88个字节. 如果支持100 文件对齐,并且不使用Import 表那么可以将 PE 文件做到 256 字节 ,但对于让 xp 也能运行512 字节应该是极限了.最后提供一个 512 字节的小工具:锁屏(Win2k/Xp)http:/ 英文 作者不详http:/ 文件格式分析.pdf 中文 作者不详MicroSoft MSDN本文只是一个记录性文字,且本人水平很差,望大家斧正。watercloud2002 - 12 - 21

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号