我在 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
所以我在 OllyDbg 中打开了可执行文件,它似乎生成了很多不必要的东西。
因此,为了了解更多信息,我想直接将这个程序制作为十六进制,以保持尽可能小的大小!我进行了搜索,但没有找到任何教导如何手动创建 PE 可执行文件的内容。
如果有人能给我链接或解释如何做,我将不胜感激!
最佳答案
您可以通过修改链接器的节对齐选项来使程序变得更小,但结果可能不严格符合 Win32 PE 镜像的对齐规则。 EXE 可能无论如何都会运行,但某人 - 或者 Windows、WINE 或 ReactOS 的某些部分 - 可能实际上依赖于这些规则,这意味着您会对 Heisenbugs 持开放态度。
也就是说,在 What is the smallest possible Windows (PE) executable? 中您可以找到制作最小的可行 PE 所需的信息。从那里链接的相关页面是 Tiny PE ,其中 Alexander Sotirov 描述了制作尽可能小的 EXE 的技巧。就像覆盖标题结构、将它们折叠起来等等......
wiki article on the PE format有概述和很多有用的链接。
P.S.:如果将一些较小的可执行文件映射到内存比必要的更复杂,那么它们实际上可能比正确对齐的可执行文件加载慢几微秒。除此之外,对于一页大小(即大多数 Win32 系统上的 4 KB)的任何内容,加载时间不应该有任何明显的差异,除非您正在处理扇区小于 Windows 的软盘和其他介质页面大小。无论如何,与创建进程(地址空间等)和动态链接的开销相比,它都显得相形见绌。
关于c++ - 手动创建PE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26475653/