BluePillは、回避マルウェアを処理するためのオープンソースの動的分析フレームワークです。その目標は、自動分析に必要な透明性プロパティを、手動分析に必要な細粒の実行検査とパッチング機能を使用して調整することです。
BluePillは、暇なときに維持する学術的なプロトタイプです。あなたのフィードバックは貴重です!
Bluepillは、ハイパーバイザー、デバッガー、サードパーティツール、タイミングアーティファクトを標的とする多くの赤い錠剤に対抗できます。ダイナミックバイナリインストゥルメンテーション(DBI)に基づいて、マルウェアがアーティファクトを探している環境で行うことができるクエリを監視し、自動分析システムまたはヒトエージェントの存在を明らかにするときに結果を変更します。 Bluepillは、アナリストに代わって回避を行いながらサンプルをデバッグするGDBリモートインターフェイスを提供し、デバッガーで行われたセルフチェックサムスキームから作成されたコード変更を非表示にする新しいステルスパッチングメカニズムを提供します。
32ビットWindows 7 SP1で実行されている不均一なPE32 WindowsマルウェアでBluePillをテストしました。例として、Furtimのような最近のバージョンのバージョン、および非常に回避的なサンプルで保護された実行可能ファイルを実行できます。
Bluepillが提示されました:
DBIの回避に対抗するために、Bluepillは、Intel Pinのために書いた緩和液のライブラリを紙の中で使用します。ASIACS2019のセキュリティのためのダイナミックバイナリインストゥルメントレーション(およびRedhindedをキャッチする方法)を使用します。 ACM DTRAP(PREPRINT)に最近登場した目立った特徴とアーティファクトの動的バイナリインストゥルメンテーションシステムを評価する論文でDBI回避の詳細について詳しく読むことができます。
Windows 7 SP1 32ビットVirtualBox 5.2マシンでのテストで、大量の実行可能な保護者と装甲サンプルのためのテストでbluepillの部分的なリストの下にあります。
| カテゴリ | インスタンス |
|---|---|
| ハイパーバイザー | VirtualBoxのゲストの追加、ファイル、レジストリエントリ、ライブラリ、およびドライバー |
| ハードウェア | BIOSおよびファームウェア文字列、MACアドレス、 cpuid 、ディスクサイズ、電源/熱能力 |
| 時間 | rtdscおよびWindowsの時間関連APIを使用した減速検出 |
| ソフトウェア | 一般的な監視ツール(実行中のプロセス、GUIウィンドウ)、親プロセス、HKLキーボードレイアウト、フローズンマウスカーソルのアーティファクト |
| デバッグ | シングルステップの例外、 int 2d 、アクティブ/インストールされたデバッガーのOSクエリ(例: NtQueryInformationProcess )、プロセスエントリブロックフィールド |
| WMIクエリ | CPU、ディスクサイズ、MACアドレス、ACPI、MUI言語、VirtualBox VBOXVIDEO |
| DBI | FPUの命令、メモリの内容、許可を備えたポインターが漏れます(例:ガードページ、nx施行) |
注:BH Europe 2019に公開する前に、64ビットコードの取り扱いと(わずかな程度)WOW64サブシステムの(わずかな)根本的な変更を行いました。回帰テストを完了するときにこれらのシナリオが実験的であると考えて、問題を報告してください。
BluePillはIntel PIN(V3.16推奨)に基づいており、コンピレーションにVisual Studio 2015以下が必要です。
PINには、プロジェクトに手動で含める必要があるいくつかの依存関係があります。 Project Configurationを簡素化するLocals.propsファイルを作成しました。そのデフォルトは、 C:Pin316にPINがインストールされ、SDK 8.1ヘッダーが使用されています。
<PropertyGroup Label="UserMacros">
<PinFolder>C:Pin316</PinFolder>
<WinHPath>C:/Program Files (x86)/Windows Kits/8.1/Include/um</WinHPath>
</PropertyGroup>
たとえば、SDK 10.0.17763.0ヘッダーを使用する場合は、Visual Studioのプロジェクト設定を変更した後、 WinHPathプロパティの値をC:/Program Files/Windows Kits/10/Include/10.0.17763.0/umに変更する必要があります。 Similary、SDK 8.1ヘッダーがC:/プログラムC:/Program Files (x86)/ C:/Program Files/にインストールされている場合、プロパティ値を変更します。このフィールドの目的は、CRTヘッダーからWindows.hの絶対パスを含む場合にPINを支援することです。
これで、Bluepillをコンパイルできるはずです。コンピレーションが終了すると、PINディレクトリにbluepill32.dllライブラリがあります。欠落しているmsvc_compat.hエラーが発生した場合、 $(PinFolder)extrascrtincludeが有効なパスであることを確認してください。
Bluepill使用の下で実行可能ファイルを実行するには:
C:Pin316pin.exe -t bluepill32.dll [options] -- <file.exe>
BluePillは、次のコマンドラインオプションをサポートしています。
| オプション | 意味 |
|---|---|
-evasions | サポートされている回避の大部分を検出して処理します(DBIについては以下を参照) |
-debugger | GDBリモートインターフェイスを介してデバッガーモードを有効にします |
-leak | DBI Evasions:実際のEIPの漏れを修正します(例:FPUの指示) |
-nx | DBI Evasions:コードページが実行可能であることを確認します |
-rw | DBI Evasions:DBIエンジンに属するページを非表示 |
たとえば、サンドボックスのような自動モードでsample.exeという名前の回避プログラムを実行するには:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
-leak緩和を有効にすると、パフォーマンスへの影響が最小限に抑えられますが、 -nxと最終的に-rw 、プログラムのアドレススペースを適合してチェックすることを試みる複雑なパッカーに役立ちます。
BluePillは、PINのフォルダーC:Pin316の下にあるevasions.logという名前のファイルを作成します(実行中に可能な回避試行がインターセプトされる可能性のある回避試行を記録するpintoolsrclogging.h内のLOGPATH変数を変更して変更します)。
BluePillは、デバッガーの使用をサポートして、実行を制御し、マルウェア解剖を実行します。したがって、GDBプロトコルをサポートする場合、PIN:BluePillのGDBリモートインターフェイスに依存しています。以下では、IDA Proとのデバッグセッションを設定するための指示を提供します。
デバッガーインターフェイスを有効にするには、次のように、PIN( -appdebug -appdebug_server_port <port> )とbluepill( -debugger )の両方に追加のコマンドラインオプションを提供する必要があります。
C:Pin316pin.exe -appdebug —appdebug_server_port 10000 -t bluepill32.dll -debugger [other options] -- <file.exe>
このガイドのポート番号として10000使用します。デバッガーをソケットに接続するまで、アプリケーションは一時停止します。ただし、プロセスにローカルデバッガーを接続してみると、アプリケーションだけでなくピンエンジン全体をデバッグすることになります。画面上の予想出力は次のようなものになります。

これで、IDAで実行可能ファイルを開き、 Debugger->Switch debuggerからリモートGDBデバッガーバックエンドを選択できます。以下のスクリーンショットのようなDebugger->Process optionsを使用して、オプション(ポート番号など)が正しいことを確認してください。

この時点で、メイン実行可能ファイルセクションの一部のアドレス(エントリポイント)にブレークポイントを挿入するのに役立ちます。その後、 Debugger->Start processでデバッグセッションを開始できます。 IDAは、「リモコンによってデバッグされているプロセスがすでにある。それに添付したいですか?」とあなたに通知します。 。 [はい]をクリックするだけでデバッグセッションが開始され、EIPはntdll.dllの内部にあります。
メモリマッピング情報は、GDBリモートプロトコルでデフォルトで使用できないため、BluePillにそのようなマップを構築するよう指示するカスタムデバッガーコマンドvmmapを追加しました。スクリプトaddSegments.pyでこのプロセスを自動化しましたscripts/フォルダーで使用可能: File->Script fileを使用してIDAにロードするだけです。このスクリプトは、各コードモジュールのメモリレイアウト情報(つまりセクションとそのアクセス許可)をIDAのセグメントサブビューに入力します。注:まもなくコードを追加して、現在古くなっているモジュールサブビューを更新します。
Bluepillが多くの回避からあなたをシールドするので、あなたはこれであなたのサンプルをデバッグすることができます:-)
例外処理には、PINでの現在のGDBサーバーサポートの回避策が必要であることに注意してください。例外をアプリケーションに渡さない場合(例えば、CloseHandleに渡された無効なハンドルのために0xc0000008 )、例外メッセージを受信した直後にGDBコンソールにwaitコマンドを送信し、IDAをBluepillに切断して再接続します。それまでの間、デバッガーのヘルパーは、コマンドに応じて実行可能ファイルを保留にします。
注:もともと、他の例外の種類については、切断トリックに依存していました。彼らにとって、デバッガーの再触媒時に3.5 Oneが内部アサーション障害につながった後、いくつかのピンリリースの変更を新たに導入しました( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID !したがって、 int 3 opcodeまたはint 2d回避の0xc0000005例外を例えて直面すると、アプリケーションに例外を渡します。 PINのデバッガーインターフェイスは直接検出されませんが、敵は書き込み時計を使用してそれを行うことができます。私たちは現在、そのようなアーティファクトを保護するための回避策を考えています。
BluePillは、実行コードから隠している間にデバッグ時にコード部分にパッチするための一意の機能を実装します。適用されたパッチは、PINのJITメカニズムと密接に結合しているため、反調整スキーム(自己チェックサムシーケンスなど)には見えないままです。一言で言えば、JITコンピレーションをやり直して、コンパイルされた(元の)命令をオーバーライドするトランポリンを追加し、コード保護メカニズムに気付かれないようになります。
パッチの作成は、3つのステップに分割されます。
下の画像のコードブロックを検討し、 mov ebp, esp命令をmov eax, esp命令(バイナリで89 e0 )で0x771X37A5し、アドレス0x771X37A8で実行履歴書を作成すると仮定します。

BluePillがデバッガーモードで動作している場合、カスタムGDBコマンドを介してパッチのPINに指示できます。Set_ set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> 。上記の例では、 set_771c37a6_771c37a6_771c37a8_89,e0を使用できます。
パッチは、別のカスタムGDBコマンドを使用して単純に削除できます: rm_<START_ADDR>_<END_ADDR> 。
アカデミックプロジェクトでBluepillを使用している場合、または論文のディスカッションセクションに合っていると思われる場合は、次のBibtexエントリを使用して作業を参照できれば感謝します。
@ARTICLE{BluePill,
author={D'Elia, Daniele Cono and Coppa, Emilio and Palmaro, Federico and Cavallaro, Lorenzo},
journal={IEEE Transactions on Information Forensics and Security},
title={On the Dissection of Evasive Malware},
year={2020},
volume={15},
number={},
pages={2750-2765},
doi={10.1109/TIFS.2020.2976559}}