Formbookのリバースエンジニアリング分析。.NETアセンブリ操作とXOR復号化を利用する情報窃取型マルウェア。x32dbgを用いて完全なペイロードを抽出。XOR復号化ループ、CLR初期化、SQLExpressのおとり、キーロガー/クリップボードAPIを含む。
x32dbgのメモリダンプにより、Formbookが構成データを復号し、NtAllocateVirtualMemoryを使用してそのためのメモリを割り当てていることが明らかになりました。
NtAllocateVirtualMemory – 復号されたペイロード用のメモリを割り当てます。mov edx, dword ptr ds:[esi+1C] – ESIレジスタから暗号化データのサイズを取得します。push 0x1000 – MEM_COMMITを使用してメモリを割り当てます。push 0 – 割り当てタイプまたは保護フラグを指定します。mov edx, dword ptr ds:[esi+4] – 別の構成値を取得します。lea ecx, [ebp-4] – ローカル変数へのポインタをロードします。test ecx, ecx – ポインタが有効かどうかを確認します。mov ecx, [esi+1C] – 暗号化データのサイズを再度取得します。push 0x1000 – MEM_COMMITフラグを繰り返します。push 0 – 割り当てフラグを繰り返します。ConnectionStrings – C2アドレス用の.NET構成キー。system.data、DbProviderFactories – .NET構成セクション(おとりである可能性が高い)。system.serviceModel – .NETサービスモデルセクション。<DbProviderFactories /> – 空のXML要素(おとり)。ConnectionStringsにはC2 URLが含まれている可能性が高いです。
NtAllocateVirtualMemoryとConnectionStringsの復号を示すx32dbgビュー。
このx32dbgビューは、Formbookが.NETアセンブリ操作、XORベースの復号、およびCLR(Common Language Runtime)初期化を使用してペイロードを実行していることを明らかにしています。
xor eax, eax – EAXをクリアし、XORベースの復号を示します。call 0x6C6E7F60 – 復号または処理関数を呼び出します。call 0x6C6EE8B0 – 別の処理関数を呼び出します。DllCanUnloadNowInternal – .NETアセンブリのロード/アンロードを管理します。PublicKeyToken=31bf3856ad364e35 – Microsoftアセンブリを偽装します。system.serviceModel – .NETサービスモデル構成(C2通信)。System.Web – .NET Web構成(HTTPベースのC2)。clr.NGenCreateNGenWorker – .NET Native Image Generatorワーカーを作成します。clr.GetCLRFunction – CLR関数を取得します。return to clr.Initialize – .NETランタイムを初期化します。xor eax, eaxとそれに続くcall関数は、XORベースの復号を確認します。PublicKeyTokenにより、Microsoftアセンブリのように見せかけます。system.serviceModelとSystem.WebはC2設定を保存します。
XOR復号、DllCanUnloadNowInternal、CLR初期化を示すx32dbgビュー。
このx32dbgビューは、FormbookがSQLExpress関連の文字列をおとりとして使用し、.NET CLRを初期化してペイロードを実行していることを明らかにしています。
L"ce=..\SQLEXPR" – おとりの文字列であり、SQLデータ窃取とは関係ありません。マルウェアを正規のSQL Server Expressコンポーネントに見せかけるために使用されますclr.InitializeFusion – .NET Fusionアセンブリローダーを初期化します。これは.NETペイロードをメモリにロードするために使用されます。clr.GetCLRFunction – マネージドコードを実行するためのCLR関数を取得します。clr.NGenCreateNGenWorker – .NET Native Image Generatorワーカーを作成し、JITコンパイルなしでペイロードを実行できるようにします。return to clr.InitializeFusion+1751 – CLR初期化ルーチンに戻ります。SQLEXPR文字列は、セキュリティツールによる検出を回避するためのおとりです。
L"ce=..\SQLEXPR"、clr.InitializeFusion、CLR関数を示すx32dbgビュー。
このx32dbgビューは、標準のPE DOSスタブメッセージの後に位置するFormbookのペイロードの開始を明らかにしています。マルウェアはXOR復号ループを使用して、メモリ内でペイロードを復号します。
This program cannot be run in DOS mode – 標準のPE DOSスタブメッセージ。xor dword ptr ds:[edi], eax – EDIのデータをEAXでXORします(復号)。mov al, byte ptr ds:[edi+1] – EDI+1からALにバイトをロードします。xor al, byte ptr ds:[edx+1] – ALをEDX+1のバイトでXORします(復号キー)。mov byte ptr ds:[edi], al – 復号されたバイトをEDIに書き戻します。call ntdll.77DDE45C – RtlIsCurrentThreadAttachExemptを呼び出します(アンチデバッグ)。cmp dword ptr ds:[esi+4], 0 – カウンタ(ESI+4)がゼロかどうかを確認します。sub dword ptr ds:[esi+4], eax – カウンタをデクリメントします。test edx, edx – EDXがゼロかどうかをテストします。jne ntdll.77DDF9F4 – ゼロでない場合にループバックします(復号ループ)。RtlIsCurrentThreadAttachExemptを呼び出してデバッガを回避します。
標準のPE DOSスタブメッセージ後のXOR復号ループを示すx32dbgビュー。
抽出されたペイロードのBinary Ninja分析により、Formbookがキーロギング、クリップボードハイジャック、特権昇格に使用するAPIの包括的なリストが明らかになりました。
SetClipboardData、GetClipboardData – クリップボードデータを窃取および置換します。SetWindowsHookExW、SetWindowsHookExA – キーボードフックをインストールします。NtSetInformationProcess、NtCreateThreadEx、NtTerminateProcess。NtAdjustPrivilegesToken – トークン特権を調整します。NtShutdownSystem、SystemParametersInfoA/W。MsInstallProductW/A – 永続化のために製品をインストールします。CreateProcessInternalW – 新しいプロセスを作成します。MsInstallProductW/Aは、マルウェアが起動時に実行されることを保証します。
キーロガー、クリップボード、特権昇格APIを示すBinary Ninjaビュー。
この分析により、暗号化された構成、.NETアセンブリ操作、XOR復号、キーロギング/クリップボードハイジャックを使用する高度な情報窃取マルウェアであるFormbookが明らかになりました。
NtAllocateVirtualMemoryを使用してメモリ内で構成を復号します。DllCanUnloadNowInternalとPublicKeyTokenを使用してMicrosoftアセンブリを偽装します。clr.InitializeFusionとclr.NGenCreateNGenWorkerを使用して.NETペイロードを実行します。L"ce=..\SQLEXPR"を使用します。SetWindowsHookExW、SetClipboardData、GetClipboardDataを使用します。NtAdjustPrivilegesTokenを使用します。NtAllocateVirtualMemoryとConnectionStringsを監視します。DllCanUnloadNowInternalとCLR初期化を検出します。SetWindowsHookExWとSetClipboardDataの呼び出しを監視します。NtAdjustPrivilegesTokenとNtCreateThreadExの使用を確認します。分析されたFormbookサンプルは、独自の分析を行いたい方向けにMalwareBazaarで入手可能です:
🔗 Formbook Sample on MalwareBazaar
使用ツール: x64dbg、Binary Ninja