如果你想成為一名逆向分析或惡意代碼檢測工程師,或者對系統安全非常感興趣,就必須要認真分析一些惡意樣本,熊貓燒香病毒就是一款非常具有代表性的病毒,當年造成了非常大的影響,并且也有一定技術手段,本文將詳細講解熊貓燒香的行為機理,并通過軟體對其功能行為進行分析,這將有助于我們學習逆向分析和反病毒作業,后續作者還將對其進行逆向除錯,以及WannaCry勒索蠕蟲、各種惡意樣本及木馬的分析,基礎性文章,希望您喜歡!
IDA和OD作為逆向分析的“倚天劍和“屠龍刀”,學好它們的基本用法至關重要,本文重點分析熊貓燒香病毒的功能函式,大家掌握這些技巧后才能更好地分析更多的代碼,同時,本文部分實驗參考姜曄老師的視頻分析,真的非常佩服和值得去學習的一位老師,技術路上哪有享樂,為了提升安全能力,別抱怨,干就對了~

上一篇文章講解了“熊貓燒香”病毒樣本的反匯編代碼入口處的分析,接下來我們分析病毒的核心部,其分析思路基本一致,同時越深入核心部分會遇到越多的API函式,我們將利用OD和IDA工具結合呼叫函式的引數進行分析,它將有助于我們更好地理解病毒行為,同時,將分析出的每一個CALL函式,改為我們能夠理解的名字,這往往也有助于對后續程式的理解,作者結合兩篇文章繪制了一張分析圖,希望加深大家對熊貓燒香的了解,這系列文章寫得不容易,希望大家給點個贊和收藏,也歡迎評論和交流,

從2019年7月開始,我來到了一個陌生的專業——網路空間安全,初入安全領域,是非常痛苦和難受的,要學的東西太多、涉及面太廣,但好在自己通過分享100篇“網路安全自學”系列文章,艱難前行著,感恩這一年相識、相知、相趣的安全大佬和朋友們,如果寫得不好或不足之處,還請大家海涵!
接下來我將開啟新的安全系列,叫“安全攻防進階篇”,也是免費的100篇文章,作者將更加深入的去研究惡意樣本分析、逆向分析、內網滲透、網路攻防實戰等,也將通過在線筆記和實踐操作的形式分享與博友們學習,希望能與您一起進步,加油~
- 推薦前文:網路安全自學篇系列-100篇
文章目錄
- 一.實驗背景
- 二.sub_408024核心函式分析
- 1.sub_40277C子函式
- 2.sub_405684子函式
- 3.sub_403ED4子函式
- 4.sub_4057A4子函式
- 5.分析sub_4057A4后續洗掉功能
- 6.sub_4078E0子函式
- 7.sub_403C44子函式
- 8.sub_403ECC子函式
- 三.總結
一.實驗背景
對病毒進行逆向分析,可以徹底弄清楚病毒的行為,從而采取更有效的針對手段,為了節省篇幅,在這里我不打算將“熊貓燒香”進行徹底的分析,只會講解一些比較重要的部分,大家只要掌握了這些思想,那么就可以處理很多的惡意程式了,
這里主要使用的工具包括:
- PEiD:病毒加殼、脫殼基礎性分析
- IDA Pro:靜態分析
- OllyDbg:動態分析
實驗檔案:
- setup.exe:熊貓燒香病毒
基本流程:
- 利用查殼工具檢查病毒是否帶殼
- 利用OD動態分析病毒
- 利用IDA靜態分析病毒
注意:由于OD工具會將程式運行起來,所以我們在進行惡意代碼分析時盡量在搭建好的虛擬機中操作,如果病毒傳播性較強如WannaCry,建議斷開網路和斷開共享分析,

實驗思路:
- 1.利用OD分析每一個CALL的功能
- 2.使用IDA Pro在宏觀上把握程式的功能并及時對函式進行重命名操作
上篇回顧:
- 0x0040CB7E call sub_403C98
– 重命名為:AllocStackAndCopyString
– sub_403D08:分配記憶體空間
– sub_402650:字串拷貝功能 - 0x0040CB9F call sub_00405360
– 重命名為:DecodeString
– 0x004053CC:回圈入口點
– 0x004053E8:獲取“xboy”解密字符
– 0x00405408:完成異或解密操作 - 0x0040CBAC call sub_404018
– 重命名為:CMPString
– 0x00404041:回圈入口點
– 功能:字串比較“武漢男生感染下載者” - 0x0040CBCC loc_40CBBC
– 功能:字串解密和比較操作,解密字符“whboy”
– DecodeString
– CMPString
二.sub_408024核心函式分析
上一篇文章我們詳細介紹了熊貓燒香病毒起始階段的初始化操作,這篇文章將進入該病毒的核心功能函式,進行相關的逆向分析,Let’s Go!!!
1.sub_40277C子函式
第一步,打開IDA Pro載入我們的病毒樣本,

第二步,定位到loc_40CBE6位置,
這里看到了三個call函式,它們又是什么功能呢?這三個call是熊貓燒香病毒最重要的功能,也是我們接下來要深入逆向分析的內容,
- sub_408024
- sub_40CA5C
- sub_40C97C

第三步,查看函式sub_408024內容,
在這個函式的最開始位置我們看到了將84h賦值給ecx,84h表示回圈的次數,回圈的主體是下面兩個push,其中每一個push能開辟8個位元組(32位)的空間,兩個位元組能獲得16個位元組的空間,這樣的空間一共申請了ecx(84h)次,
- mov ecx, 84h
- push 0
- push 0

第四步,我們主要分析call函式,往下看到第一個函式sub_40277c,

第五步,接著用OD載入exe程式,進行動態的分析,直接跳轉到該地址,
- 0x0040804D call sub_40277C
基本流程為右鍵“轉到”->“運算式”->輸入“0040804D”,按下F2增加斷點,

按F9直接執行到該位置,

該函式我們可以在IDA中先雙擊查看,會發現該函式首先呼叫了GetModuleFileNameA,
- 0x004027A0 call GetModuleFileNameA
- 該函式功能主要是獲取當前行程已加載模塊檔案的完整路徑

第六步,回到OD中sub_40277C函式,按下F7單步進入函式,
接著進入函式后按F8單步步過,可以看到GetModuleFileNameA右下角的內容,在這個PathBuffer里,會保存即將獲取的路徑資訊,
- 0x004027A0 call 00401100
- PathBuffer

接著選中PathBuffer值,右鍵點擊“資料視窗中跟隨”,

注意:按下F8,大家可以在資料視窗中留意該值的前后變化,發現它成功獲取了該樣本的本地路徑,
- C:\Users\14551\Desktop\setup.exe

第七步,我們打開IDA給sub_40277C函式重命名,
小技巧
IDA中雙擊會進入對應的函式,那么如何回傳上一層呢?按下ESC即可回傳,如下圖所示,從GetModuleFileNameA中按ESC回傳sub_40277C位置,而按F5鍵會逆向出C語言程式,

然后選中函式重命名,快捷鍵為N,

總結,重命名及對應功能如下:
- sub_40277C -> GetFilePathAndName
- 功能:獲取檔案的完整路徑及檔案名稱

2.sub_405684子函式
接著往下看,函式如下:
- 0x0040805E call sub_405684

第一步,繼續在OD中進行跟進,
首先我們運算式跳轉到“00408052”位置,然后按下F2增加斷點,按下F9執行過來,

我們首先可以看看它壓入的引數是什么?
第二步,在資料視窗中跟隨EAX,
按下F7單步執行,在暫存器中選中EAX,右鍵“資料視窗中跟隨”,

顯示結果如下圖所示,可以看到EAX中保存的是剛付訓取的病毒檔案完整路徑,

第三步,在資料視窗中跟隨EDX,
按下F7單步執行,在暫存器中選中EDX,右鍵“資料視窗中跟隨”,目前EDX還是空值,

第四步,進入后面的call(00405684),查看它的內容,
先選中EAX右鍵“資料視窗中跟隨”,

然后按下F7進入函式,可以看到這里出現了粗線條,說明它是一個回圈,我們步入回圈分析其內容,

前面按下F8執行,然后到回圈位置按F7步入,
- mov eax, [local.1]

注意這里簡單介紹下區域變數的概念,
小技巧
[LOCAL]是區域變數的意思,例如[LOCAL.1]就是第一個區域變數,存放在堆疊里的[EBP-4]位置,[LOCAL.2]就是[EBP-8],圖片上的命令其實就是MOV EAX, [EBP-4],
方法一:可以在OD的選項->除錯設定->分析里面有個選項把勾去掉設定
方法二:選中該命令右鍵“匯編”即可,但修改后會顯示灰色
第五步,接著分析回圈,
分析陳述句“mov eax, dword ptr ss:[ebp-0x4]”,首先將EBP-4賦值給EAX,而當前的EBP-4就是所獲取的病毒的完整路徑,**
- mov eax, [local.1]
- mov eax, dword ptr ss:[ebp-0x4]

然后再按F8,這里是將EAX加上EBX再減1,其中EAX是病毒完整路徑的首地址,EBX是20,它又是什么呢?
- mov al, byte ptr ds:[eax+ebx-0x1]
我們查看EBX,如下圖所示,凡是由Delphi撰寫的程式,它會在字串減4的位置保存一個數值,這個數值就是字串的長度,我們可以看到當前路徑長度是0x20,
- [eax+ebx-0x1]:計算字串最后一個字母的位置,即“e”,下圖中也顯示出來了“ds:[02140127]=65(e)”

第六步,繼續按F8執行,這里結合IDA分析分析0x5C、0x2F、0x3A對應的值,
我們在0x004056B4看到有一系列的比對,然后右鍵分別選中0x5C、0x2F、0x3A,決議成對應的值,或者選中按下R鍵,

5C代表斜杠(\),2F代表反斜杠(/),3A代表冒號(:),

小結,該回圈是將病毒所在完整的路徑從后向前檢索,直到遇到斜杠(\)、反斜杠(/)、冒號(:)結束,結合病毒來看,它找斜杠的位置,其實這段程式要么是想不包含病毒檔案名的路徑,要么想獲取病毒的檔案名(setup.exe),

第七步,在OD中繼續按F8除錯,注意觀察資料視窗的變化,
發現該程式不斷地從后往前獲取路徑資訊,并進行對比,

接著發現程式在呼叫完call函式之后,會出現一個新的字串,事實上很明顯,它是想獲取去除病毒檔案名后的路徑,可見,程式將去除了檔案名的路徑拷貝到了之前申請的空間中,于是可以將sub_405684重命名,
- 0x004056D8 call 0040412C

總結,重命名及對應功能如下:
- sub_405684 -> GetFilePath
- 功能:獲取去除病毒檔案名后的路徑
- IDA位置:0x0040805E

3.sub_403ED4子函式
第一步,繼續在OD中往下分析代碼,賦值陳述句,
回傳的第一句代碼是將我們之前所獲取的不帶檔案名的地址賦值給EAX,
- lea eax, dword ptr ss:[ebp-0x3B4]

我們選中EAX在資料視窗中跟隨,可以看到對應的值是“02140138”,

對應的值如下圖所示,即不帶檔案名的檔案路徑,現在EAX保存的就是這個地址,

第二步,繼續分析代碼,接下來將“Desktop_.ini”賦值給EDX,注意,0x44表示為D(十進制68對應的ASCII碼),
- mov edx, 0x40862C

第三步,通過IDA大致看看call函式00403ED4,
- 0x0040806E call sub_403ED4

但是通過這個很難分析出它的具體功能,我們不妨只關注它的兩個引數,觀察執行完該函式后的引數位置有什么變化,
第四步,我們留意著資料視窗,然后按F8執行,
可以看到剛才所獲取的不帶檔案的路徑名,在其后面增加了一個“Desktop_.ini”,從而組成了新的字串,

分析這里我們就知道sub_403ED4功能是將上面所獲取的不帶檔案名的路徑的地址賦值給eax,然后將字串“Desktop_.ini”的地址賦給edx,
總結,重命名及對應功能如下:
- sub_403ED4 -> StringCat
- 功能:拼接字串,包含“Desktop_.ini”后綴

同樣,我們可以進入sub_403ED4進行詳細分析,

4.sub_4057A4子函式
接著繼續分析sub_4057A4子函式功能,
- 0x00408079 call sub_4057A4

第一步,我們在OD中查看EAX的地址,
在這里我們跟蹤查看這個地址,選中堆疊數值,右鍵“資料視窗中跟隨數值”,

可以看到,它的這個引數是我們之前已經連接好的字串的首地址,
- 0x020F0138

第二步,按下F8運行至Call 4057A4函式,再按F7進入該函式分析,

繼續按下F7進入call 0040573C,發現有個FindFirstFileA函式,我們直接來看看它的引數,注意,很多時候右邊注釋內容是沒有的,需要我們手動分析,

按下F8執行到函式呼叫前位置,可以看到EAX中存放是的是剛才連接出來的字串,該函式的作用就是說明要查找當前目錄下Desktop_.ini檔案是否存在,
- C:\Users\14551\Desktop\Desktop_.ini

總結,重命名及對應功能如下:
- sub_4057A4 -> CheckFileExist
- 功能:檢測檔案“Desktop_.ini”是否存在

5.分析sub_4057A4后續洗掉功能
接著我們繼續分析,由于之前進行了重命名操作,所以代碼的可讀性更好了,從0x00408079位置下面的代碼我們都能看懂,
- 0x0040807E test al, al
- 0x00408086 push 80h
- 0x 004080C5 call SetFileAttributesA
它會根據上一段代碼的查找結果進行判定al,即如果當前目錄下Desktop_.ini檔案存在,那么就會呼叫SetFileAttributesA函式,該函式會改變他的屬性,將它的屬性改為80h所代表的值,即該檔案的檔案屬性調整為NORMAL(正常屬性),

繼續往下看, 呼叫了一個Sleep函式停止1毫秒,停止1毫秒之后,它接著呼叫DeleteFileA函式將Desktop_.ini洗掉,正常來講,病毒還沒有運行的時候,這個Desktop_.ini檔案應當是不存在的;如果存在的話,病毒首先會改變這個檔案的屬性,再將這個病毒給洗掉掉,
- push 1
- call Sleep
- call DeleteFileA

這里看到一個未知函式sub_4040CC,它的引數是[ebp+var_3C4],事實上3C4就是檔案的路徑,將檔案路徑賦值給EAX,我們進入sub_4040CC函式,發現其功能:
- 驗證EAX是否存在,即判定檔案的路徑是否為空
如果檔案不存在它會直接執行loc_408110位置的函式,sub_4040CC其實就是一個驗證機制,在IDA中按下ESC回傳,我們給它進行重命名,

總結,重命名及對應功能如下:
- sub_4040CC -> CheckPathIsExist
- 功能:檢測檔案的路徑是否存在

6.sub_4078E0子函式
繼續往下分析,我們看到sub_4078E0函式,
- 0x00408126 call sub_4078E0

第一步,我們在IDA中大致看下函式的內容,
我們可以看到這個函式非常的長,且也呼叫了很多其它的函式,那么看上去很難分析清楚這個函式到底是做什么的,這里我們先不管其具體的實作細節,只看看該函式執行完后,這些引數或暫存器位置發生了什么變化,主要關注該函式執行前后,程式使用了哪些暫存器,

第二步,打開OD跳轉到40811D位置,按下F2增加斷點,再按F9執行過來,
注意,病毒逆向分析就是呼叫IDA和OD反復除錯的程序,

第三步,在OD中分析具體代碼,
- mov eax, dword ptr ss:[ebp-0x3CC]
- lea edx, dword ptr ss:[ebp-0x4]
- call 004078E0
首先它是將EBP-3CC賦值給EAX,再將EBP-4賦值給EDX,呼叫call函式,

我們現在按F8來步過這個call函式,再觀察資料視窗中存在什么變化,可以看到執行完call函式后,這個函式用了很大一片區域寫入了非常多看似無意義的字符,結合右邊的ASCII碼,可以將這些內容理解為暴力P解的字典,
- 病毒的撰寫者企圖利用暴力P解的方式來攻破計算機中某些驗證機制

當然這些內容還是非常多的,病毒作者也寫入了很多其他資訊,有興趣的作者可以好好分析下,這些資訊有助于我們獲取病毒的行為資訊,只有當我們深入分析其原理和實作程序,才有助于我們獲取病毒的行為資訊,


總結,重命名及對應功能如下:
- sub_4078E0 -> WriteVirusInfoToMem
- 功能:寫入病毒資訊到記憶體中,病毒作者企圖利用暴力P解的方式,來攻破計算機中的某些驗證機制

7.sub_403C44子函式
繼續在OD中分析sub_403C44子函式,
第一步,查看[EBP-8]地址對應的值,
在資料視窗中,可以看到eax的值為ebp+var_8的地址,通過OD可以知道,這個地址中保存的是0,可以理解為沒有資料,
- 00 00 00 00

第二步,我們按下F7進入這個call,查看具體內容,
- 0x0040812E call 00403C44

可以看到,它首先是將EAX的內容賦值給EDX,我們按下F8可以看到EDX也變成了0值,
- mov edx, dword ptr ds:[eax]

之后的test運算,使得ZF變為1,滿足跳轉條件,直接跳轉至retn,那么本段函式也就結束了,

剛才我們通過test edx, edx發現ZeroFlag標志位變成了1,這個標志位變為1,說明這個值是一個0,這段函式似乎并沒有實作什么特別清晰具體的功能,那么不妨將這個操作理解為某種標志的設定,

總結,重命名及對應功能如下:
- sub_403C44 -> SetZeroFlag
- 功能:設定零標志位重設,將其設定為0

8.sub_403ECC子函式
回到OD,我們分析sub_403ECC子函式,
第一步,查看并分析[EBP-4]保存的內容,
- mov eax, dword ptr ss:[ebp-0x4]

在資料視窗中跟隨,可以看到“MZP”,這里大致是保存了一個PE檔案,事實上就是將這個PE檔案的首地址賦值給這個EAX,接著看看這個call,

第二步,分析call 403ECC函式,
按下F7進入這個call函式,首先呼叫“TEST EAX, EAX”驗證PE檔案是否存在,

按下F8繼續,這里是跳轉不成立,然后出現在EAX-4位置,我們在資料視窗中跟隨內容,
- mov eax, dword ptr ds:[eax-0x4]
小技巧
這里需要特別強調的是,由于本病毒程式是使用Delphi撰寫的,因此字串的首地址減去4后,所取出的4個位元組的內容就是此字串的長度,
換句話說,這段代碼中的[eax-4]就是eax所指向的檔案長度,字串長度就是EC00,這條陳述句就是將EC00保存在暫存器里面,于是可以將sub_403ECC重命名,
- 字串長度:EC00
- 現在EAX保存的就是字串的長度,即PE檔案的長度


總結,重命名及對應功能如下:
- sub_403ECC -> GetFileLen
- 功能:獲取PE檔案的長度
之前這個檔案的長度是保存在EAX里面,這里又將檔案長度賦值給EBX,

接下來,在獲取檔案長度后,程式會跳轉到loc_408163處執行,首先它會驗證EBX是否為零(檔案長度是否為0),正常來說檔案長度是不為0的,也就是這個檔案是真實存在的,所以接下來的跳轉不成立,會繼續往下執行,
- test ebx, ebx
- jle short loc_408171
- mov eax, [ebp+var_4]

接著我們嘗試用OD進行分析,跳轉到0x00408163的位置,按下F2增加斷點,再按F9讓它執行過來,

按F8跳轉不成立繼續執行,可以看到將[EBP-4]賦值給EAX,事實上就是讓EAX重新指向這個PE檔案的起始位置,
- mov eax, dword ptr ss:[ebp-0x4]

按下F8繼續執行,這里是將 [EAX+EBX-1],由于EAX指向的是檔案起始地址,而EBX是檔案的長度,減一是獲取整個PE檔案最后一個字符它是什么,事實上,CMP陳述句就是驗證這個檔案最后一個資料它是否為零,如果為0,則接下來的跳轉不成立,
- cmp byte ptr [eax+ebx-0x1], 0x0

經過OD的動態分析發現,因為這里顯示跳轉未實作,故檔案尾端的值為0,所以不執行跳轉,繼續向下執行,

三.總結
寫到這里,該部分關于sub_408024核心函式的部分功能就介紹完畢,請大家一定要動手跟著除錯,先感受下這部分的實驗,后面的文章我們將繼續分析熊貓燒香病毒感染的程序,

再次感謝姜曄老師,經過這篇文章的討論,我們詳細除錯了病毒的各個模塊,當然,整個病毒的所有功能都沒時間完全概述,文章更多是提供一種惡意樣本分析的方法和思路,帶領大家入門,正如姜老師所說“只要各位讀者勤于動手,并將所講的逆向分析的基本原理搞清楚,那么這個病毒分析根本不在話下”,
最后簡單總結這篇文章的逆向程序,主要分析sub_408024核心函式,
- 0x0040804D call sub_40277C
– 重命名為:GetFilePathAndName
– 功能:獲取檔案的完整路徑及檔案名稱 - 0x0040805E call sub_405684
– 重命名為:GetFilePath
– 功能:獲取去除病毒檔案名后的路徑
– IDA位置:0x0040805E
– 技巧:回圈將病毒的完整路徑從后往前檢索,直到遇到斜杠(\)、反斜杠(/)、冒號(:)結束,從而提取病毒的路徑或病毒的檔案名(如setup.exe) - 0x0040806E call sub_403ED4
– 重命名:StringCat
– 功能:拼接字串,包含“Desktop_.ini”后綴 - 0x00408079 call sub_4057A4
– CheckFileExist
– 功能:檢測檔案“Desktop_.ini”是否存在 - 0x00408105 call sub_4040CC
– CheckPathIsExist
– 功能:檢測檔案的路徑是否存在 - 0x00408126 call sub_4078E0
– WriteVirusInfoToMem
– 功能:寫入病毒資訊到記憶體中,病毒作者企圖利用暴力P解的方式,來攻破計算機中的某些驗證機制 - 0x0040812E call sub_403C44
– SetZeroFlag
– 功能:設定零標志位,將其設定為0 - 0x00408136 call sub_403ECC
– GetFileLen
– 功能:獲取PE檔案的長度 - CMP陳述句就是驗證PE檔案最后一個資料是否為零
再給出這張圖,希望加深大家對熊貓燒香的了解,這系列文章寫得不容易,您的點贊、評論、收藏將是對我最大的支持,感恩安全路上一路前行,如果有寫得不好或侵權的地方,可以聯系我洗掉,基礎性文章,希望對您有所幫助,作者目的是與安全人共同進步,加油~

學安全一年,認識了很多安全大佬和朋友,希望大家一起進步,這篇文章中如果存在一些不足,還請海涵,作者作為網路安全和系統安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章,同時非常感謝參考文獻中的安全大佬們的文章分享,深知自己很菜,得努力前行,編程沒有捷徑,逆向也沒有捷徑,它們都是搬磚活,少琢磨技巧,干就對了,什么時候你把攻擊對手按在地上摩擦,你就贏了,也會慢慢形成了自己的安全經驗和技巧,加油吧,少年希望這個路線對你有所幫助,共勉,
2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大資料分析、網路空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的演算法實作,娜璋之家會更加系統,并重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝,
(By:Eastmount 2020-12-19 星期六 下午6點寫于武漢 http://blog.csdn.net/eastmount/ )
參考文獻:
姜曄老師真的非常佩服和值得去學習,包括他蘇寧到卡巴斯基的故事,推薦大家去閱讀,也希望自己和大家的技術能不斷提升,加油!
[1] 姜曄老師技術分享 - B站
[2] 姜曄老師的技術空間目錄 - CSDN
[3] [網路安全自學篇] 木馬原理詳解、遠程服務器IPC $漏洞及木馬植入實驗
[4] 騰訊安全聯合實驗室 - 知乎文章
[5] [網路安全自學篇] 七十九.Windows PE病毒原理、分類及感染方式詳解
[6] [網路安全自學篇] 四十九.Procmon軟體基本用法及檔案行程、注冊表查看
[7] [安全攻防進階篇] 八.那些年的熊貓燒香及PE病毒行為機理分析
[8] [網路安全自學篇] 七十三.WannaCry勒索病毒復現及分析(四)蠕蟲傳播機制原始碼詳解
[9] https://blog.csdn.net/ioio_jy/article/details/41207265
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238540.html
標籤:java


