HelloAssembly: De kleinste complete Windows-applicatie

Inleiding

In deze repository vindt u verschillende versies van de code:

  • TinyOriginal: Een geoptimaliseerde versie van de oorspronkelijke code.
  • Lasse: Een versie waarin shellcoding-technieken zijn toegepast.
  • Theron: Een versie die gebruikmaakt van een handmatig geschreven PE-header.
  • QRCode: Deze code is niet meer actief; het was een experiment om het executable-bestand in een QR-code in te bedden en is bewaard voor de volledigheid.

Projectdoelen

Het doel van dit project is om de kleinst mogelijke applicatie te maken, zonder gebruik van compressie, die aan de volgende eisen voldoet:

  • Het draait een Windows message loop.
  • Het heeft een titelbalk met werkende knoppen voor minimaliseren, maximaliseren en sluiten.
  • Het beschikt over een systeemmenu met dezelfde functionaliteiten.
  • Het tekent een achtergrond met gecentreerde tekst in het midden, die gelijk aan of groter is dan "Dave's Tiny App".

De code is geschreven om leesbaar te blijven, met commentaren die uitleggen wat er gebeurt. Hoe kleiner het resultaat, hoe beter.

Waarschuwing over virusscanners

De optimalisaties in de huidige code (in de directory Lasse) en de technieken die algemeen door Crinkler worden toegepast, zijn zeer agressief. Deze strategieën vertonen gelijkenissen met methoden die door bepaalde soorten malware worden gebruikt.

Hierdoor kan het voorkomen dat uw virusscanner de executables die u vanuit de broncode bouwt, markeert als "vermoede malware". Dit kan ertoe leiden dat de programma's niet kunnen worden gestart of in quarantaine worden geplaatst. Afhankelijk van uw antivirusoplossing kunt u de executables mogelijk op een witte lijst zetten of uitsluiten (dit is bekend bij F-Secure SAFE). In sommige gevallen is het nodig om de virusscanner tijdelijk volledig uit te schakelen (waargenomen bij Microsoft Defender).

Let op:

  • Het is volledig uw eigen verantwoordelijkheid om te beslissen of u uw virusscanner uitschakelt.
  • Mocht u de scanner tijdelijk uitschakelen, dan raden we sterk aan deze direct na het testen van de executables weer in te schakelen.
  • Hoewel we garanderen dat deze repository geen kwaadaardige code bevat, kunnen we dit niet garanderen voor code of executables die u via andere bronnen verkrijgt.
  • Indien u zich niet prettig voelt bij het (gedeeltelijk) uitschakelen van uw virusscanner, raden we u aan de executables niet uit te voeren.

Instructies voor het bouwen

Plain MASM32

De code in de directory Lasse kan worden gebouwd met MASM32 11.0. Gebruik hiervoor de volgende instructie:

ml /coff LittleWindows.asm /link /merge:.rdata=.text /merge:.data=.text /align:4 /subsystem:windows LittleWindows.obj

Het resulterende bestand wordt LittleWindows.exe genoemd.

MASM32 met Crinkler

Crinkler is een comprimerende linker voor Windows, specifiek gericht op executables van enkele kilobytes. Een kopie van dit hulpmiddel is inbegrepen in de directory Crinkler van deze repository, maar het is ook beschikbaar via het eigen GitHub-repository van Crinkler.

Crinkler vereist dat de Windows SDK is geïnstalleerd. De kleinste resultaten werden behaald met versie 10.0.20348.0 van de Windows 10 SDK.

Voor code in de directory 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

Het resulterende bestand wordt out.exe genoemd.

Voor code in de directory 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

Het resulterende bestand wordt tiny.exe genoemd.

Yasm

De code in de directory Theron moet worden gebouwd met Yasm (een rewrite van de NASM-assembler onder de BSD-licentie). Er wordt vanuit gegaan dat de assembler is hernoemd naar yasm.exe.

yasm -fbin -o HelloWindows.exe HelloWindows.asm

Het resulterende bestand wordt HelloWindows.exe genoemd.

Huidige bestandsgroottes

Per 11 maart 2023 zijn dit de kleinste bekende werkende executables:

ProgrammaLinkerGrootte in bytes
Lasse\LittleWindows.asmMASM321104
Lasse\LittleWindows.asmCrinkler818
Theron\HelloWindows.asmYasm383
TinyOriginal\Tiny.asmCrinkler540