手动创建PE

Jor*_*ssi 0 c c++ windows assembly winapi

我在 Windows 7 中使用 nasm 制作了一个简单的 MessageBox,我对生成的文件的大小有点不满意:2.51 kb。

extern MessageBoxA
extern ExitProcess

import MessageBoxA user32.dll 
import ExitProcess kernel32.dll

section .text use32 

..start: 

push 0
push sCapt
push sText
push 0
call [MessageBoxA]


push 0
call [ExitProcess] 

section .data 

sCapt db 'test', 0
sText db 'test2', 0
Run Code Online (Sandbox Code Playgroud)

所以我在 OllyDbg 中打开了可执行文件,似乎它生成了很多不必要的东西。

奥利德布格

因此,为了了解更多信息,我想直接以十六进制形式制作该程序,以保持尽可能小的大小!我进行了搜索,但没有找到任何教导如何手动创建 PE 可执行文件的内容。

如果有人能给我链接或解释如何做,我将不胜感激!

Dar*_*zka 5

您可以通过修改链接器的节对齐选项来使程序变得更小,但结果可能不严格符合 Win32 PE 映像的对齐规则。EXE 可能无论如何都会运行,但某人 - 或者 Windows、WINE 或 ReactOS 的某些部分 - 可能实际上依赖于这些规则,这意味着您会对 Heisenbugs 持开放态度。

也就是说,最小的 Windows (PE) 可执行文件是什么?您可以找到制作最小的可行 PE 所需的信息。从那里链接的相关页面是Tiny PE,其中 Alexander Sotirov 描述了制作尽可能小的 EXE 的技巧。就像覆盖标题结构、将它们折叠起来等等......

关于 PE 格式的 wiki 文章有概述和相当多有用的链接。

PS:如果将一些较小的可执行文件映射到内存比必要的更复杂,那么它们实际上可能比正确对齐的可执行文件加载慢几微秒。除此之外,对于一页大小(即大多数 Win32 系统上的 4 KB)的任何内容,加载时间不应该有任何明显的差异,除非您正在处理扇区小于 Windows 的软盘和其他介质页面大小。无论如何,与创建进程(地址空间等)和动态链接的开销相比,它都显得相形见绌。