
AsmLdrは、x64アセンブリ言語で実装された高度なシェルコードローダーで、Windows x64環境向けに設計されています。その主な目的は、暗号化されたペイロードを実行しながら、高度なアンチウイルスソフトウェア、エンドポイント検出および応答(EDR)システム、サンドボックス、デバッガによる検出を最小限に抑えることです。これは、モジュール、API、システムコールを実行時に動的に解決することで実現され、インポートテーブルやハードコードされたアドレスなどの静的依存関係を排除します。このアプローチにより、検出プロファイルの低いコンパクトなバイナリが作成されます。
ローダーはモジュールストンピングを使用して既存DLLの実行可能セクションにシェルコードを配置し、ペイロードをメモリ上で復号化し、スタックスプーフィングを伴う間接システムコールを介して実行します。アンチデバッグ対策、通常のアプリケーションパターンを模倣するタイミング調整、Windowsイベントトレーシング(ETW)のバイパスなどの回避機能が含まれます。これらの機能により、レッドチーム活動やセキュリティ研究のためのツールとなっています。
倫理的免責事項: このプロジェクトは教育および研究目的のみを対象としています。PEBトラバーサル、エクスポートテーブルの解析、syscallのアンフッキング、メモリ保護の操作といったWindowsの低レベルの内部構造を示すものです。管理された環境(例: VM)でのみ使用してください。悪意のある活動への悪用は違法かつ非倫理的です。著者は悪用による責任を負いません。
AsmLdrは、ステルス性の高いペイロード実行と回避のためのさまざまな機能を提供します。各機能について、その役割と利点を中心に以下に説明します。
PEBトラバーサルによるモジュール解決: ローダーはPEBのモジュールチェーンを辿って実行中のモジュールを列挙します。Unicode比較でモジュール名を照合し、目的のDLLのベースアドレスを見つけて返します。この方法は標準の読み込み関数をバイパスし、傍受のリスクを低減します。
エクスポートテーブルからのAPI解決: ローダーはDLLのエクスポートディレクトリを調べて関数を特定します。ハッシュを使用するか、必要に応じて長さ検証付きの直接的な名前チェックでAPIを照合し、類似した関数名の混同を防ぎます。これにより、事前にリンクされたインポートに依存せずに関数のアドレスを取得できます。
アンチデバッグ保護: ローダーは複数のチェックを通じてデバッグを検出し、いずれかが解析を示す場合はクリーンに終了します。
解析耐性のためのジャンクコード生成: ローダーは重要でない操作のシーケンスを実行して逆アセンブル上に紛らわしいパターンを生成し、ランタイム効率に影響を与えずに静的解析を困難にします。
タイミングと挙動の正規化: ローダーはシステム速度を測定して通常のアプリケーションパターンに一致する模擬ワークロードを実行し、正規プロセスに紛れ込むのに役立てます。また、重要なアクションの前に短い一時停止を行い、実行タイミングを正規化します。
ETWロギングのバイパス: ローダーはETWロギングAPIにハードウェアブレークポイントを設定し、イベントログ呼び出しをインターセプトしてスキップすることで、システムログへの痕跡を防ぎます。
多層アンフッキング: ローダーは、関数を直接確認するか、フックされている場合は近くのコードをスキャンするか、ntdll内のパターンを数えて番号を推定し、既知の例外を調整することで、有効なシステムコール番号(SSN)を動的に取得します。
使用される技術:
間接システムコールとスタックスプーフィング: ローダーはntdll内でシステムコール用のクリーンなコードパスを見つけ、最大32の操作をチェーンしてコールスタックを隠し、トレースを回避します。完了後は元の状態を復元します。
DLLホローウィング: ローダーは対象DLLを取り込み、コードセクションへの書き込みを一時的に許可し、暗号化されたシェルコードを挿入して復号化し、保護を実行専用にリセットします。
メモリ内復号化: ローダーは、注入したメモリ内で繰り返し鍵パターンを直接適用してシェルコードを復号化します。
ユーティリティ関数: ローダーには、文字列長の測定、文字列の比較(標準またはワイド文字)、ルックアップ用の名前のハッシュ化、メモリポインタの検証、タイミング制御用のタイムスタンプ読み取りを行うユーティリティが含まれています。
Pythonスクリプトgenerate.pyは、生のシェルコードファイルを暗号化します。アライメント用のパディングを追加し、キーを作成または使用して、各バイトを繰り返し周期でキーとXORします。出力ファイルshellcode.asmは、サイズ、暗号化データとキーの配列、および実行時にデータをロードするルーチンを定義します。ローダーの復号化はこのプロセスをメモリ上で踏襲します。キーが長いほど待機時間が長くなることに注意してください。
生のシェルコードバイナリ(例: payload.bin)を準備します。python generate.py payload.bin [optional_key] を実行して shellcode.asm を生成します。
szDllName(evader.asm内のUnicode hexワード)を変更して、urlmon.dllなどの代替DLLを指定します。str_hashロジックを使用して新しいAPIのDJB2ハッシュを再計算します。デバッグ時はマクロ(例: KILL_DEBUGGERS)をコメントアウトします。
AsmLdrはWindows 10/11 x64向けに最適化されています。カーネル更新によりオフセット(例: PEB+0x18)やNTDLLパターン(例: 0xb8d18b4c)が変わる可能性があるため、検証が必要です。エラー処理はNTSTATUS戻り値(例: <0は失敗)に依存しており、組み込みのロギングはありません。ジャンク操作や偽装操作はCPUサイクルを消費するため、リソース制約のあるシステムではリソースモニタに警告される可能性があります。管理された環境でのみ使用してください。