什么是最小的Windows(PE)可执行文件?

作为编写编译器的先驱,我试图了解Windows(32位)便携式可执行文件格式。 特别是我希望看到一个裸机可执行文件,除了正确加载,运行和退出之外什么也不做。

我已经尝试编写和编译一个简单的C主函数,它除了生成的.exe是〜22KB,并且包含从KERNEL32.DLL(可能被LIBC用来设置环境,堆等)的许多import。 即使是DOS头可能会更小(它目前打印默认“这个程序不能在DOS模式下运行”)。

什么是最小的Windows 32位可执行文件的结构?

从源文件引用( 创建最小可能的PE可执行文件 ): 1

  • 最小的可能的PE文件:97个字节
  • Windows 2000上最小的PE文件:133字节
  • 最小的PE文件,通过WebDAV下载文件并执行它:133字节

由于PE文件格式的要求,上面的文件是最小的可能的PE文件,不能进一步改进。

这个结果是通过一些聪明的NASM技巧来实现的,例如删除链接到C ++ stdlib的步骤以及删除一些头字段和数据目录。

完整的源代码(如文章中所示,除了删除空白行之外,没有修改)如下:

 ; tiny.asm, copyright Alexander Sotirov BITS 32 ; ; MZ header ; The only two fields that matter are e_magic and e_lfanew mzhdr: dw "MZ" ; e_magic dw 0 ; e_cblp UNUSED ; PE signature pesig: dd "PE" ; e_cp, e_crlc UNUSED ; PE signature ; PE header pehdr: dw 0x014C ; e_cparhdr UNUSED ; Machine (Intel 386) dw 1 ; e_minalloc UNUSED ; NumberOfSections ; dd 0xC3582A6A ; e_maxalloc, e_ss UNUSED ; TimeDateStamp UNUSED ; Entry point start: push byte 42 pop eax ret codesize equ $ - start dd 0 ; e_sp, e_csum UNUSED ; PointerToSymbolTable UNUSED dd 0 ; e_ip, e_cs UNUSED ; NumberOfSymbols UNUSED dw sections-opthdr ; e_lsarlc UNUSED ; SizeOfOptionalHeader dw 0x103 ; e_ovno UNUSED ; Characteristics ; PE optional header ; The debug directory size at offset 0x94 from here must be 0 filealign equ 4 sectalign equ 4 ; must be 4 because of e_lfanew %define round(n, r) (((n+(r-1))/r)*r) opthdr: dw 0x10B ; e_res UNUSED ; Magic (PE32) db 8 ; MajorLinkerVersion UNUSED db 0 ; MinorLinkerVersion UNUSED ; PE code section sections: dd round(codesize, filealign) ; SizeOfCode UNUSED ; Name UNUSED dd 0 ; e_oemid, e_oeminfo UNUSED ; SizeOfInitializedData UNUSED dd codesize ; e_res2 UNUSED ; SizeOfUninitializedData UNUSED ; VirtualSize dd start ; AddressOfEntryPoint ; VirtualAddress dd codesize ; BaseOfCode UNUSED ; SizeOfRawData dd start ; BaseOfData UNUSED ; PointerToRawData dd 0x400000 ; ImageBase ; PointerToRelocations UNUSED dd sectalign ; e_lfanew ; SectionAlignment ; PointerToLinenumbers UNUSED dd filealign ; FileAlignment ; NumberOfRelocations, NumberOfLinenumbers UNUSED dw 4 ; MajorOperatingSystemVersion UNUSED ; Characteristics UNUSED dw 0 ; MinorOperatingSystemVersion UNUSED dw 0 ; MajorImageVersion UNUSED dw 0 ; MinorImageVersion UNUSED dw 4 ; MajorSubsystemVersion dw 0 ; MinorSubsystemVersion UNUSED dd 0 ; Win32VersionValue UNUSED dd round(hdrsize, sectalign)+round(codesize,sectalign) ; SizeOfImage dd round(hdrsize, filealign) ; SizeOfHeaders dd 0 ; CheckSum UNUSED db 2 ; Subsystem (Win32 GUI) hdrsize equ $ - $$ filesize equ $ - $$ 

对于GNU / Linux ELF可执行文件,请参阅文章“为Linux创建真正的ELF可执行文件的Whirlwind教程” 。 TL; DR1340字节,使用NASM

注意 :这个答案是J …在16年12月3日17:31的评论的扩展,为了保存链接中发现的信息(如果太死了)。


  1. 微小的PE ; 亚历山大·索蒂罗夫 查看15/11/2017 @ 17:50 SAST