Het HelloAssembly-project, voortgekomen uit Dave's Garage, heeft als doel om de kleinst mogelijke Windows-applicatie te bouwen zonder gebruik van compressie. Om als 'compleet' te worden beschouwd, moet de applicatie een Windows message loop draaien, een functionerende titelbalk hebben en gecentreerde tekst weergeven.
Het project bevat verschillende implementaties:
- TinyOriginal: Een geoptimaliseerde versie van de oorspronkelijke code.
- Lasse: Een versie die gebruikmaakt van shellcoding-technieken.
- Theron: De kleinste versie (383 bytes), die gebruikmaakt van een handmatig geschreven PE-header.
- QRCode: Een inactief experiment om de executable in een QR-code te embedden.
Vanwege de agressieve optimalisatietechnieken waarschuwt de documentatie dat virusscanners de bestanden onterecht als malware kunnen markeren. Daarnaast worden er gedetailleerde instructies gegeven voor het compileren en linken van de code via MASM32, Crinkler en Yasm.
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:
| Programma | Linker | Grootte in bytes |
Lasse\LittleWindows.asm | MASM32 | 1104 |
Lasse\LittleWindows.asm | Crinkler | 818 |
Theron\HelloWindows.asm | Yasm | 383 |
TinyOriginal\Tiny.asm | Crinkler | 540 |
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:
| Programma | Linker | Grootte in bytes |
Lasse\LittleWindows.asm | MASM32 | 1104 |
Lasse\LittleWindows.asm | Crinkler | 818 |
Theron\HelloWindows.asm | Yasm | 383 |
TinyOriginal\Tiny.asm | Crinkler | 540 |