原程序分析
樣本下載鏈接
基本文件信息
ExeInfo 查看文件信息,PE32位且有殼
Ollydbg 入口點代碼如下
脫殼後單步跟到OEP,dump內存修復IAT
,成功脫殼後用 Die 查看編譯語言爲 Delphi7
IDA 和 OD 的入口代碼
反沙箱手段
- 消息循環
複雜的消息循環,使用了定時器消息,以及自定義 SendMsg,發送大量消息,使程序的運行時間延長
- 設備上下文
長時間消息循環到達核心代碼區,裏面又有許多的動態解密函數以及大量的GetDC
和GetStockObject
,既消耗了一定的時間又消耗了大量的內存資源
- Sleep
最關鍵的手段還是一個 Sleep(),Sleep了4分鐘
釋放文件
- Call下斷
程序的很多代碼都是動態解密的,不用跟具體的解密過程,直接在 call 跳轉時下斷即可。如圖在釋放文件的關鍵call下斷
,注意先 Patch 掉之前的 Sleep
- OD粗略分析
F7 跟過去分析,發現先是獲取了一些 API,然後創建一個進程,再是寫入數據到子進程
- IDA詳細分析
使用ODScript的dma指令dump
這段內存,然後IDA打開靜態分析!先是GetProcAddress
獲取多個 API 的地址,然後CreateProcess
創建自身路徑所在的一個進程,傳入CREATE_SUSPENDED
使其掛起,利用ZwUnmapViewOfSection
卸載原來所有區段以及RtlZeroMemory
將內存區域置0,VirtualAllocEx
配合WriteProcessMemory
寫入新的數據,利用SetThreadContext
和ResumeThread
修改程序的入口點,且恢復掛起進程運行
Tips:dma指令很簡單的: "dma start,size,path"
提取病毒體
在WriteProcessMemory
下斷,發現寫入的是一個完整的 PE 文件
利用 dma 指令提取了總共9段數據,然後新建 PE 文件,手動對齊文件偏移,更改節區的正確偏移量以及節區的可執行屬性,最後提取出了病毒體!P.S.之後我用PCHunter提取出整段內存然後再去對齊偏移也是可以的
第一部分總結
原程序首先是加了殼,然後擁有大量的混淆手段,如圖用ProcessMonitor
檢測到只會讀取某些註冊表的值並沒有寫註冊表,更沒有其它危險的操作,因此能過很多的殺軟!又使用了Sleep
等延時手段過掉很大一部分的沙箱分析,再者程序執行核心病毒的手段也很隱蔽,利用傀儡進程寫入新的PE文件並更改入口點執行,讓核心惡意代碼很難被殺軟檢測到
病毒體分析
基本文件信息
PE32位程序,總共8個節區,有個自寫的殼
脫殼文件信息
這殼好脫,簡單的異或加密殼,3個jmp eax
下斷即可到 OEP,然後dump以及修復IAT
,找到的 OEP 如下
腳本去花
脫了殼之後拖入 IDA 發現 F5 失效,因爲代碼的每個jnz和jz
之後有一段垃圾指令,干擾了 IDA 等反彙編工具的彙編,寫了個IDAPython
去除花指令之後就能夠反編譯了,代碼如下
def patch_junkcode(addr):
data = list(get_bytes(addr,4))
if(ord(data[0]) == 0x75 and ord(data[1]) == 0x5 and ord(data[2]) == 0x74 and ord(data[3]) == 0x3):
for i in range(4,10):
patch_byte(addr+i,0x90)
base = 0x401000
len = 0x414C00 - base
for i in range(len):
patch_junkcode(base+i)
print 'Finished!'
病毒執行流程
- 關閉指定進程
遍歷系統進程,關閉"msftesql.exe","sqlagent.exe","sqlbrowser.exe"等多個特定進程
- 打開互斥體
打開一個互斥體,同步與父進程的內存數據操作
- 要求操作系統Win7以上
使用VerifyVersionInfoW
函數判斷操作系統大於Win7
,否則退出程序
- 要求用戶權限Low以上
使用GetSidSubAuthority
函數判斷當前用戶的權限在Low
以上
- Win7以及Win8提權
先是創建位圖寫入數據,其實數據是之後的shellcode
,這麼做是爲了隱蔽這段 shellcode
獲取 shellcode,調用ZWQueryIntervalProfile
提升當前用戶權限爲系統權限,提權原理相關鏈接
- Win10提權
判斷操作系統爲Win10
,利用不久前Task Scheduler
的一個0day
提權,先是獲取StartXpsprintJob
的地址,提權原理相關鏈接
之後鏈接到printconfig.dll
來觸發漏洞,然後提升爲系統權限
- 創建進程運行自身
判斷操作系統大於 Win7 以及用於權限大於 Low 之後,獲取自身完整路徑,使用GetShortPathNameW
來避免Unicode
路徑的影響,之後利用wmic
傳入路徑再次啓動自身
- 檢查區域
通過鍵盤佈局檢查區域,某些區域不會執行之後的代碼,直接會刪掉自己然後退出
通過默認的語言判斷區域
- 創建互斥體
一堆花裏胡哨的操作,就爲了創建一個互斥體!好像作者在嘲諷 ahnlab,這個不太瞭解
- 解密必要數據
解密了一些數據,之後初始化 Key 的時候用到了
- 查詢系統信息
通過註冊表檢查了當前用戶組,所在地區,操作系統,系統版本號,CPU信息,以及磁盤類型和磁盤容量
,最重要的是查找了一些常見的殺毒進程
,但僅僅是查找
- 生成隨機字符
使用CryptGenRandom
生成隨機數,運算後得到幾個寬字符,取六個之後轉換爲大寫,拼接到文件名。P.S.文件名就是指導你付款的那個文件的名稱,諸如:TZYLVF-DECRYPT.txt
- 生成公私鑰對
使用CryptGenKey
生成RSA
的公私鑰對,之後用CryptExportKey
導出到內存中
- 公私鑰對寫入註冊表
創建HKEY_LOCAL_MACHINE\\SOFTWARE\\keys_data\\data
再創建public
和private
,將之前的公鑰和公私鑰對分別寫入這兩個子鍵中
- 解密說明信息
解密出之後要寫入XXXXXX-DECRYPT.txt
中的字符串,相當於給用戶的說明書
- 開啓線程準備加密文件
第一個線程會遍歷局域網共享文件
第二個線程會遍歷本地有效磁盤以及移動存儲設備
- 採用的遍歷方法
遍歷局域網與遍歷本地採用的方法都是相同的,先判斷磁盤的有效性,有效則進行下一步遍歷!下一步則必須先滿足不是.
以及..
,然後獲取當前目錄的屬性,是文件夾的話則遞歸遍歷,SQL目錄會進行單獨處理,直到遍歷到文件則利用之前的 RSA 公鑰加密
- 創建說明文件
之前的說明書內容一直在內存中,尚未寫入到文件。在每個目錄遍歷開始時就在當前目錄建立一個文件,文件名就是之前的隨機字符,然後將內存中的說明書寫入文件!除此之外還會建立一個.lock
文件用於記錄加密時的時間
- 加密白名單
加密的白名單主要有三個,一是特定目錄下的文件不加密,諸如:Program Files,Windows,Boot等系統目錄
第二個就是特定的後綴不加密
,動態才能看得到
第三個就是特定的文件不加密
- 執行加密
當遍歷到非白名單文件時,便開始加密文件
- 刪除卷影拷貝
加密完成後,刪除Shadow Copy
,防止普通用戶恢復刪除的未加密原文件
- 設置桌面背景
先創建位圖再寫入顏色數據,之後新建文件寫到文件中,文件在Temp
目錄下,最後使用SystemParametersInfoW
設置該圖片爲桌面背景
- 發送POST請求
創建一個線程,先是解密出網址信息
然後隨機選取字符串拼接網址
我測試時拼接的字符串是http://www.2mmotorsport.biz/includes/pics/zurukafu.jpg
,最後向這個網址發送一個POST請求
- 刪除自身
病毒加密文件完成後會調用cmd延時5s
再刪除自己
第二部分總結
上述的執行流程是病毒體的順序執行流程
,這個勒索病毒主要是釋放時非常隱蔽不好定位,dump 出的病毒體也有花指令影響靜態分析,不過 IDAPython 能去除花指令!雖然如此這病毒的主體還是如此複雜,各種判斷使得病毒的抗干擾性異常強大
,可以運行在 Windows 不同的版本以及運行在不同的國家!一個字形容:強!