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

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

二.PEiD加殼檢查
我們在分析病毒之前,首先需要呼叫工具檢查是否帶殼,如果病毒還需要先進行脫殼操作,這次研究的“熊貓燒香”程式并沒有加殼,但后續的文章我會詳細分享加殼與脫殼的內容,更好地幫助大家理解病毒分析及保護措施,
首先打開PEiD工具人,然后將熊貓燒香病毒拖進去,會發現病毒的基本資訊,

分析資訊如下:
- 該程式并沒有加殼,采用Delphi Borland Delphi 6.0-7.0撰寫
注意,這里補充姜老師對Delphi撰寫代碼和VC++撰寫代碼的理解,
- 區別:Delphi在函式呼叫時引數的傳遞不完全用堆疊,主要用暫存器,而C++程式函式呼叫前會使用push陳述句將引數入堆疊,然后再進行call,Delphi一般將第一個引數放入eax暫存器,第二個引數放入edx,第三個引數放入ecx暫存器,其余引數按照與VC程式類似的方式壓堆疊,總之,Delphi編譯器默認以register方式傳遞函式引數,這一點與VC編譯的程式完全不同,
- 提示:堆疊上給區域變數分配空間的時候,堆疊是向下增長的,而堆疊上的陣列、字串、結構體等卻是向上增長的,理解這一點可以幫助識別堆疊上的變數,
三.IDA靜態分析和OD動態分析
當我們完成病毒樣本的檢測后,接下來就需要使用反匯編工具進行分析了,
1.基本載入
第一步,使用IDA Pro載入病毒樣本,

下圖為Delphi自己生產的內容,并不是我們關心的重點,我們更關心病毒程度的功能代碼,本文主要講解病毒的關鍵函式,

第二步,定位到0x0040CB7E位置,發現這兩個call是呼叫了同一個函式sub_403C98,
- 0x0040CB7E
- sub_403C98

注意:某些病毒在IDA中會自動分析出字串“感謝艾瑪…”,并且是在呼叫sub_403C98函式之前,我們可以推測上面那個函式也傳遞了一個字串,接著可以通過OD動態除錯獲取字串對應的值,

但是,我目前的IDA并沒有自動決議出字串的值,只能通過經驗進行分析或OD動態除錯,我們發現EBP是堆疊基址,接近著兩次呼叫sub_403C98函式,前面的mov賦值經過是引數傳遞的作業,從而猜測出它的功能是:引數傳遞給函式呼叫,

2.sub_403C98函式分析
第三步,呼叫OD進行動態分析,查看sub_403C98函式呼叫前傳遞的引數,
- 0x0040CB79
- sub_403C98

打開OD如上圖所示,我們需要定位到0x0040CB79位置,直接按F8執行代碼(單步步過),當執行到0x0040CB79位置可以看到對應的值為“武漢男生感染下載者”,

當然某些OD不會顯示該值,只會顯示“0040CC40=setup.0040CC40”,此時需要我們進一步在資料視窗跟隨,
- 資料視窗右鍵->轉到->運算式

接著輸入“40CC40”,查找傳遞引數對應的值,

顯示結果如下圖所示,可以看到“武漢男生感染下載者”,包括“艾瑪…”,這就是病毒作者的資訊,早些年病毒作者處于炫耀目的,都會加入一些自己的特征,同樣,現在APT攻擊溯源也會通過檔案路徑等獲取病毒作者的資訊,
- 0x0040CC40

第四步,分析病毒程式利用00403C98函式做了什么,
- call 00403C98

接著再這個位置(0x0040CB7E)按下F2增加斷點,然后按F9執行過來,按下F7進入call函式,進入的函式如下圖所示,

接著按F7執行,遇到call 00403D08繼續按下F7進入,再進入call 00402520,繼續進入,
- call 00403D08
- call 00402520
- call dword ptr ds:[0x40D030]
- call 00401860



當進入call 00401860函式后,我們分析這里的兩個API函式,它是對互斥空間進行初始化,
- 00401876 . E8 39F9FFFF call 004011B4 ;InitializeCriticalSection
- 00401889 . E8 2EF9FFFF call 004011BC ;EnterCriticalSection

我們繼續按下F8單步步過執行往下分析,發現在0x004018B3位置呼叫LocalAlloc函式,該函式用于記憶體分配,它會分配大小為FF8的空間,Flags為LMEM_FIXED表示分配一個固定的記憶體,該函式執行結果會回傳一個指向新分配的記憶體物件的句柄,
- LocalAlloc

寫到這里,基本就確定了這個call 00403D08的功能,即分配一定大小的記憶體空間,我們已經進入了好幾層Call,那怎么回傳的呢?接下來我們再回到IDA進行分析,
第五步,打開IDA進入sub_403C98函式,
- 0x0040CB7E call sub_403C98

整個sub_403C98函式由兩個函陣列成,剛才我們所進入的是第一個call sub_403D08的位置,并且分析了其功能是分配一定大小的空間,接著我們嘗試分析下一個函式sub_402650,
- 0x00403CB3 call sub_402650

接著記住這個地址“403CB3”,我們回到OD進行動態除錯分析其功能,
- 轉到->運算式->輸入403CB3


顯示結果如下圖所示,然后我們按下F2增加斷點,再按F9執行程式至此處,繼續按下F7單步進入該函式,

第六步,分析sub_402650函式的功能,
上一步最終顯示結果如下圖所示,需要注意的是REP位置,

按下F8單步步過執行至0x0040267D位置,
- 0x0040267D rep movs dword ptr es:[edi],dword ptr ds:[esi]
注意,該REP是將ESI指向地址的值以4位元組方式拷貝到EDI指向的地址中,下圖展示了ESI和EDI,重執行ECX次,每次執行后ESI+4、EDI+4、ECX-1,OD中在這段代碼中下斷后按F7單步步入就可以觀察到這3個暫存器的變化,
- ecx=00000008 (十進制 8.)
- ds:[esi]=[0040CC5C]=2A2A2ADF
- es:[edi]=[021C0028]=00000000

我們先看看它復制的內容是什么,選擇ESI右鍵“資料視窗鐘跟隨地址”,

ESI顯示“武漢男生”資訊,所要復制的空間是EDI為空白空間,


按下F8運行后發現該空間被賦值“武漢男生”,寫到這里,基本確定了sub_402650函式功能就是字串的復制,

總結,Sub_403C98主要包括兩個函式,其對應功能如下:
- sub_403D08:分配記憶體空間
- sub_402650:字串拷貝功能

同時,我們可以在IDA中對sub_403C98進行重命名操作,命名為“AllocStackAndCopyString”,重命名能將整個程式中該函式進行修改,便于我們理解及分析整個病毒,
sub_403C98函式有兩個引數,由于采用的是Delphi編譯器,因此在反匯編中,第一個引數保存在eax中,第二個引數保存在edx中,這個函式首先完成堆空間的申請,然后將edx中保存的字串復制到新申請的空間中,這個函式在最初賦值的時候,eax的值均為0,而在執行后,eax中保存的就是新申請的堆空間中,所復制的字串的首地址,為了易于觀察,我把IDA Pro中的sub_403C98重命名為AllocStackAndCopyString,

下面補充一段姜老師的注釋,對大家逆向分析和匯編理解很有幫助,
CODE:00403C98 sub_403C98 proc near ; CODE XREF: sub_403ED4+8j
CODE:00403C98 ; sub_403F18+6j ...
CODE:00403C98 test edx, edx
; 對edx進行驗證,這里的test相當于and,不同的是test只進行比較,而不會將結果保存
; 在edx中,由于edx保存的是病毒作者所撰寫的一段字串,因此這里的結果一定是非0的,
CODE:00403C9A jz short loc_403CC0
; 由于上一條陳述句的結果是非0的,因此這條跳轉陳述句并不會被執行到,
CODE:00403C9C mov ecx, [edx-8]
; 利用OD進行動態分析可知,[edx-8]是將edx-8這個地址中的值取出來,賦給ecx,那么賦值
; 完以后,ecx的值為0x0FFFFFFFF,
CODE:00403C9F inc ecx
; ecx自增1,那么ecx的值就變為了0x0,注意這個自增的運算會使得ZF的值變為1,
CODE:00403CA0 jg short loc_403CBC
; 這里的jg表明不大于則跳轉,或者更準確地說,其跳轉條件是SF=OF且ZF=0,由于經過上一步
; 的運算,ZF=1,因此本跳轉不成立,
CODE:00403CA2 push eax
CODE:00403CA3 push edx
CODE:00403CA4 mov eax, [edx-4]
; 經過賦值后,eax中保存的值為0x20,
CODE:00403CA7 call sub_403D08
; 結合OD在虛擬機中進行動態分析,進入一層又一層的呼叫可以得知,這個CALL主要是呼叫了
; LocalAlloc函式,它從堆中分配大小為0xFF8的空間,函式引數uFlags=0,即
; LMEM_FIXED,意思是分配固定記憶體,回傳值是指向一個記憶體物件的指標,LocalAlloc函式
; 如果執行成功則回傳一個指向新分配的記憶體物件的句柄,
CODE:00403CAC mov edx, eax
CODE:00403CAE pop eax
CODE:00403CAF push edx
CODE:00403CB0 mov ecx, [eax-4]
CODE:00403CB3 call sub_402650
; 結合OD在虛擬機中進行動態分析,這個CALL的主要功能是將之前保存在edx中的字串(病
; 毒資訊與作者感言)拷貝到上面所分分配的堆空間中,如圖5所示,
CODE:00403CB8 pop edx
CODE:00403CB9 pop eax
CODE:00403CBA jmp short loc_403CC0
3.sub_405360函式分析
第七步,繼續從0x0040CB92位置往下分析,將該地址復制到OD中動態除錯,

操作如下:
- 轉到->運算式->輸入“40CB92”
- 按下F2增加斷點
- 按下F9執行,將代碼除錯到該位置

然后按F8單步執行,可以看到0x0040CB9A存盤的值,某些情況還需要去資料視窗跟隨,
- 資料視窗右鍵->轉到->運算式->輸入40CCA4

可以發現在“40CCA4”位置保存了一段字串,它可能是一段亂碼,目前無法分析它的含義,

繼續按下F8執行到0x0040CB9F,按下F7進入函式,
- 0x0040CB9F call 00405360

進入后先簡單瀏覽下這個函式,發現后續有一個粗線回圈,我們在0x004053CC下個斷點跳轉到這個回圈處,并進入回圈,
- F2按下在0x004053CC處增加斷點
- F9執行到回圈處
- F8進入回圈

按下F8單步執行代碼,此時發現字串“xboy”,我們暫時不知道它是做什么的,

接著繼續按下F8除錯,發現它將字母“b”賦值給了EAX,我們懷疑它跟“xboy”有關,

接下來的代碼分析如下:
- MOV ECX, 0xA
將常量“A”賦值給ECX,通常存在兩種可能性,一種可能是ECX作為回圈的此時,即可能回圈A次;另一種可能是EXC作為一個運算的除數, - XOR EDX, EDX
異或操作將自身清空, - DIV ECX
可以發現它是一個除法操作,除數即為ECX,結果顯示如下圖所示,除法的商EAX為9,余數EDX為8,
通常除法有兩種可能,要么獲取EAX的商值,要么獲取余數EDX的內容,那么這個程式究竟需要哪一個值呢?
- MOVX eax, byte ptr ds:[eax+ebx-0x1]
該陳述句將值賦給EAX,所以上述程式做除法的目的是獲取EDX這個值,

接著在資料視窗中跟隨地址,查看這個值保存的是什么內容,

輸出結果如下圖所示,它是剛才我們發現的亂碼,暫時還不知道它的具體作用,繼續按下F8執行程式,
- XOR EDX, EAX
EDX和EAX異或操作,其值保存在EDX中,即除法的余數EDX和亂碼EAX進行異或操作,

繼續按下F8單步走,在0x00405408處出現了個地址,我們在資料視窗中跟隨數值,

發現這個結果是“2A”,該值正式剛才異或出來的EDX結果,

接著我們嘗試在下列兩個位置增加斷點,
- 0x004053E8
- 0x00405408

接著按下F9運行,查看輸出的結果,分析如下:
- 將“xboy”的第三個字母“o”取出解密
- 資料視窗新增很多內容,完成字串拷貝


反復繼續按F9除錯,發現它依次獲取“xboy”中的值,再進行異或操作,


小結:最終解密的值如下圖所示,“武漢男生感染下載者”逐漸出現,sub_405360函式我們在IDA中重命名為“DecodeString”,即解密字串,


補充匯編代碼:
CODE:004053D1 loc_4053D1: ; CODE XREF: sub_405360+B5 j
CODE:004053D1 mov eax, [ebp+var_14]
CODE:004053D4 call sub_403ECC
CODE:004053D9 push eax
CODE:004053DA mov eax, ebx
CODE:004053DC pop edx
CODE:004053DD mov ecx, edx
CODE:004053DF cdq
CODE:004053E0 idiv ecx
CODE:004053E2 mov edi, edx
CODE:004053E4 inc edi
CODE:004053E5 mov eax, [ebp+var_14]
CODE:004053E8 movzx eax, byte ptr [eax+edi-1]
; 每次回圈逐位元組取出“xboy”中的字符進行運算,注意這里首先取出的是“b”,
CODE:004053ED mov ecx, 0Ah
; 將ecx賦值為0x0A,作為接下來除法運算的除數,
CODE:004053F2 xor edx, edx
; 清空edx,
CODE:004053F4 div ecx
; 做除法運算,商保存在eax中,余數保存在edx中,
CODE:004053F6 mov eax, [ebp+var_4]
; 這里由于給eax重新賦值,說明程式實際想使用的是edx中的余數,
CODE:004053F9 movzx eax, byte ptr [eax+ebx-1]
; 每次回圈逐位元組取出亂碼中的字符,賦值給eax進行接下來的運算,
CODE:004053FE xor edx, eax
; 異或運算,結果保存在edx中,也就是通過運算最終得出的字符,
CODE:00405400 lea eax, [ebp+var_18]
CODE:00405403 call sub_403E2C
CODE:00405408 mov edx, [ebp+var_18]
CODE:0040540B lea eax, [ebp+var_10]
CODE:0040540E call sub_403ED4
CODE:00405413 inc ebx
CODE:00405414 dec esi
CODE:00405415 jnz short loc_4053D1
4.sub_404018函式分析
第八步,繼續分析sub_404018函式的功能,
記住地址0x0040CBA4,復制到OD中進行除錯,

首先取消剛才解密的兩個斷點,然后跟隨運算式“40CBA4”,在該位置按下F2增加斷點,然后F9執行過來,

首先看到兩條賦值陳述句,將值賦給EDX和EAX中,由于這個程式是使用Delphi撰寫,所以在call之前會將引數放到暫存器中,我們首先看看EDX中的內容,

在資料視窗中跟隨數值,發現它們都是“武漢男生感染下載者”,注意第一個是我們剛才解密出來的內容,
- 0040CBA4 . 8B55 EC mov edx,dword ptr ss:[ebp-0x14]
- 0040CBA7 . A1 D4E74000 mov eax,dword ptr ds:[0x40E7D4]


接著按下F8執行,再按F7進入Call 0040018函式,大致瀏覽該函式后,發現又存在一個回圈,我們的重點就是分析該回圈,按下F2增加斷點,再按F9執行過來,
- 0x00404041

在資料視窗中跟隨,發現ECX和EBX就是剛才所說的兩個引數,一個是原始的“武漢男生感染下載者”,另外一個是解密之后的“武漢男生感染下載者”,再按F8發現這個函式比較兩個字串是否相同的操作,
- CMP ECX, EBX

總結:回到IDA,我們將函式sub_404018重命名為字串比較函式“CMPString”,

5.loc_40CBBC功能分析
第九步,分析loc_40CBBC功能,
繼續往下看,發現只要CMPString兩個字串相同,就會跳轉到loc_40CBBC的位置,

繼續分析發現這里同樣存在字串解密和字串比較的操作,并且解密字符編程了武漢男孩(whboy),這里不再進行解讀,

解密比較成功之后,繼續跳轉到loc_40CBE6的位置,這里看到了三個call函式,它們又是什么功能呢?這三個call是熊貓燒香病毒最重要的功能,我們下一篇論文繼續分析,

四.總結
寫到這里,熊貓燒香病毒起始階段的逆向分析就介紹完畢,簡單總結如下:
- 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
后續會繼續分析熊貓燒香病毒的核心功能三個函式,正如姜老師所說“由于反匯編代碼總會出現各種呼叫與跳轉,所以分析時會顯得很是凌亂,可能會打消大家的積極性,但也可以看見逆向分析作業需要各位讀者的耐心與細致,需要大家沉得住氣,不斷跟蹤每一個可疑的CALL;需要大家時刻留意暫存器中的內容,才能夠找到我們需要的資訊,當然經驗也是非常重要的,” 再次感謝姜老師的分享,真的受益匪淺,也希望自己不斷深入,真正能在逆向分析和惡意代碼中學到東西,加油!
學安全一年,認識了很多安全大佬和朋友,希望大家一起進步,這篇文章中如果存在一些不足,還請海涵,作者作為網路安全和系統安全初學者的慢慢成長路吧!希望未來能更透徹撰寫相關文章,同時非常感謝參考文獻中的安全大佬們的文章分享,深知自己很菜,得努力前行,編程沒有捷徑,逆向也沒有捷徑,它們都是搬磚活,少琢磨技巧,干就對了,什么時候你把攻擊對手按在地上摩擦,你就贏了,也會慢慢形成了自己的安全經驗和技巧,加油吧,少年希望這個路線對你有所幫助,共勉,
2020年8月18新開的“娜璋AI安全之家”,主要圍繞Python大資料分析、網路空間安全、人工智能、Web滲透及攻防技術進行講解,同時分享CCF、SCI、南核北核論文的演算法實作,娜璋之家會更加系統,并重構作者的所有文章,從零講解Python和安全,寫了近十年文章,真心想把自己所學所感所做分享出來,還請各位多多指教,真誠邀請您的關注!謝謝,
(By:Eastmount 2020-12-08 星期二 晚上9點寫于武漢 http://blog.csdn.net/eastmount/ )
參考文獻:
姜曄老師真的非常佩服和值得去學習,希望自己和大家的技術能不斷提升,加油!
[1] [網路安全自學篇] 木馬原理詳解、遠程服務器IPC $漏洞及木馬植入實驗
[2] 姜曄老師的技術空間目錄 - CSDN
[3] 騰訊安全聯合實驗室 - 知乎文章
[4] [網路安全自學篇] 七十九.Windows PE病毒原理、分類及感染方式詳解
[5] 姜曄老師技術分享 - B站
[6] [網路安全自學篇] 四十九.Procmon軟體基本用法及檔案行程、注冊表查看
[7] [安全攻防進階篇] 八.那些年的熊貓燒香及PE病毒行為機理分析
[8] [網路安全自學篇] 七十三.WannaCry勒索病毒復現及分析(四)蠕蟲傳播機制原始碼詳解
[9] https://blog.csdn.net/ioio_jy/article/details/41207265
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/231995.html
標籤:其他
上一篇:介面測驗面試題總結
