
.NETプロセスモニターで、ネイティブ層でCLRをフックし、リフレクティブアセンブリをメモリからダンプし、AMSI/ETWの整合性をディスク上のバイナリと比較チェックします。
マルウェアサンプル内で jlaive のフォークを延々と見続けるのに疲れて、実行時に実際に引き裂く公開ツールが何もなかったので作った Windows ツール。
要するに、ネイティブ層で CLR をフックし、リフレクティブアセンブリロードを追跡し、メモリから直接 PE を自動ダンプする .NET プロセスモニタです。また、clr.dll の文字列パッチや直接 LoadFromBuffer の使用などの回避手法を検出しながら、元のディスク上のバイナリに対する AMSI および ETW の整合性をチェックします。
サンプルはどこで見つける? https://tria.ge をお勧めします(広告ではありません)。好きなサンプルをダウンロードして、ファミリーでフィルタリングできます。
なぜ Nemesis という名前なのか不思議に思うかもしれません。
それは、このツールの正確な目的を表しているからです。Nemesis とは、相手にとって常に挑戦であり、転落の原因となるものを意味します。それがこのプロジェクトの背後にある考え方です。
ギリシャ神話では、nemesis は神の報復の精神であり、あまりに傲慢になった者や、自分は手が届かないと思った者に報いを与える存在でした。私に言わせれば、「FUD」と自慢するマルウェアには、まさにぴったりです。
私はマルウェアアナリストです。この仕事(私にとっては趣味)を長く続けていると、同じローダーチェーンを何度も見るようになります。特に jlaive(crybat とも呼ばれる)が流行り、すべてのスクリプトキディがフォークしてからはなおさらです。
パターンは馬鹿みたいに単純ですが、対処するのは非常に面倒です:
something.bat → 難読化された powershell → csharp スタブ → 実際のペイロード
ワードサラダに見える .bat をダブルクリックします。cmd がジャンクの壁のような powershell を起動します。powershell が .NET スタブ(aes、gzip、base64)を復号・展開します。そのスタブは amsi + etw にパッチを当て、実際の exe/dll をメモリにリフレクティブにロードします。これで完了です。有用な形でディスクに届くものは何もありません。
それが私を悩ませました。この特定のチェーンをフックし、.NET ペイロードが実際に現れる場所を捉え、プロセスが自滅する前にダンプし、これらのスタブが常に行う amsi/etw のパッチをキャッチする、優れた公開ツールは実際にはありませんでした。そこで Nemesis を作りました。
銀の弾丸ではありません。サンドボックスの代わりにはなりません。しかし、テストボックス上の疑わしい .bat に対して実際に実行し、アーティファクトを抽出するための現実的なものを提供します。
ランチャー (Launcher.exe)
Nemesis.dll を注入nemesis dll (Nemesis.dll)
nLoadImagenLoadFileAssemblyNative::LoadFromBuffer(nLoadImage から解決されたパターン)%TEMP%\Nemesis_dumps にダンプをキューイングamsi.dll / ntdll.dll のエクスポートをディスク上のコピーと比較(AmsiScanBuffer / EtwEventWrite の古典的な ret パッチをキャッチ).rdata 文字列も確認(一部のバイパスは代わりにそれらにパッチを当てる;これに関する優れた vxug の論文があります:2024-11-21 - New AMSI Bypss Technique Modifying CLRDLL in Memory.pdf)%TEMP%\Nemesis.log に出力。ENABLE_VIRTUAL_TERMINAL_PROCESSING も設定済みで、コンソールがおかしくなる問題を回避(:D)基本的に:bat チェインを実行させ、crypter が実際にペイロードをロードする場所でペイロードをキャッチし、途中の回避トリックをログに記録します。
Visual Studio 2022+ で C++ デスクトップ + MASM (x64) が必要です。
Nemesis.slnx を開き、Release | x64 を選択し、ソリューションをビルドします。
これが実際のユースケースです。疑わしい bat を指定して、何が飛び出すか見てみましょう:
cd x64\Release
.\Launcher.exe "C:\path\to\suspicious.bat"
-- の後の追加引数はターゲットに渡されます:
.\Launcher.exe myapp.exe -- --some-flag
カスタム DLL パス:
.\Launcher.exe --dll C:\path\Nemesis.dll myapp.exe
アーティファクト:
%TEMP%\Nemesis.log%TEMP%\Nemesis_dumpsできること:
できないこと:
LNK1104 でリビルドに失敗?何かがまだ nemesis.dll をロードしています。ターゲットを強制終了してリビルドしてくださいpwsh.exe vcpkg のノイズは無害なので無視してください戦っている相手を理解したい場合:
Nemesis を使用することにより、これを受け入れたものとみなします。 本ソフトウェアは「現状のまま」提供され、いかなる保証もありません — すべてのリスクは利用者が負うものとします。
利用者は、合法的かつ許可された使用(ラボ VM、所有するシステム、明示的な許可)について単独で責任を負います。法律で認められる最大限の範囲において、作者および zypherion.tech は、使用または誤用から生じるいかなる損害、損失、法的請求についても一切の責任を負いません。詳細は LICENSE をご覧ください。
非営利 / 個人 / 研究 / 趣味での使用 → PolyForm Noncommercial 1.0.0
商用利用(販売、有料製品、SaaS、クライアントワークなど)→ 別途ライセンスが必要です。PolyForm Noncommercial はそれをカバーしません。
商用ライセンスをご希望の場合はご連絡ください:
[[email protected] / @wd6g(discord) / telegram: @ZypherionTechnologies]
簡単なメモ:compilemethod を調べて修正する必要があります。現時点では、crypter は通常
asm.load(...)を使用するため、これはあまり必要ありません... また、rdata 文字列も確認する必要があります。残念ながらまだ適切にテストしていません... 愚かなコードの PR はしないでください。n(Native) バックエンド(例:nLoadImage)をフックすることはできません。通常はレジスタを保存する必要があり、面倒です。だから asm を使っています。