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]
當使用-grepable
參數時,可以使用grep
進行解析;這將函數名稱和參數全部列印在一行上:
~~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*
每個函數參數應該用|
分隔。第一個參數是傳回類型,第二個參數是函數名稱本身,其餘是函數參數。標記__out
用於標記輸出參數,而___inout
用於標記輸入+輸出參數。
您可以在我們的 Wiki 頁面找到如何使用 drltrace 分析複雜惡意軟體的範例。
為了讓日誌檔案的處理更加容易,我們實作了一個名為api_calls_viz.py
的腳本,該腳本可用於產生 RGB 影像,其中每個像素顏色代表唯一的 API 呼叫。例如,下圖表示 WannaCry 惡意軟體的日誌檔。
圖片上的大綠色區域代表 API 呼叫( wcscmp/wcsicmp
),用於選擇具有有趣副檔名(例如 docx、xls、py)的檔案來加密。紫色區域代表 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 的回調將在此函數之前執行,並且該工具將能夠記錄所有必需的信息,例如函數名稱和參數。可以在函數之後註冊另一個回調以保存執行結果。
為什麼不使用英特爾 Pin 呢?我們決定使用 DynamoRIO 的原因如下:
drrun.exe
的-syswide_on
選項)。然而,將來有必要在 drltrace 中針對此類情況實施特殊支援。我們的問題追蹤器包含有關 drltrace 未來的更多詳細資訊。
馬克西姆·舒德拉克 https://github.com/mxmssh
德里克布魯寧 https://github.com/derekbruening
喬·泰斯塔 https://github.com/jtesta