作为编写编译器的先驱,我正在尝试理解Windows(32位)可移植可执行格式.特别是我想看一个简单的可执行文件的例子,除了正确加载,运行和退出之外什么都不做.
我已经尝试编写和编译一个简单的C main函数,除了生成的.exe是〜22KB并且包含许多来自KERNEL32.DLL的导入(可能由LIBC用于设置环境,堆等).甚至DOS标题也可能更小(它当前打印默认的'此程序无法在DOS模式下运行').
最小的Windows 32位可执行文件的结构是什么?
引用源(创建最小的PE可执行文件): 1
最小的PE文件:97个字节
Windows 2000上最小的PE文件:133个字节
通过WebDAV下载并执行文件的最小PE文件:133字节
由于PE文件格式的要求,以上文件是可能的最小PE文件,无法进一步改进。
通过一些巧妙的NASM技巧获得了此结果,例如删除了链接到C的步骤stdlib
以及删除了许多头字段和数据目录。
完整的源代码如下。它实际上与具有以下修改的文章相同:
删除空白行
sectalign
标签已重命名为sect_align
。自从编写此汇编代码以来,它已sectalign
成为NASM关键字。重命名它以避免警告和错误。
代码如下:
; tiny97.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 sect_align 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 sect_align ; 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, sect_align)+round(codesize,sect_align) ; SizeOfImage dd round(hdrsize, filealign) ; SizeOfHeaders dd 0 ; CheckSum UNUSED db 2 ; Subsystem (Win32 GUI) hdrsize equ $ - $$ filesize equ $ - $$
要构建为可执行文件,请使用:
nasm -f bin tiny97.asm -o tiny97.exe
对于GNU / Linux ELF可执行文件,请参见文章“关于为Linux创建真正的TeenF ELF可执行文件的旋风教程”。TL; DR:1340
字节,使用NASM
注意:此答案是J ...在16年12月3日17:31的注释的扩展,目的是保留在链接中找到的信息(以防万一也死了)。
小PE ; 亚历山大·索提洛夫(Alexander Sotirov);查看15/11/2017 @ 17:50 SAST