プログラミング
HelloAssembly 最小の完全なWindowsアプリケーション
HelloAssembly The smallest possible complete Windows application (github.com)
要約
このプロジェクトは、アセンブリ言語を使用して、可能な限り最小サイズの完全なWindowsアプリケーションを作成することを目的としています。リポジトリには、最適化されたバージョン、シェルコーディング技術を適用したバージョン、手動でPEヘッダーを記述したバージョンが含まれています。ウイルススキャナーが誤検知する可能性についても注意喚起がされており、現在の最小実行可能サイズはYasmを使用したバージョンで383バイトであることが報告されています。
全文翻訳
HelloAssembly 最小の完全なWindowsアプリケーション。
Dave's Garageのエピソード「Hello, Assembly! Retrocoding the World's Smallest Windows App in x86 ASM」およびフォローアップエピソード「C vs ASM: Making the World's SMALLEST Windows App」より。
はじめに
リポジトリ内のコード:
元のコードの最適化バージョンは「TinyOriginal」フォルダにあります。
シェルコーディングの戦術を適用したバージョンは「Lasse」フォルダにあります。
手動で記述したPEヘッダーを使用したバージョンは「Theron」フォルダにあります。
QRコードはデッドコードです。以前に実行可能ファイルがQRコードに埋め込まれていましたが、記念のために残されています。
このプロジェクトの目標は、圧縮なしで、以下の機能を備えた、可能な限り最小のアプリケーションを作成することです。
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になります。
MASM32とCrinkler
Crinklerは、数キロバイトのサイズの実行可能ファイルに特に焦点を当てた、Windows用の圧縮リンカーです。ツールのコピーがこのリポジトリのCrinklerディレクトリに含まれています。GitHubリポジトリからも入手できます。CrinklerにはWindows SDKのインストールが必要です。最高の(つまり最小の)結果は、Windows 10 SDKのバージョン10.0.20348.0で達成されています。これは、MicrosoftのウェブサイトにあるWindows SDKアーカイブページからダウンロードできます。
インストール後、それを使用してビルドできるアプリケーションのビルド手順は次のとおりです。
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プロジェクトのダウンロードページから入手できます。「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