HelloAssembly:最小的完整Windows应用程序
摘要
该项目旨在使用汇编语言创建最小可能的完整Windows应用程序,并提供优化版本和详细的构建说明。
查看缓存全文
缓存时间: 2026/08/25 13:55
PlummersSoftwareLLC/HelloAssembly
来源:https://github.com/PlummersSoftwareLLC/HelloAssembly
HelloAssembly
可能存在的最小完整 Windows 应用程序。
出自 Dave’s Garage 的节目:“Hello, Assembly! Retrocoding the World’s Smallest Windows App in x86 ASM” (https://youtu.be/b0zxIfJJLAY)
以及后续节目 “C vs ASM: Making the World’s SMALLEST Windows App” (https://youtu.be/-Vw-ONPfaFk):
C vs ASM: Making the World’s SMALLEST Windows App (https://youtu.be/-Vw-ONPfaFk)
介绍
仓库中的代码:
- 原始代码的优化版本位于文件夹 “TinyOriginal”
- 应用 shell 编码技巧的版本位于文件夹 “Lasse”
- 使用手写 PE 头的版本位于文件夹 “Theron”
- QRCode 是已废弃的代码,曾是将 exe 嵌入二维码,仅保留以供参考
本项目的目标是在不使用压缩的情况下,创建尽可能小的应用程序,并具备以下功能:
- 运行 Windows 消息循环
- 具备标题栏、最小化、最大化和关闭按钮,且所有功能正常
- 具备系统菜单(功能相同)
- 绘制背景并在中央居中显示部分文字,内容不小于 “Dave’s Tiny App”
请保持代码可读性,并在注释中说明你的操作!代码越小越好!
关于病毒扫描的说明
当前 Lasse 目录中代码嵌入的优化,以及 Crinkler 工具(若使用)普遍应用的优化,相当激进,其策略类似于某些恶意软件的手段。因此,你的病毒扫描器可能会将由此源代码构建的可执行文件标记为“疑似恶意软件“。这可能导致无法启动文件,甚至可能被隔离。
根据你使用的防病毒解决方案,你可能能够将这些可执行文件加入白名单/排除列表,以恢复并使其正常工作(F-Secure SAFE 已知有此情况)。也可能需要暂时完全禁用病毒扫描器(Microsoft Defender 有此情况)。
请注意:
- 是否决定禁用病毒扫描器完全由你负责。
- 如果你暂时禁用了病毒扫描器,我们强烈建议在测试完由此仓库代码构建的可执行文件后立即重新启用它。
- 虽然我们确实承诺此仓库不包含任何恶意代码,但我们无法保证从其他来源获取的任何代码或可执行文件(例如,假定是此仓库应用程序的构建版本)也同样安全。
- 如果病毒扫描器在你尝试运行由此仓库源代码生成的可执行文件时介入,而你对(部分)禁用病毒扫描器感到不适,那就不要禁用。我们完全理解,也绝不会因此对你有意见。 :)
构建说明
纯 MASM32
Lasse 目录中的代码可以使用纯 MASM32 11.0 构建,可从多个来源获取。
使用它的构建说明:
ml /coff LittleWindows.asm /link /merge:.rdata=.text /merge:.data=.text /align:4 /subsystem:windows LittleWindows.obj
生成的可执行文件名为 LittleWindows.exe。
使用 Crinkler 的 MASM32
Crinkler 是一个专为仅几 KB 大小的可执行文件设计的压缩链接器。
此工具副本已包含在本仓库的 Crinkler 目录中。
也可从其 GitHub 仓库 (https://github.com/runestubbe/Crinkler) 获取。
Crinkler 需要安装 Windows SDK。
使用 Windows 10 SDK 版本 10.0.20348.0 可获得最佳(即最小)结果。
它以及其它版本可从 Microsoft 网站的 Windows SDK 归档页面 (https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/) 下载。
安装后,使用它构建应用程序的说明如下:
- Lasse 目录中的代码:
ml /c /coff LittleWindows.asm
crinkler.exe /NODEFAULTLIB /ENTRY:start /SUBSYSTEM:WINDOWS /TINYHEADER /NOINITIALIZERS /UNSAFEIMPORT /ORDERTRIES:1000 /TINYIMPORT /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x86" kernel32.lib LittleWindows.obj
生成的可执行文件名为 out.exe。
- TinyOriginal 目录中的代码:
ml /c /coff /IC:\masm32\include Tiny.asm
crinkler.exe /ENTRY:MainEntry /SUBSYSTEM:WINDOWS /TINYHEADER /NOINITIALIZERS /UNSAFEIMPORT /ORDERTRIES:2000 /TINYIMPORT /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\Lib\10.0.20348.0\um\x86" kernel32.lib user32.lib gdi32.lib Tiny.obj /OUT:tiny.exe
生成的可执行文件名为 tiny.exe。
Yasm
Theron 目录中的代码必须使用 Yasm 构建,Yasm 是在 “new” BSD 许可证下对 NASM 汇编器的重写。
可从 Yasm 项目下载页面 (https://yasm.tortall.net/Download.html) 获取;请选择 “for general use” 版本。
假定汇编器已重命名为 yasm.exe。
使用它的构建说明:
yasm -fbin -o HelloWindows.exe HelloWindows.asm
生成的可执行文件名为 HelloWindows.exe。
当前大小
截至 2023 年 3 月 11 日,已知最小的可正常工作的可执行文件大小如下:
| 程序 | 链接器 | 大小(字节) |
|---|---|---|
Lasse\LittleWindows.asm | MASM32 | 1104 |
Lasse\LittleWindows.asm | Crinkler | 818 |
Theron\HelloWindows.asm | Yasm | 383 |
TinyOriginal\Tiny.asm | Crinkler | 540 |
相似文章
为Linux创建极小的ELF可执行文件(或者,“大小就是一切”)
本教程演示了如何使用汇编代码和优化技术在Linux上创建最小的ELF可执行文件,以减小文件大小。
前微软开发者打造2.5KB记事本克隆版
前微软开发者Dave Plummer用汇编语言构建了TinyRetroPad,一个仅有2.5KB的记事本克隆,复制了Windows XP记事本的功能,不含AI特性,并批评了现代记事本的臃肿。
用 x86_64 汇编写成的 Linux 桌面
一位开发者借助 Claude Code,用纯 x86_64 汇编重建了完整的 Linux 桌面栈——从 shell、终端、窗口管理器到各种工具,实现微秒级启动,并延长数小时续航。
Tiny-Lua-Compiler: 可能是有史以来最小的 Lua 编译器
Tiny-Lua-Compiler 是一个用于教学的、自举的 Lua 5.1 编译器和虚拟机,完全用纯 Lua 编写。其设计目标是体积足够小以便于研究,同时又功能完备到足以处理真实的语言特性。
用 aarch64 汇编构建 Web 服务器,给我的生活(缺乏)意义
本文介绍了 'ymawky',一个完全用 aarch64 汇编为 macOS 编写的最小 HTTP Web 服务器,使用原始系统调用而无需 libc 包装器,以探索底层系统机制。