
EXE、DLL、.NET、VBScript、JScript のインメモリ実行を目的としたポリモーフィックシェルコードジェネレーターで、出力ごと・ビルドごとのランダム化により検知回避とシグネチャ耐性を実現します。
Donut の回避型いとこ。
Fritter は、TheWover と Odzhan の Donut シェルコードジェネレーターを大幅に改変したフォークです。VBScript、JScript、EXE、DLL、.NET アセンブリのインメモリ実行用の位置非依存シェルコードを生成し、回避とシグネチャ耐性に重点を置いています。コードベースは x64 専用です。
たくさん。 Fritter は、あまり必要とされない機能を取り除き、長年にわたってシグネチャ化されてきた内部を置き換えています。暗号化、圧縮、ハッシュ、API 解決レイヤーは、他の多くの領域とともにすべて再設計されています。
多態性と回避が設計目標です。すべての出力は一意であり、ツール自体のすべてのビルドも一意です。2 つの異なるレイヤーがあります。
出力ごとのランダム化: fritter が呼び出されるたびに適用されます。エントリスタブ、多態的デコーダ、暗号化キー、および生成されたシェルコード内の多くの構造要素は、PIC をビルドするたびに新しいエントロピーから再生成されます。
ビルドごとのランダム化: fritter 自体がコンパイルされるたびに適用されます。暗号とハッシュのローテーション定数、API 解決テーブルのレイアウト、シム側の文字列スクランブリング、PEB ウォークの方向、実行後ワイプパターン、およびローダーとシム内のいくつかの構造軸は、コンパイル時に固定されます。
実行時、Fritter はローダーの実行可能フットプリントを最小限に抑えます。ローダーは個別に暗号化された関数に分割され、各関数は独自の PE セクション、XOR キー、およびディスパッチャを持ちます。任意の時点で平文にあるのは 1 つの関数のバイトのみです。以前の VEH スライディングウィンドウモデルは廃止され、このディスパッチモデルに置き換えられました。
これは重要です。 releases でテスト用に提供されているプリビルドバイナリは、そのバイナリのすべてのユーザー間でビルドごとの定数を共有します。
自分自身のコピーをビルドしてください。 ビルドごとの軸は、make を呼び出すたびに再ランダム化されます。
# Linux、static-musl ELF、ランタイム libc 依存なし
# 必要: build-essential、mingw-w64、musl-tools
make -f Makefile.linux release
# Windows (MSVC)、Windows では推奨
nmake -f Makefile.msvc
Windows では、MSVC が推奨ツールチェーンです。各ローダー関数を独自のページアライン PE セクションに配置します。これは、N>1 の関数ごとのディスパッチモデルに必要なものです。mingw は現在、すべてを単一の .text に出力するため、XOR キー 1 つでローダー全体をカバーするエントリを 1 つ実行します (機能的には MSVC 出力と同じですが、多態性のディスパッチャが多数ではなく 1 つだけです)。Visual Studio をお持ちでない場合は、WSL で Makefile.linux を使用してビルドしてください。mingw-w64 経由で Windows ローダーをクロスコンパイルします。
各 make は tools/gen_poly を実行して新しいビルドごとの定数を生成し、tools/gen_api_shuffle を実行して API 解決テーブルを並べ替えます。結果の fritter バイナリ自体も、異なる暗号定数、異なるハッシュ定数、異なる API テーブルレイアウト、異なるシム側の文字列スクランブリングなどを持つ一意のものになります。そのバイナリによって生成されるすべてのシェルコードは、それらのビルドごとの定数を共有しますが、出力ごとの軸では変化します。
/test フォルダには、Fritter をテストするための calc.exe と inject_local64.exe が含まれています。テストホストを自分で再ビルドするには: nmake -f Makefile.msvc harness、または WSL で make -f Makefile.linux harness を実行します。
fritter [options] -i <EXE/DLL/VBS/JS>
INPUT
-i, --input <path> インメモリで実行する入力ファイル
-p, --args <args> ターゲットのパラメータ / コマンドライン
-c, --class <name> クラス名 (.NET DLL に必要)
-m, --method <name> DLL のメソッドまたは関数
-r, --runtime <ver> CLR ランタイムバージョン
-w, --unicode コマンドラインを UNICODE として渡す
-t, --thread 非管理 EXE エントリポイントをスレッドとして実行
OUTPUT
-o, --output <path> 出力ファイル (デフォルト: loader.bin)
-f, --format <1-8> 1=Bin 2=B64 3=C 4=Ruby 5=Py 6=PS 7=C# 8=Hex
-x, --exit <1-3> 1=Thread (デフォルト) 2=Process 3=Block
-y, --fork <offset> スレッドをフォークし、RVA オフセットで続行
LOADER
-e, --entropy <1-3> 1=None 2=Random names 3=Names+Crypto (デフォルト)
-k, --headers <1-2> 1=Overwrite (デフォルト) 2=Keep all
-g, --chunked <0-1> (非推奨; ディスパッチシムは常に使用されます)
-d, --domain <name> .NET 用 AppDomain 名
-j, --decoy <path> Module Overloading 用デコイモジュール
STAGING
-n, --modname <name> HTTP ステージング用モジュール名
-s, --server <url> サーバー URL (ベーシック認証をサポート)
fritter -i payload.exe
fritter -i implant.dll -m RunMain -p "arg1 arg2"
fritter -i payload.exe -g 0 -k 2 -o out.bin
Fritter シェルコードペイロードは、ネストされたレイヤーとして構成され、各レイヤーが次のレイヤーを復号化またはステージングします。
エントリスタブ。 可変長のランダム化されたジャンクプレフィックス、出力ごとに生成される RSP アライメントルーチン、および生成的トランポリン。Shikata Ga Nai の流儀に基づいています。
多態的 XOR デコーダ。 2 パスアセンブル。レジスタ割り当ては、Fisher-Yates シャッフルによりプールから引き出されます。キー長は出力ごとに選択されます。すべての実際の命令の間にジャンクが挿入されます。ホットループの移動可能な命令グループは、正確性の制約内で並べ替えられます。
ディスパッチシム。 以前の VEH スライディングウィンドウシムを置き換えます。ローダー領域を RW->RWX にフリップしてから、ローダーエントリに制御を渡します。N>1 ディスパッチでは、各呼び出しは関数ごとのサンクを介して関数ごとのディスパッチャにルーティングされ、ディスパッチャは復号化、実行、および戻り時にワイプを行います。すべてのディスパッチャのオペコードレイアウトはビルドごとに異なります (CHANGELOG v1.3 を参照)。
ローダー。 PE インメモリマッパー。ハッシュによる API 解決、セクション API による埋め込み PE のマッピング、インポート / リロケーション / TLS コールバックの適用、エントリポイントの呼び出し、その後のワイプを実行します。PEB ウォーク方向、実行後ワイプバイト、MainProc 内の構造的ソルトサイトは、すべてビルドごとにランダム化されます。
クリーンアップ。 ビルドごとのバイトパターンでローダーページをワイプし、インスタンスを消去し、-x に従ってスレッドまたはプロセス終了で終了します。スクラブする VEH ハンドラやコンテキスト構造はありません。
実行後の残存フットプリントは、ディスパッチシムが実行された 1 つの小さな RWX ページです。スレッドモードでは、CRT コールバックが継続を持つように、マップされた PE セクションが意図的にそのまま残されます。
Fritter は、TheWover と Odzhan の成果に基づいています。彼らのオリジナルの Donut プロジェクトは、位置非依存シェルコード生成を利用しやすく実用的なものにしました。彼らのアーキテクチャ、ローダー設計、および PIC フレームワークは、ここで構築されているすべての基盤です。PE マッピング、.NET ホスティング、およびスクリプト実行パスは、大部分が彼らの成果であり、維持され、尊重されています。
BSD 3-Clause。LICENSE を参照してください。