BluePill是用於處理避孕惡意軟件的開源動態分析框架。它的目標是調和自動分析所需的透明度屬性,並與手動分析所需的細粒度執行檢查和修補功能。
Bluepill是我們在業餘時間保持的學術原型:您的反饋是寶貴的!
Bluepill可以對抗許多針對管理程序,辯論者,第三方工具和正時工件的紅色藥丸。它建立在動態二進制儀器(DBI)的基礎上,以監視惡意軟件可以在環境中尋找工件的查詢,並在可能揭示自動分析系統或人類代理的存在時改變其結果。 BluePill提供了一個GDB遠程接口來調試樣品,同時代表分析師的逃避,以及一種新的隱形修補機制,以隱藏自核對計劃中調試器中對代碼更改的隱藏。
我們在32位Windows 7 SP1上運行的異質PE32 Windows惡意軟件上測試了Bluepill:例如,我們可以運行使用最新版本的VMPROTECT和THEMIDA以及高度迴避示例(如Furtim)的可執行文件。
Bluepill已在:
為了抵抗DBI逃避,Bluepill使用了我們為Intel Pin編寫的緩解庫作為紙質SOK的一部分:使用動態二元儀器進行安全性(以及如何被Asiaccss 2019中的紅手手抓住)。在BluePill中,我們將庫的庫以超高的速度和紅色丸劑的進一步差異為gdb遠程進行了差異,我們將庫擴展了庫。您可以在論文中閱讀有關DBI逃避的更多信息,以評估最近出現在ACM DTRAP(Preprint)中的明顯特徵的動態二進制儀器系統。
在Windows 7 SP1 32位VirtualBox 5.2機器上,在我們的測試中反駁的Evasions Bluepill的部分列表下方,用於大量可執行的保護器和裝甲樣品:
| 類別 | 實例 |
|---|---|
| 管理程序 | 來自VirtualBox的來賓添加,文件,註冊表條目,庫和驅動程序 |
| 硬體 | BIOS和固件字符串,MAC地址, cpuid ,磁盤尺寸,功率/熱功能 |
| 時間 | 使用rtdsc和Windows時間相關的API降低檢測 |
| 軟體 | 通用監控工具(運行過程,GUI窗口),父進程,HKL鍵盤佈局,冷凍鼠標光標的工件 |
| 偵錯 | 單步例外, int 2d ,活動/安裝辯論者的OS查詢(例如NtQueryInformationProcess ),過程輸入塊字段 |
| WMI查詢 | CPU,磁盤尺寸,MAC地址,ACPI,MUI語言,VirtualBox VBOXVIDEO |
| DBI | 指針洩漏使用FPU說明,內存內容和權限(例如,後衛頁面,nx執行) |
注意:在2019年BH Europe上公開上市之前,我們進行了根本性的更改,以打破了WOW64子系統的64位代碼和(在很小的範圍內)的處理:在我們完成回歸測試時,請考慮這些場景實驗,並隨時報告問題。
Bluepill建立在Intel Pin(建議的v3.16)上,並需要Visual Studio 2015或更高的彙編。
PIN具有一些需要手動包含在項目中的依賴項。我們創建了一個Locals.props文件,簡化了項目配置。它的默認值已安裝在C:Pin316中,並且正在使用的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 。相似,如果您的SDK 8.1標頭安裝在C:/Program Files/而不是C:/Program Files (x86)/情況下,請修改屬性值。該字段的目的是在包含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逃避:修復真實EIP的洩漏(例如FPU說明) |
-nx | DBI逃避:檢查代碼頁是否可執行 |
-rw | DBI逃避:屬於DBI引擎的隱藏頁面 |
例如,在類似沙盒的自動模式下運行一個名為sample.exe的迴避程序,請嘗試:
C:Pin316pin.exe -t bluepill32.dll -evasions -leak -- sample.exe
啟用-leak緩解措施的性能影響很小,而-nx和-rw最終可以幫助進行複雜的包裝工,以嘗試在程序的地址空間上進行一致檢查。
BluePill將創建一個名為evasions.log的文件,在PIN的文件夾C:Pin316下(修改pintoolsrclogging.h內的LOGPATH變量以更改它),以記錄執行過程中可能截取的逃避嘗試。
Bluepill支持使用調試器來控制執行並進行惡意軟件解剖。我們依靠PIN的GDB遠程接口:BluePill,如果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作為端口號。該應用程序將保持暫停,直到將調試器連接到插座上:但是,如果您嘗試將本地調試器附加到該過程中,則最終將進行調試整個PIN引擎,而不僅僅是應用程序。屏幕上的預期輸出將是:

現在,您可以在IDA中打開可執行文件,並從Debugger->Switch debugger中選擇遠程GDB調試器後端。檢查選項(例如端口號)是否使用Debugger->Process options正確(例如端口號),例如以下屏幕截圖:

在這一點上,它有助於插入主要可執行文件部分中的某些地址的斷點,例如入口處。然後,您可以使用Debugger->Start process開始調試會話。艾達會通知您: “遠程已經有一個過程正在調試。您想附加嗎?” 。只需單擊“是” ,調試會話將開始,EIP在ntdll.dll中的某個地方。
由於默認情況下,在GDB遠程協議上默認不提供內存映射信息,因此我們添加了一個自定義調試器命令vmmap該命令vmmap指示BluePill構建此類映射。我們使用腳本addSegments.py在scripts/文件夾中可用:只需將其File->Script file到IDA中,將其加載到IDA中。該腳本將使用每個代碼模塊的內存佈局信息(即章節及其權限)填充IDA的片段子視圖。注意:我們很快將添加代碼以更新當前保持現成的模塊子視圖。
現在,您可以將樣本調試,因為Bluepill會使您免受大量逃避的影響:-)
請注意,例外處理需要PIN中當前GDB服務器支持的解決方法。如果不應將例外傳遞給應用程序(例如,通過無效的句柄傳遞給MoxserHandle的0xc0000008 ),請在收到異常消息後立即在GDB控制台中發送一個wait命令,然後斷開連接並將IDA重新連接到BluePill。同時,調試器助手將根據命令保持可執行文件。
注意:我們最初也依靠其他例外類型的脫節技巧。 For them, newly introduced changes in some Pin release after the 3.5 one lead to an internal assertion failure when reattaching the debugger ( A: sourcepinvmdebugger-connectiondebugger-connection.cpp: PINVM::DEBUGGER_CONNECTION::NotifyThreadsStopped: 1004: assertion failed: focus != PIN::INVALID_THREADID ).因此,當您面對int 3 OPODE或int 2d逃避的0xc0000005異常時,您將異常傳遞給應用程序。 PIN的調試器接口將無法直接檢測到,但是對手可能仍然使用寫入手錶來做到這一點。我們目前正在考慮解決此類文物的解決方法。
BluePill實現了獨特的功能,可以在將代碼藏在執行代碼的同時,以修補代碼部分。施加的貼片仍然與抗抑制方案(例如自我檢查序列)保持不可見,因為它與PIN的JIT機理相連。簡而言之,我們重做JIT彙編以添加越來越覆蓋(原始)指令的蹦床,並且不受代碼保護機制的注意,因為內存讀取不斷被重定向到原始程序指令。
補丁的創建分為三個步驟:
考慮下圖中的代碼塊,假設我們要覆蓋MOV EBP,帶有MOV EAX的地址為0x771X37A5 mov ebp, esp指令mov eax, esp指令(89 E0中的89 e0 ),然後在地址0x771X37A8上進行執行簡歷。

當BluePill處於調試模式下操作時,我們可以通過自定義GDB命令指示PIN用於補丁: set_<START_ADDR>_<END_ADDR>_<CONT_ADDR>_<PATCH_CODE_BYTES> ,其地址為kex號碼和代碼補丁字節,並由comma隔開。對於上面的示例,我們可以使用: 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}}