当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《什么是最小的Windows(PE)可执行文件?》经验,为你挑选了1个好方法。

作为编写编译器的先驱,我正在尝试理解Windows(32位)可移植可执行格式.特别是我想看一个简单的可执行文件的例子,除了正确加载,运行和退出之外什么都不做.

我已经尝试编写和编译一个简单的C main函数,除了生成的.exe是〜22KB并且包含许多来自KERNEL32.DLL的导入(可能由LIBC用于设置环境,堆等).甚至DOS标题也可能更小(它当前打印默认的'此程序无法在DOS模式下运行').

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



1> Agi Hammerth..:

引用源(创建最小的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; DR1340字节,使用NASM

注意:此答案是J ...在16年12月3日17:31的注释的扩展,目的是保留在链接中找到的信息(以防万一也死了)。


    小PE ; 亚历山大·索提洛夫(Alexander Sotirov);查看15/11/2017 @ 17:50 SAST

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有