使用Delphi Packer來繞過惡意軟體檢測
打包和加密惡意程式是攻擊者常用的繞過靜態和動態分析的方法。惡意軟體的分類和檢測的繞過其實是一場攻擊者和防禦者之間的軍備競賽,因為不斷有新的技術被交易和應用。比如,地下市場就有很多加密服務,使用該服務的惡意軟體可以完全繞過反病毒技術、沙箱和其他終端解決方案。研究人員也在努力對正常的使用者活動進行建模,並將其作為應對惡意軟體分析環境的有效措施。
研究人員發現的樣本含有Delphi簽名,與Delphi程式碼結構是一致的。
圖1: 樣本中的Delphi簽名
Delphi程式語言可以利用Windows API函式來寫程式和應用。一些攻擊者會故意包含一些預設的庫來阻礙靜態分析,並且使動態分析過程中看著是合法的。圖2是地下論壇談論該技術的帖子。
圖2: 地下論壇談論該技術的帖子
傳播活動
研究人員發現許多不同主題的垃圾郵件活動都使用了用Delphi打包的payload。
一個例子是swift垃圾郵件中含有一個文件檔案作為附件,使用惡意巨集文件來釋放payload。垃圾郵件如圖3。
圖3: 垃圾郵件示例1
另一個例子是問卷主題的垃圾郵件,附件利用公式編輯器的漏洞來刪除payload,如圖4。
圖4: 垃圾郵件示例2
示例中的文件都回從 ofollow,noindex">http://5.152.203.115/win32.exe 取回payload,最終會變成一個Lokibot惡意軟體。
使用者活動檢查
Packer在確保沒有執行分析環境中做了很多的工作。正常的使用者活動含有許多過一段時間就會旋轉或改變的應用視窗。第一個Packer變種在執行前會用GetForegroundWindow API檢查視窗變化的使用者活動至少三次。如果沒有檢查到視窗變化,就會進入休眠。具體程式碼見圖5,這種簡單的技術還可以檢查一些沙箱。
圖5: 視窗改變檢查
為了確認使用者活動,packer的第二個變種會用GetCursorPos和Sleep APIs檢查滑鼠游標移動,第三個變種會用GetLastInputInfo和GetTickCount APIs來檢查系統空閒狀態。
從PE資源中提取真實payload
原始payload會被分成多個二進位制塊,並儲存在資源目錄的不同位置,如圖6所示。
圖6: 含有加密內容的點陣圖資源
為了定位和組合這些真實payload位元組,packer程式碼首先會直接從資源區中硬編碼的資源ID讀取內容。前16位元組會組成一個用於解密其他位元組的XOR key。解密的位元組表示的是內部資料結構,如圖7所示。Packer會用內部資料結構來為位於不同資源ID的加密和混淆的快取建立索引。
圖7: 表示加密檔案資訊的結構
然後packer會從加密的快取中讀取值,從dwStartResourceId到dwStartResourceId+dwNumberOfResources,通過從dwChunkSize中讀取chunk來將這些紙帶來一個單獨的位置。一旦最後的資料快取準備好,就用前面提到的XOR演算法和金鑰來解密。該指令碼還可以用於靜態提取真實payload。
惡意軟體家族分類
許多從樣本集中提取的未打包的二進位制檔案都屬於Lokibot惡意軟體家族。研究人員還識別出了Pony、IRStealer、Nanocore、Netwire、Remcos和nJRAT惡意軟體家族。使用該packer的惡意軟體家族分佈如圖8所示。惡意軟體家族的說明許多威脅單元都使用這種加密服務/工具,也可能是從地下市場購買的加密服務。