前言
病毒分析很心酸,真的會(huì)禿頭。
這個(gè)是關(guān)于Criakl勒索病毒安全預(yù)警:https://baijiahao.baidu.com/s?id=1621544930994823264&wfr=spider&for=pc感謝這些安全專家吧,唉。不說(shuō)了。頭發(fā)真的都掉完了~~~
一:目錄
- 1.目錄
- 2.Ioc
- 3.行為分析
- 4.樣本分析
- 5.技術(shù)總結(jié)
二:IoC
2.1 母文件
- 1.樣本名稱:ab82cb53a9c89f2e808288957be88b38.vir
- 2.樣本md5:ab82cb53a9c89f2e808288957be88b38
- 3.是否加殼:UPX
- 4.編譯語(yǔ)言:vc++
- 5.樣本來(lái)源:來(lái)自于網(wǎng)絡(luò)收集
2.2 子文件
- 1.樣本名稱:3bd50eabb01b9561afa046b34729b104.vir
- 2.樣本md5:3bd50eabb01b9561afa046b34729b104
- 3.是否加殼:無(wú)
- 4.編譯語(yǔ)言:Borland Delphi(2.0-7.0)
- 5.樣本來(lái)源:母文件中釋放而來(lái)
2.3 url
三:行為分析
行為分析:

四:樣本分析
4.1 母體文件(Crikl.d)
- 加載名為ZZZZZ的資源文件,利用ResourceHack查看,可以明顯看到文件被加密了。


- 解密資源文件,解密算法不做分析,直接OD運(yùn)行跑起來(lái)就好了。根據(jù)查看Hex很明顯看出來(lái)這是一個(gè)可執(zhí)行文件

- 在調(diào)試過(guò)程中,發(fā)現(xiàn)病毒并沒有采用明文的方式構(gòu)建字符串,而是將字符串加密了,發(fā)現(xiàn)調(diào)用了幾個(gè)關(guān)鍵的函數(shù)如下,可以知道Criakl使用了較為常見的傀儡進(jìn)程的技術(shù):
- ZwUnmapViewOfSection:解除文件映射關(guān)系
- VirtualAllocEx:分配內(nèi)存空間
- WriteProcessMemory:寫進(jìn)程內(nèi)存
- SetThreadContext:設(shè)置進(jìn)(線)程上下文
- ResumeThread:?jiǎn)酒鹬骶€程


- 根據(jù)PE結(jié)構(gòu)修復(fù)PE節(jié)區(qū)表:不然進(jìn)程是跑不起來(lái)的。如下也符合Delphi程序的節(jié)區(qū)表特性


- 接下來(lái),我們已經(jīng)得到了PE數(shù)據(jù)了,我們需要做的是將惡意代碼dump下來(lái)。如圖:可以發(fā)現(xiàn)這是一個(gè)偽裝成壓縮包的惡意程序,但是這個(gè)程序dump出來(lái)是有問(wèn)題的。


- 但是這個(gè)程序是可以運(yùn)行的,根據(jù)追蹤,發(fā)現(xiàn)他在temp目錄下釋放了一個(gè)ycvA文件,而且發(fā)現(xiàn)這個(gè)文件是一個(gè)PE文件。并且執(zhí)行的流程都和我們dump出來(lái)的一樣。我們有理由懷疑這個(gè)是同一個(gè)文件。



- 巧合的是:我得到兩份Criakl病毒樣本,一份是變種a,一份是變種d,其中釋放出來(lái)的惡意(同dump出來(lái)的文件),和變種a的MD5是一樣的。可以知道病毒作者在變種a的基礎(chǔ)上加了一層保護(hù),形成的變種d。

4.2 子文件(Criakl.a)
程序流程分析
以下是第一種情況:不是由變種d創(chuàng)建的進(jìn)程引發(fā)的。
- 第一步:Dephi程序,直接定位到關(guān)鍵函數(shù)

- 第二歩:利用Iswow64函數(shù)判斷當(dāng)前計(jì)算機(jī)的位數(shù),如果是32位機(jī)器,構(gòu)造Program Files

- 第三步:構(gòu)造c://Program Files//Rarlab目錄

- 第四步:檢查進(jìn)程的默認(rèn)SID,這一步的目的是為了判斷本進(jìn)程是否由Criakl.d創(chuàng)建的進(jìn)程。

- 第五步:如果C://Program Files//RarLab目錄不存在,創(chuàng)建該目錄,用于存放是否的惡意文件

- 第六步:判斷當(dāng)前執(zhí)行的文件是否有RarLab目錄下釋放的惡意文件執(zhí)行的。

- 第七步:如果不是從RarLab下執(zhí)行的惡意代碼,則將當(dāng)前執(zhí)行的惡意樣本寫一份,釋放到RarLab目錄下


- 第八步:將釋放的文件的時(shí)間修改為和svchost.exe一樣,目的還是為了迷惑受害者。

- 第九步:最后執(zhí)行C:Program FilesRarLabyvcA.vir文件
以下是第二種情形:不是由變種d創(chuàng)建的進(jìn)程引發(fā),但是創(chuàng)建進(jìn)程的文件目錄是在RarLab下
- 判斷是否帶有參數(shù)install以及計(jì)算機(jī)的位數(shù),然后設(shè)置注冊(cè)表run鍵,最后執(zhí)行感染流程。但是這里作者是通過(guò)0號(hào)參數(shù)是文件名寫入run鍵下的,但是作者沒有對(duì)獲取的文件名做驗(yàn)證,導(dǎo)致如圖獲取的文件名是位于桌面的分析樣本,實(shí)際中,應(yīng)該是位于RarLab目錄下的樣本。
以下是第三種情況:是由變種d創(chuàng)建的進(jìn)程引發(fā)的。
- 第一步:判斷當(dāng)前進(jìn)程是否是在C:DOCUME~1hackyLOCALS~1TempRarLab目錄下,如果是則執(zhí)行感染機(jī)制,否則創(chuàng)建該目錄,用來(lái)釋放惡意文件。
- 第二歩:和第一種情況相同,修改文件訪問(wèn)時(shí)間,并且創(chuàng)建新的進(jìn)程。然后退出本進(jìn)程
執(zhí)行流程分析
- 判斷C:Program FilesRarLabwinrar.tmp文件是否存在如果winrar.tmp文件存在
- 第一步:讀取winrar.tmp里面的數(shù)據(jù)。然后創(chuàng)建d.bat
- 第二步:之后的這個(gè)判斷永遠(yuǎn)為假,對(duì)其交叉引用發(fā)現(xiàn)只有使用,沒有修改部分,也就是說(shuō)這個(gè)變量是一個(gè)常量字符串。兩個(gè)比較必為假。不知道作者這步的意義是什么?【存疑】
如果winrar.tmp文件不存在
- 第一步:生成36輪次的隨機(jī)數(shù),然后獲取本地時(shí)間,這些隨機(jī)數(shù)和時(shí)間用于以后修改被感染文件的文件名。格式為隨機(jī)數(shù)字符串+日期+時(shí)間+隨機(jī)數(shù)(字符串),
- 第二歩:然后經(jīng)過(guò)9層加密后得到字符串,這個(gè)字符串是形成加密文件的名稱的組成部分以及后期加密用的數(shù)據(jù)元
- 第三步:以Post提交請(qǐng)求,但是這個(gè)網(wǎng)站現(xiàn)在已經(jīng)訪問(wèn)不了了,應(yīng)該執(zhí)行CC服務(wù)器的職責(zé)。
- 第三步:創(chuàng)建RarLab/winrar.zip,內(nèi)容是之前的數(shù)據(jù)數(shù)據(jù)+這次產(chǎn)生的隨機(jī)數(shù)據(jù)
- 第四步:獲取本地磁盤盤符信息,然后進(jìn)行26次循環(huán),遍歷和加密文件
- 第五步:創(chuàng)建d.bat,用于刪除所有的.dat和.exe文件,以及做本地回環(huán)測(cè)試
加密流程分析
整個(gè)加密流程,差不多分析了兩天,里面的工程量異常巨大,頻繁調(diào)用了相同的結(jié)構(gòu),但是這些結(jié)構(gòu)都是采用了隨機(jī)數(shù)進(jìn)行加密,不清楚作者的真實(shí)意圖是什么,經(jīng)過(guò)分析了部分加密樣本的形式,可能存在以下特征(這只是我的個(gè)人猜測(cè)):對(duì)于較小的文件,采用填充隨機(jī)字段+附加數(shù)據(jù)的方式加密文件,對(duì)于大文件,直接附加數(shù)據(jù)的方式加密。
- 首先對(duì)于x://windows目錄不進(jìn)行加密
- 先讀取文件的內(nèi)容,讀取完畢后,在判斷文件末尾是否存在{CRYPTENDBLACKDC}字段
- 進(jìn)行了40輪次數(shù)據(jù)加密,由于程序使用了Randomize(),造成了加密的數(shù)據(jù)很大程度是隨機(jī)的。
- 對(duì)于大文件來(lái)說(shuō),Criakl直接附加額外的數(shù)據(jù),一般是通過(guò)GetPostion函數(shù)獲取的設(shè)備相對(duì)位置和被加密文件的MD5值,并寫入文件的末尾。
- 接下來(lái)將一些數(shù)字寫入,這些數(shù)據(jù)分別代表的參數(shù)由
ReOpenBuff.cBytes
,ReOpenBuff.szPathName
,ReOpenBuff.szPathName[32]
等等。
- 然后寫入一個(gè)通過(guò)兩次設(shè)備相對(duì)位置獲取的一個(gè)字符串32位字符串
- 然后附加一個(gè)隨機(jī)字符+時(shí)間+隨機(jī)字符的機(jī)器ID,以及文件名和結(jié)束的感染標(biāo)志
- 最后修改被感染文件名:filename+id-{id}-email-email@gmail.com-ver-4.0.0.0.cbf
五:技術(shù)總結(jié)
5.1 Delphi程序逆向
首先逆Delphi程序有一個(gè)神器:Delphi_Decompiler,而delphi編譯出來(lái)的PE文件可能會(huì)有CODE,DATA,BSS,.IDAta,tls,.rdata,.rsrc這些段。.rsrc段比較重要,這里除了一般的資源以外,還有工程信息和DFM資源信息,這一節(jié)開始部分是常規(guī)的資源表。Delphi程序(exe)常見的入口點(diǎn)如下,InitExe會(huì)從.rsrc讀取出資源里的drm,然后調(diào)用StartExe來(lái)從InitRoutineTable讀取所有的FunTable,挨個(gè)執(zhí)行對(duì)應(yīng)的Routine。CreateForm創(chuàng)建Form是整個(gè)程序初始化的主要流程:
delphi exe入口:
push ebp
mov ebp, esp
add esp, 0FFFFFFF4h
mov eax, offset InitRoutineTable
call @@InitExe
mov eax, ds:off_442C20
mov eax, [eax]
call unknown_libname_291
mov ecx, ds:off_442AB4
mov eax, ds:off_442C20
mov eax, [eax]
mov edx, off_441498
call @TApplication@CreateForm
mov eax, ds:off_442C20
mov eax, [eax]
call @TApplication@Run
call @@Halt0
單的。先用Delphi_Decompiler查看Form,一旦找到Form,直接在IDA里面跟就能找到具體的函數(shù),最后OD下斷點(diǎn)即可!
Dephi采用的是Fast函數(shù)調(diào)用方式,也就是說(shuō)前面3個(gè)參數(shù)用寄存器EAX,EDX,ECX保存,剩下的參數(shù)利用棧保存,返回值返回的是指針而非數(shù)據(jù),這就需要逆向分析時(shí)先用OD轉(zhuǎn)到Hex窗口,在用里面的地址值去查看具體的數(shù)據(jù)。
參考自:https://www.52pojie.cn/thread-141040-1-1.html
5.2 加密過(guò)程定位
整個(gè)分析過(guò)程中關(guān)于加密過(guò)程所浪費(fèi)的時(shí)間占了60%的時(shí)間。但是也沒有分析出什么特別有效的東西(寫不出解密工具),把我這幾天的小小體會(huì)分享一下。
一拿到函數(shù)流程,很dan疼,可以看到流程異常復(fù)雜,之前的勒索病毒都是利用windows提供的CSP加密,所以加密流程不是很復(fù)雜(比這個(gè)明了)。全篇2600的代碼量也是非常大的了,那么如何去分析呢??
我的做法是先找入口FirstFile,出口FindClose,中間過(guò)程FindNNext。確定了三個(gè)點(diǎn),之后只需要在循環(huán)里面進(jìn)行就好了。然后就是調(diào)試了。
2600多行的代碼調(diào)試起來(lái)相當(dāng)麻煩,所以我先對(duì)其下斷點(diǎn),首先是遞歸函數(shù),一個(gè)斷點(diǎn),有個(gè)rename
下一個(gè)斷點(diǎn),剩下是關(guān)于WriteFile下斷,以及其他的重要的函數(shù)(PS:還要下一個(gè)硬件斷點(diǎn),emmmm忘記在哪里了)如圖:
每當(dāng)停下來(lái)的時(shí)候,就可以利用IDA查看交叉引用了。查看數(shù)據(jù)流的過(guò)程。
原文鏈接:https://www.anquanke.com/post/id/170624