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 可执行文件的内容。
如果有人能给我链接或解释如何做,我将不胜感激!
您可以通过修改链接器的节对齐选项来使程序变得更小,但结果可能不严格符合 Win32 PE 映像的对齐规则。EXE 可能无论如何都会运行,但某人 - 或者 Windows、WINE 或 ReactOS 的某些部分 - 可能实际上依赖于这些规则,这意味着您会对 Heisenbugs 持开放态度。
也就是说,最小的 Windows (PE) 可执行文件是什么?您可以找到制作最小的可行 PE 所需的信息。从那里链接的相关页面是Tiny PE,其中 Alexander Sotirov 描述了制作尽可能小的 EXE 的技巧。就像覆盖标题结构、将它们折叠起来等等......
关于 PE 格式的 wiki 文章有概述和相当多有用的链接。
PS:如果将一些较小的可执行文件映射到内存比必要的更复杂,那么它们实际上可能比正确对齐的可执行文件加载慢几微秒。除此之外,对于一页大小(即大多数 Win32 系统上的 4 KB)的任何内容,加载时间不应该有任何明显的差异,除非您正在处理扇区小于 Windows 的软盘和其他介质页面大小。无论如何,与创建进程(地址空间等)和动态链接的开销相比,它都显得相形见绌。