Windows テスト ビルド
Linux テスト ビルド
Drltrace は、Windows および Linux アプリケーション用の動的 API 呼び出しトレーサーです。 Drltrace は、DynamoRIO 動的バイナリ インストルメンテーション フレームワーク上に構築されています。 Drltrace は当初、Derek Bruening によって実装され、DynamoRIO および DrMemory フレームワークとともに配布されました。このリポジトリには、drltrace のスタンドアロン バージョンと、マルウェア分析に使用する方法に関する追加のスクリプトと資料が含まれています。リリースビルドはここからダウンロードできます。
drltrace の使用方法は非常に簡単です。ユーザーは、次の方法でログ ディレクトリとターゲット プロセスの名前を指定する必要があります。
drltrace -logdir . -- calc.exe
これだけで、ツールは必要な DLL をターゲット プロセスに挿入し、インストルメンテーションを開始し、並行して、ターゲット プロセスで実行されるすべてのライブラリ呼び出しに関する情報をログに記録します。
~~43600~~ msvcrt.dll!__wgetmainargs
arg 0: 0x010d2364
arg 1: 0x010d2368
and return to module id:0, offset:0x193a
~~43600~~ ntdll.dll!EtwEventRegister
arg 0: 0x002ff994
arg 1: 0x010d1490
and return to module id:0, offset:0x157e
~~43600~~ ntdll.dll!EtwEventSetInformation
arg 0: 0x007b4b40
arg 1: 0x00000033
and return to module id:0, offset:0x15a1
~~43600~~ SHELL32.dll!ShellExecuteW
arg 0: <null> (type=<unknown>, size=0x0)
arg 1: <null> (type=wchar_t*, size=0x0)
arg 2: calculator:// (type=wchar_t*, size=0x0)
arg 3: <null> (type=wchar_t*, size=0x0)
arg 4: <null> (type=wchar_t*, size=0x0)
arg 5: 0x1 (type=int, size=0x4)
and return to module id:0, offset:0x167d
出力の形式はシンプルで、外部スクリプトで簡単に解析できます。
~~[thread id]~~ [dll name]![api call name]
arg [arg #]: [value] (type=[Windows type name], size=[size of arg])
and return to module id:[module unique id], offset:[offset in memory]
grep
による解析は、 -grepable
引数が使用されている場合に実行できます。これにより、関数名と引数がすべて 1 行に出力されます。
~~4824~~ KERNELBASE.dll!CreateFileW {0: C:WindowsFontsstaticcache.dat (type=wchar_t*, size=0x0)} {1: 0x80000000 (type=DWORD, size=0x4)} {2: 0x3 (type=DWORD, size=0x4)} {3: 0x005cde8c (type=<unknown>*, size=0x0)} {4: 0x3 (type=DWORD, size=0x4)} {5: 0x80 (type=DWORD, size=0x4)}
モジュールの一意の識別子のテーブルは、ログ ファイルの最後に出力されます。
Module Table: version 3, count 70
Columns: id, containing_id, start, end, entry, checksum, timestamp, path
0, 0, 0x010d0000, 0x010da000, 0x010d1b80, 0x0000f752, 0xb5fe3575, C:WindowsSysWOW64calc.exe
1, 1, 0x6d4c0000, 0x6d621000, 0x6d563940, 0x00136d65, 0x59ce1b0b, C:UsersMaxDownloadsdrltracedrltracedynamoriolib32releasedynamorio.dll
2, 2, 0x73800000, 0x73975000, 0x7380dbf7, 0x00000000, 0x59ce1b0f, C:UsersMaxDownloadsdrltracedrltracebinrelease/drltracelib.dll
3, 3, 0x742f0000, 0x742fa000, 0x742f2a00, 0x0000c877, 0x0adc52c1, C:WindowsSystem32CRYPTBASE.dll
4, 4, 0x74300000, 0x74320000, 0x7430c9b0, 0x0002c617, 0x245970b4, C:WindowsSystem32SspiCli.dll
5, 5, 0x74410000, 0x74431000, 0x74416900, 0x0002a940, 0x88a53c1d, C:WindowsSystem32GDI32.dll
6, 6, 0x74440000, 0x74500000, 0x7446fb20, 0x000cc410, 0xd343d532, C:WindowsSystem32RPCRT4.dll
7, 7, 0x74500000, 0x74525000, 0x745047d0, 0x00026737, 0xa39c8991, C:WindowsSystem32IMM32.DLL
8, 8, 0x74550000, 0x745c7000, 0x7456e8a0, 0x00081857, 0x73b971e1, C:WindowsSystem32advapi32.dll
9, 9, 0x748f0000, 0x74929000, 0x748febd0, 0x00045303, 0xa58be652, C:WindowsSystem32cfgmgr32.dll
10, 10, 0x74930000, 0x75c78000, 0x74aa09d0, 0x01377aa6, 0x4b39926b, C:WindowsSystem32SHELL32.dll
Drltrace は、 -only_from_app
オプションを指定することで、ライブラリ間呼び出しを簡単にフィルタリングして、ターゲット アプリケーションのメイン モジュール (またはヒープ) から実行された API 呼び出しのみを出力できます。これは、巨大なログを生成するアプリケーションの場合に非常に便利です。より詳細に制御するには、 -filter
オプションを使用して、ユーザーがフィルター構成ファイルを指定して、ホワイトリストに登録された特定の機能でフィルターをかけたり、ブラックリストに登録された機能を無視したりできます (例については、 filter.configファイルを参照してください)。 Drltrace には、特定のライブラリの API 呼び出しをフィルタリングし、潜在的に興味深い API 呼び出しと文字列のみを出力する便利な外部スクリプトもいくつかあります。
Drltrace のメイン モジュールは BSD で配布されます。
drltrace に必要な一部のファイルは LGPL で配布されています。詳細については、ソース ファイルを参照してください。
マルウェア分析は簡単な作業ではありません。 Themida や Armadillo などの洗練されたソフトウェア パッカー、そしてもちろんマルウェア作成者によって作成された数十の名前のないパッカーに加え、コードとデータの暗号化により、そのようなサンプルの静的リバース エンジニアリングが大幅に容易になり (場合によっては完全に不可能になり)、マルウェア アナリストの作業が複雑になります。このような場合、API 呼び出しのトレースにより、実際の悪意を理解するのに必要な時間を大幅に短縮し、保護された悪意のあるコードに関する多くの技術的な詳細を明らかにすることができます。
API フックの従来の手法はいくつかのソリューションで正常に実装されていますが、このアプローチはマルウェア作成者によってよく研究されており、簡単に検出および/またはバイパスできます。さらに、これらのツールはスタンドアロンの重量級 GUI アプリケーション (独自製品として) として配布されており、既存のマルウェア分析ワークフローに統合するのは容易ではありません。
Linux の世界に目を向けると、ltrace という素晴らしいツールがあります。単一の bash コマンドを使用すると、特定の実行可能ファイルの API 呼び出しの完全なトレースを簡単に取得できます。
最新のマルウェアが使用する研究対策のトリックに対して透過的である Windows 用のツール (Linux の ltrace など) がなぜ存在しないのでしょうか?
Windows 用のこのようなツールを使用して、実行されたプログラムに対して API 呼び出しを透過的に追跡するのに役立つ技術があることがわかりました。この技術は、動的バイナリ インストルメンテーション、別名 DBI と呼ばれます。 DBI は、インストルメンテーション コードの挿入を通じて実行時のバイナリ アプリケーションの動作を分析する手法です。
ただし、マルウェア分析への DBI の適用は、自動化の開梱と、命令、基本ブロック、および関数呼び出しのトレースに関するいくつかの概念実証によって、不当に制限されます。私たちが知る限り、drltrace は、実際にマルウェア分析に使用できる、DBI に基づく API 呼び出しトレース用の最初のツールです。私たちは wiki にいくつかのマルウェア分析例を提供しました。そこでは、drltrace がどのようにして、IDA やデバッガーを起動することなく、洗練された悪意のあるサンプルに関する多くの内部技術詳細を数分間で満喫できるかを説明しました。
-logdir [ .] Log directory to print library call data
-only_from_app [ false] Reports only library calls from the app
-follow_children [ true] Trace child processes
-print_ret_addr [ false] Print library call's return address
-num_unknown_args [ 2] Number of unknown libcall args to print
-num_max_args [ 6] Maximum number of arguments to print
-default_config [ true] Use default config file.
-config [ ""] The path to custom config file.
-filter [filter.config] The path of the whitelist/blacklist file.
-ignore_underscore [ false] Ignores library routine names starting with "_".
-help [ false] Print this message.
-version [ false] Print version number.
-verbose [ 1] Change verbosity.
-use_config [ true] Use config file
-grepable [ false] Grepable output
Drltrace は、ユーザーが drltrace が特定の API 呼び出しの引数を出力する方法を記述できる外部構成ファイルをサポートしています。
HANDLE|CreateRemoteThread|HANDLE|SECURITY_ATTRIBUTES*|size_t|THREAD_START_ROUTINE*|VOID*|DWORD|__out DWORD*
各関数の引数は|
で区切る必要があります。 。最初の引数は戻り値の型、2 番目の引数は関数名そのもの、残りは関数の引数です。トークン__out
は出力引数をマークするために使用され、 ___inout
は入力+出力引数をマークするために使用されます。
複雑なマルウェアの分析に drltrace を使用する方法の例は、Wiki ページで見つけることができます。
ログ ファイルの操作を容易にするために、 api_calls_viz.py
というスクリプトを実装しました。これを使用して、各ピクセルの色が固有の API 呼び出しを表す RGB 画像を生成できます。たとえば、下の図は WannaCry マルウェアのログ ファイルを表しています。
画像上の大きな緑色の領域は、興味深い拡張子 (docx、xls、py など) を持つファイルを選択して暗号化するために使用される API 呼び出し ( wcscmp/wcsicmp
) を表しています。紫色の領域は、ディスク上のファイルとフォルダーを列挙して暗号化するために使用される API 呼び出し ( FindFirstFile/FindNextFile/CryptEncrypt
) を表します。
このスクリプトは、生成された RGB 画像の HTML 表現を生成することもでき、各要素を選択して API 呼び出しの名前を表示できます。
生の HTML ファイル。
詳細については、 api_calls_viz
ディレクトリを参照してください。
詳細なマニュアルはこの Wiki ページにあります。
Windows、Linux (将来は macOS)。
x86、x64 (ARM がリストにあります)。
C および C++ の標準ライブラリ (および Python で記述されたスクリプトを処理するログ)。
私たちは、動的バイナリ インストルメンテーション フレームワーク DynamoRIO 上に API 呼び出しトレーサーを実装することにしました。 Drltrace は、ターゲット プロセスによってロードされる新しいライブラリを処理できるように、DynamoRIO に LoadLibrary 呼び出しのインストルメンテーションを実行するように要求します。プロセスが新しいライブラリをロードしようとすると、DynamoRIO は制御フローをdrltracelib.dll
にリダイレクトします。次に、drltrace は、新しくロードされた DLL 内のエクスポートされた関数を列挙し、それぞれの関数に特別なコールバックを登録します。したがって、エクスポートされた関数がマルウェアによって呼び出された場合、drltrace のコールバックはこの関数の前に実行され、ツールは関数名や引数などの必要な情報をすべてログに記録できます。実行結果を保存するために、関数の後に別のコールバックが登録される場合があります。
なぜ Intel Pin ではないのでしょうか?私たちは、次の理由から DynamoRIO を使用することにしました。
drrun.exe
の-syswide_on
オプション)。ただし、将来的には、このような状況に備えて drltrace に特別なサポートを実装する必要があります。私たちの問題トラッカーには、drltrace の将来に関する詳細が含まれています。
マクシム・シュドラク https://github.com/mxmssh
デレク・ブルーニング https://github.com/derekbruening
ジョー・テスタ https://github.com/jtesta