我在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可执行文件。
如果有人可以给我链接或解释怎么做,我将不胜感激!
答案 0 :(得分:4)
您可以通过摆弄链接器的部分对齐选项来使程序变小,但结果可能不会严格符合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页面大小。无论如何,创建流程(地址空间等)和动态链接的开销肯定会相形见绌。