前言
呼,歷時4天半,終于完成了對GandCrab病毒的分析,這個病毒是在52破解ScareCrowL前輩的帖子上參考借鑒而來,漫漫病毒分析之路,任重且道遠,還好,我們擁有巨人的肩膀,讓我們看的更遠更多。
首先講一下,為什么分析這個病毒,在四葉草公司實習,幾天下來,有點厭倦分析病毒這件事了,哇,想到以后還要干好多年,心態炸了。公司峰哥給我了兩個樣本,說現在流行勒索和挖礦病毒,客戶也中過,叫我去試試分析。然后就有了這篇病毒分析報告。頓時,分析出來有不一樣的收獲,這是傳統病毒不一樣的。
一月份,GandCrab勒索軟件首次亮相,這是一種著名的惡意軟件,分布在黑暗網絡上,可能源于俄羅斯,主要針對斯堪的納維亞和英語國家。……(碼字太麻煩了,這里有一份關于GandCrab簡介,了解一下:http://baijiahao.baidu.com/s?id=1599794170709869995&wfr=spider&for=pc)
二:樣本信息
三:行為分析
這個樣本的主要作用就是從資源段中檢索數據,然后把其加載到內存,經過解密,然后調用解密好的shellcode。
shellcode主要是調用LoadLibrary和GetProcAddress。獲取所需要函數的地址,以便后期的生成新的病毒文件
重新開辟內存空間,解密新的PE文件,并把它映射入內存,復制文件頭和各個區表。
修復IAT,這樣就形成了新的病毒文件,命名為PE1.exe
PE1.exe采用dll反射注入技術,利用ReflectiveLoader要完成的任務是對自身的裝載(這一切都是在內存中發生)
調用dll文件的入口點
核心程序的行為
四:樣本分析
通讀代碼,發現EnumResourceNamesA API函數,函數目的是枚舉指定的二進制資源,我們可以猜測程序功能是,枚舉資源文件,然后映射如內存,經過解密,形成shellcode,然后執行shellcode。
修改內存保護設置,映射文件到內存,然后解密shellcode并且執行shellcode。
這是第一層保護
利用PEB,獲取Kernel32.dll的基地址。
獲取LoadLibrary和GetProcAddress的地址,以便在函數中調用其他函數。這個是使用shellcode最先做的兩件事情。
再次申請空間,加載解密后續的病毒代碼,首先加載文件頭,然后遍歷節區,
修改IAT
觀察tmain函數,發現函數流程就是經過三個驗證,最后執行sub_11A8.而這個函數是反射式dll注入的主要的函數。
調用了函數sub_獲取的機器信息和dll導出函數ReflectiveLoader
修改內存保護設置
調用函數ReflectiveLoader,反射式dll注入自身[這是病毒保護自我的重點,了解反射式dll注入的流程]
1.需要獲取被加載到內存dll的基地址,連自己在內存的哪里都不知道,還玩的屁啊
2.利用模塊和函數的Hash來獲取主要函數的地址。
3.分配內存區域,存放dll代碼(之前應該已經注入好了)
4.修復,獲取IAT
5.修復重定位表
6.得到OEP,跳轉到dll文件的OEP地址。
病毒發作的前期:
病毒發作的中期:
病毒發作的晚期:
調用GetInforAndOpenUrl(10007580)獲取系統信息,檢測進程中是否存在指定給的殺毒軟件,然后連接指定的url讀取文件
檢查是否有卡巴斯基和諾頓等殺軟的驅動,先檢查是否存在卡巴斯基的驅動,如果存在,XXX,如果不存在,在檢查其他殺軟的驅動,如果都不存在,那就將自身復制,同時寫入注冊表自啟動項。
將病毒釋放到系統目錄下。
將釋放的文件寫入注冊表Runonce中,以實現病毒的自啟。
由于在進程文件加密的時候,不允許進程占用,所以需要終止某些特定的進程。
產生了支付贖金的贖金ID,這個是由的pc_group和機器識別碼生成的,
同時為了受害者方便交付贖金,提供了安裝洋蔥瀏覽器的教程,臥槽真的貼心。
利用CryptAcquireContextW創建CSP密碼容器句柄
利用 CryptGenKey產生隨機秘鑰
生成密鑰有兩種方式,CryptGenKey(生成隨機密鑰)和CryptImportKey(導入密鑰),病毒使用了CryptGenKey方式。另:Microsoft Base Cryptographic Provider v1.0:密鑰長度為512位。Microsoft Enhanced Cryptographic Provider v1.0:密鑰長度為1024位
加密
銷毀容器
產生特征的編碼字符
將RSA生成的秘鑰和公鑰利用CryptBinaryToStringA函數Base64加密,以便后期網路傳輸。
檢索系統信息,然后再進行Base64編碼。
將獲取的機器信息的Base64編碼連接到秘鑰的后面
讀取之前釋放到Hacky目錄下的病毒,可以是利用后續的函數進行父子進程共享該段數據。
建立管道通信,解析域名,判斷網絡連接是否正常
首先將三個域名傳入。
創建管道連接,管道的作用是實現進程之間的消息交互
利用管道的通信機制,創建一個子進程,命令行參數是nslookup %s ns1.virmach.ru,目的是解析之前穿入的三個域名。讀取文件,判斷是否聯網,如果沒有聯網,readfile的buf存在error信息,程序進程死循環
管道輸入的一般新步驟:
修補可執行文件,我們將一些關鍵A24FF4等跳轉jmp或者nop掉即可實現。
病毒首先需要獲取機器的磁盤驅動器。除了CD-ROM其他的驅動器都被感染,對于搜索到的每個驅動器,釋放一個線程,進行加密。加快加密的速度。
病毒不會感染特殊目錄和特殊格式的文件
然后在驅動器中遍歷,如果是文檔則遞歸調用原函數,負責調用加密函數。
管道通信
檢測進程的安全令牌
利用shellExecute函數執行cmd,參數是/c vssadmin delete shadows /all /quiet,刪除卷影副本,目的是不讓管理員恢復數據。
五:技術總結
GandCrab病毒主要采用到的技術有,shellcode藏匿,利用shellcode的短小的特點,觸發shellcode到內存,減少了被殺毒軟件查殺的風險。經過第一層加密后,病毒釋放了一個惡意代碼文件(PE1.exe),該文件采用的是反射式dll注入技術,該技術不想傳統的dll注入需要在文件系統中產生文件,所要執行的dll全在內存中,這是第二層保護手段。經過兩次dump后,可以得到本次病毒的主體文件,建立了管道,實現子進程和父進程之間的通信。
需要細細的看,參考自:https://zhuanlan.zhihu.com/p/28788521
傳統的dll注入,是在文件系統中存放一個dll模塊,然后進程利用LoadLibrary和CreateRemoteThread這兩個API函數裝載模塊到內存空間,實現注入。而殺軟在布置Hook的時候,重點鉤取的就是這兩種API函數。
反射式dll注入不需要dll文件落地,減少被查殺的風險。首先將需要注入的dll寫入進程內存,然后為該dll添加一個導出函數,利用這個導出函數讓其自動的裝載dll。
主要有兩個方向的問題:第一個如何將dll寫入內存(注射器的實現),第二個如果調用自身(ReflectiveLoader的實現)
參考自:http://www.freebuf.com/articles/system/151161.html
管道是一種用于在進程間共享數據的機制,其實質是一段共享內存,病毒利用了管道進行父子進程的通信,這樣子進程就可以直接影響父進程內存。為實現父子進程間通信,需要對子進程的管道進行重定向:創建子進程函數 CreateProcess中有一個參數STARUIINFO,默認情況下子進程的輸入輸出管道是標準輸入輸出流,可以通過下面的方法實現管道重定向:
STARTUPINFO si; si.hStdInput = hPipeInputRead; //輸入由標準輸入 -> 從管道中讀取 si.hStdOutput = hPipeOutputWrite; //輸出由標準輸出 -> 輸出到管道