1. 程式人生 > 實用技巧 >神操作:教你用Python識別惡意軟體

神操作:教你用Python識別惡意軟體

在本文中,我們將介紹惡意軟體靜態分析的基礎知識。靜態分析是對程式檔案的反彙編程式碼、圖形影象、可列印字串和其他磁碟資源進行分析,是一種不需要實際執行程式的逆向工程。雖然靜態分析技術有欠缺之處,但是它可以幫助我們理解各種各樣的惡意軟體。

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!
QQ群:101677771

通過細緻的逆向工程,你將能夠更好地理解惡意軟體二進位制檔案在攻擊目標後為攻擊者提供的好處,以及攻擊者可以隱藏並繼續攻擊受感染計算機的方式。正如你將看到的,本文結合了描述和例項,每個部分都介紹了靜態分析技術,然後說明其在實際分析中的應用。

本文的程式碼和資料,可以在公眾號後臺回覆惡意軟體獲取下載方式。你將在資料目錄/ch1中找到本文示例中使用的惡意軟體示例。為了演示本文討論的技術,我們在演示中使用ircbot.exe,這是一個網際網路中繼聊天(Internet Relay Chat,IRC)機器人,也在日常廣泛監測中最常見的惡意軟體的示例之一。

嚴格來說,當連線到IRC伺服器時,這個程式被設計常駐在目標計算機上。在ircbot.exe控制目標後,攻擊者可以通過IRC控制目標計算機,執行控制指令,例如開啟網路攝像頭偷偷捕獲視訊、提取目標的地理位置和桌面的截圖,以及從目標機器中提取相關檔案等。

01 微軟Windows可移植可執行檔案格式

要進行惡意軟體靜態分析,你需要了解Windows PE檔案格式,該格式描述瞭如.exe、.dll和.sys等當今Windows程式檔案的結構,並定義了它們儲存資料的方式。PE檔案包含x86指令、影象和文字等資料,以及程式執行所需的元資料。

PE格式最初的設計是用來進行下面的操作。

1)告訴Windows如何將程式載入到記憶體中

PE格式描述了檔案的哪些塊應該載入到記憶體中,以及在哪裡載入。它還告訴你,Windows應該在程式程式碼裡的哪個位置開始執行程式,以及哪些動態連結程式碼庫應該載入到記憶體中。

2)為執行程式提供在執行過程中可能使用的媒體(或資源)

這些資源可以包括字串,如GUI對話方塊或控制檯輸出的字串,以及影象或視訊。

3)提供安全資料,例如數字程式碼簽名

Windows使用這些安全資料來確保程式碼出自受信任的來源。

PE格式通過利用圖1-1中所示的一系列結構來完成以上工作。

▲圖1-1 PE檔案格式

如圖1-1所示,PE檔案格式包括一系列(header),用來告訴作業系統如何將程式載入到記憶體中。它還包括一系列(section)用來包含實際的程式資料。Windows將這些節載入到記憶體中,使其在記憶體中的偏移量與它們在磁碟上的顯示位置相對應。

讓我們從PE頭開始,來更詳細地探討這個檔案結構。我們將略過對DOS頭的討論,這是20世紀80年代微軟DOS作業系統的遺留產物,僅僅出於相容性原因而存在。

1. PE頭

如圖1-1底部所示,在DOS頭❶的上面是PE頭❷,它定義了程式的一般屬性,如二進位制程式碼、影象、壓縮資料和其他程式屬性。它還告訴我們程式是否是針對32位或64位系統而設計的。

PE頭為惡意軟體分析師提供了基本但有用的情景資訊。例如,頭裡包括了時間戳欄位,這個欄位可以給出惡意軟體作者編譯檔案的時間。通常惡意軟體作者會使用偽造的值替換這個欄位,但是有時惡意軟體作者會忘記替換,就會發生這種情況。

2. 可選頭

可選頭❸實際上在今天的PE可執行程式中無處不在,恰恰與其名稱的含義相反。它定義了PE檔案中程式入口點的位置,該位置指的是程式載入後執行的第一個指令。

它還定義了Windows在載入PE檔案、Windows子系統、目標程式(例如Windows GUI或Windows命令列)時載入到記憶體中的資料大小,以及有關該程式其他的高階詳細資訊。由於程式的入口點告訴了逆向工程師該從哪裡開始進行逆向工程,這個頭資訊對逆向工程師來說是非常寶貴的。

3. 節頭

節(section)頭❹描述了PE檔案中包含的資料節。PE檔案中的一個節是一塊資料,它們在作業系統載入程式時將被對映到記憶體中,或者包含有關如何將程式載入到記憶體中的指令。

換句話說,一個節是磁碟上的位元組序列,它要麼成為記憶體中一串連續位元組的字串,要麼告知作業系統關於載入過程的某些方面。

節頭還告訴Windows應該授予節哪些許可權,比如程式在執行時,是否應該可讀、可寫或可執行。例如,包含x86程式碼的.text節通常被標記為可讀和可執行的,但是不可寫的,以防止程式程式碼在執行過程中意外修改自身。

圖1-1描述了許多節,如.text和.rsrc。執行PE檔案時,它們會被對映到記憶體中。其他如.reloc節的特殊節不會被對映到記憶體中,我們也將討論這些節。下面我們來瀏覽圖1-1中顯示的節。

1).text節

每個PE程式在其節頭中包含了至少一個標記為可執行的x86程式碼節;這些節幾乎總是命名為.text❺。

2).idata節

.idata節❻,也被稱為匯入節,包含匯入地址表(IAT),它列出了動態連結庫和它們的函式。IAT是最重要的PE結構之一,在對PE二進位制檔案進行最初的分析時需要檢視它,因為它指出了程式所呼叫的庫,然而這些呼叫反過來又可能會洩露惡意軟體的高階功能。

3)資料節

在PE檔案結構中的資料節可以包括.rsrc、.data和.rdata等節,它們儲存程式使用的滑鼠游標影象、按鈕圖示、音訊和其他媒體等。例如,圖1-1中的.rsrc節❼包含了程式用於將文字呈現為字串的可列印字串。

.rsrc(資源)節中的資訊對惡意軟體分析師是非常重要的,因為通過檢查PE檔案中的可列印字串、圖形影象和其他資產,他們可以獲得關於檔案功能的重要線索。

在03節中,你將瞭解如何使用icoutils工具包(包括icotool和wrestool)從惡意軟體二進位制檔案的資源節中提取圖形影象。然後,在04節中,你將學習如何從惡意軟體資源節中提取可列印的字串。

4).reloc節

PE二進位制檔案的程式碼並非是與位置獨立的,這意味著如果將它從預期的記憶體位置移動到新的記憶體位置,它將無法正確執行。.reloc❽在不破壞程式碼的情況下通過允許移動程式碼來解決這個問題。

如果一個PE檔案的程式碼已被移動,它就告訴Windows作業系統將該檔案的程式碼中進行記憶體地址轉換,這樣程式碼仍可以正確執行。這些轉換通常涉及在記憶體地址中新增或減去偏移量。

02 使用pefile解析PE檔案格式

由Ero Carerra編寫和維護的Python模組pefile已經成為解析PE檔案的一個行業標準的惡意軟體分析庫。在本節中,我將向你展示如何使用pefile來解析ircbot.exe。程式碼清單1-1假設ircbot.exe已位於你當前的工作目錄中。

輸入以下命令安裝pefile庫,以便我們可以在Python中匯入它:

$pipinstallpefile

現在,使用程式碼清單1-1中的命令啟動Python,匯入pefile模組,然後使用pefile開啟並解析PE檔案ircbot.exe。

  • 程式碼清單1-1 載入pefile模組並解析PE檔案(ircbot.exe)

$python
>>>importpefile
>>>pe=pefile.PE("ircbot.exe")

我們例項化pefile.PE,它是PE模組實現的核心類。它解析PE檔案,以便我們可以檢視它們的屬性。通過呼叫PE建構函式,我們載入並解析指定的PE檔案,在本例中為ircbot.exe。現在我們已經載入並解析了這個檔案,執行程式碼清單1-2中的程式碼從ircbot.exe的pe欄位中提取資訊。

  • 程式碼清單1-2 遍歷PE檔案的各個節並列印有關它們的資訊

#基於EroCarrera的示例程式碼(pefile庫的作者)
forsectioninpe.sections:
print(section.Name,hex(section.VirtualAddress),
hex(section.Misc_VirtualSize),section.SizeOfRawData)

程式碼清單1-3顯示了列印輸出的內容。

  • 程式碼清單1-3 使用Python的pefile模組從ircbot.exe中提取節資料

如程式碼清單1-3所示,我們從PE檔案五個不同的節中提取了資料:.text、.rdata、.data、.idata和.reloc。輸出是以五元組的形式給出,每提取一個PE節對應一個元素。每一行的第一個條目標識PE節。(你可以忽略一系列的\x00空位元組,它們只是C語言樣式的空字串終止符。)其餘欄位告訴我們,一旦將每個節被載入到記憶體中,它的記憶體利用率將是多少,以及一旦被載入,它將在記憶體中的何處被找到。

例如,0x1000❶是載入這些節的虛擬記憶體地址基址,也可以將其視為節的記憶體地址基址。在虛擬大小(virtual size)欄位中的0x32830❷指定了節被載入後所需的記憶體大小。第三個欄位中的207360❸表示該節將在該記憶體塊中所佔用的資料量。

除了使用pefile解析程式的節之外,我們還可以使用它列出二進位制檔案將載入的DLL檔案,以及它將在這些DLL檔案中所請求的函式呼叫。我們可以通過映象(dump)PE檔案的IAT來實現這一點。程式碼清單1-4顯示瞭如何使用pefile映象ircbot.exe的IAT。

  • 程式碼清單1-4 從ircbot.exe中提取匯入資訊

$python
pe=pefile.PE("ircbot.exe")
forentryinpe.DIRECTORY_ENTRY_IMPORT:
printentry.dll
forfunctioninentry.imports:
print'\t',function.name

程式碼清單1-4會生成如程式碼清單1-5所示的輸出(為了簡潔起見,輸出進行了截斷)。

  • 程式碼清單1-5 ircbot.exe的IAT表內容,其顯示了這個惡意軟體使用的庫函式

如程式碼清單1-5所示,這個輸出對於惡意軟體分析很有價值,因為它列出了惡意軟體宣告和將引用的豐富的函式陣列。

例如,輸出的前幾行告訴我們,惡意軟體將使用WriteFile❶寫入檔案,使用CreateFileA❷開啟檔案,並使用CreateProcessA❸建立新的程序。雖然這些只是關於惡意軟體的基本資訊,但它們是瞭解惡意軟體更為詳細行為的開始。

03 檢查惡意軟體的圖片

要了解惡意軟體是如何設計來捉弄攻擊目標的,讓我們看看在它的.rsrc節中所包含的圖示。例如,惡意軟體二進位制檔案常常被設計成偽裝的Word文件、遊戲安裝程式、PDF檔案等常用軟體的圖示來欺騙使用者點選它們。

你還可以在惡意軟體中找到攻擊者自己感興趣程式中的影象,例如攻擊者為遠端控制受感染機器而執行的網路攻擊工具和程式。

回到我們的樣本影象分析,你可以在本文的資料目錄中找到名為fakepdfmalware.exe的這個惡意軟體樣本。這個樣本使用Adobe Acrobat圖示誘騙使用者認為它是一個Adobe Acrobat文件,而實際上它是一個惡意的PE可執行檔案。

在我們使用Linux命令列工具wrestool從二進位制檔案fakepdfmalware.exe中提取影象之前,我們首先需要建立一個目錄來儲存我們將提取的影象。程式碼清單1-6顯示瞭如何完成所有這些操作。

  • 程式碼清單1-6 從惡意軟體樣本中提取影象的Shell命令

$mkdirimages
$wrestool-xfakepdfmalware.exe-output=images
$icotool-x-oimagesimages/*.ico

我們首先使用mkdir images建立一個目錄來儲存提取的影象。接下來,我們使用wrestool從fakepdfmalware.exe中提取影象資源(-x)到/images目錄,然後使用icotool提取(-x)並將Adobe中.ico圖示格式中的所有資源轉換(-o)為.png圖形,以便我們可以使用標準的影象瀏覽工具檢視它們。

如果你的系統上沒有安裝wrestool,你可以從這裡下載:

http://www.nongnu.org/icoutils/

一旦你使用wrestool將目標可執行檔案中的影象轉換為PNG格式,你就可以在你喜歡的影象瀏覽工具中開啟它們,並以各種解析度檢視Adobe Acrobat圖示。

正如我在這裡給出的例子所示,從PE檔案中提取影象和圖示相對簡單,可以快速顯示與惡意軟體二進位制檔案相關的有趣且又有用的資訊。同樣地,我們可以輕鬆地從惡意軟體中提取可列印字串來獲取更多資訊,我們接下來會做這項工作。

04 檢查惡意軟體的字串

字串是程式二進位制檔案中可列印字元的序列。惡意軟體分析師通常依賴惡意樣本中的字串來快速瞭解其中可能發生的情況。這些字串通常包含下載網頁和檔案的HTTP和FTP命令,用於告訴你惡意軟體連線到的地址的IP地址和主機名等類似資訊。

有時,即使用於編寫字串的語言也有可能暗示惡意軟體二進位制檔案的來源國,儘管這可能是偽造的。你甚至可以在一個字串中找到一些文字,它們用網路用語解釋了惡意二進位制檔案的用途。

字串還可以顯示有關二進位制檔案的更多技術資訊。例如,你可能會發現有關用於建立二進位制檔案的編譯器、編寫二進位制檔案所使用的程式語言、嵌入式指令碼或HTML等資訊。

雖然惡意軟體作者可以對所有這些痕跡進行混淆、加密和壓縮等處理,但是即便是高水平的惡意軟體作者也經常會暴露並留下一些痕跡,因此在分析惡意軟體時,對映象的字串進行細緻檢查顯得尤為重要。

1. 使用字串程式

檢視檔案中所有字串的標準方法是使用命令列工具strings,按照以下語法進行使用:

$stringsfilepath|less

該命令將檔案中的所有字串逐行列印到終端上。在末尾新增 | less可以防止字串在終端上跨屏顯示。預設情況下,strings命令查詢所有最小長度為4位元組的可列印字串,但是你可以設定不同的最小長度並更改“命令手冊”中所列各種其他引數。

我建議只使用預設的最小字串長度4,但是你可以使用-n選項更改最小字串長度。例如,“string -n 10 filepath”只提取最小長度為10位元組的字串。

2. 分析映象字串

現在我們映象了一個惡意軟體程式的可列印字串,但是挑戰在於要理解這些字串的含義。例如,假設我們將ircbot.exe中的字串映象到ircbotstring.txt檔案中,這在本文前面的內容中,我們使用pefile庫已經進行了探討,如下所示:

$stringsircbot.exe>ircbotstring.txt

ircbotstring.txt的內容包含數千行文字,但其中一些行應該突出顯示出來。例如,程式碼清單1-7顯示了從字串映象中提取出來的一串以單詞DOWNLOAD開頭的行。

  • 程式碼清單1-7 顯示惡意軟體可以將攻擊者指定的檔案下載到目標計算機的字串輸出

這些行表示ircbot.exe將嘗試把攻擊者指定的檔案下載到目標計算機上。

我們來嘗試分析另一個。程式碼清單1-8所示的字串映象表明ircbot.exe可以起到Web伺服器的作用,在目標機器上偵聽來自攻擊者的連線。

  • 程式碼清單1-8 顯示惡意軟體有一個攻擊者可以連線的HTTP伺服器的字串輸出

程式碼清單1-8顯示了ircbot.exe用於實現HTTP伺服器的各種HTTP樣板程式。此HTTP伺服器可能允許攻擊者通過HTTP連線到目標計算機以發出命令,例如獲取受害者桌面的螢幕截圖並將其回傳給攻擊者的命令。

我們在整個程式碼清單中看到了HTTP功能的證據。例如,從Internet資源請求資料的GET方法❶。HTTP/1.0 200 OK❷這一行是一個返回狀態程式碼200的HTTP字串,表明HTTP網路事務都執行良好,而Server:myBot❸表明HTTP伺服器的名稱是myBot,這是ircbot.exe附加的一個內建HTTP伺服器。

所有這些資訊都有助於理解和阻止特定的惡意軟體樣本或惡意活動。例如,知道惡意軟體樣本有一個HTTP伺服器,當你連線到它時,它會輸出特定的字串,這樣你就可以藉此掃描你的網路來識別受感染的主機。

05 小結

在本文中,你大致對靜態惡意軟體分析有了一定的認識,其中包括在不實際執行的情況下檢查惡意軟體程式。

你瞭解了定義Windows作業系統.exe和.dll檔案的PE檔案格式,還了解了如何使用Python庫pefile解析實際場景中的惡意軟體ircbot.exe二進位制檔案。

你還使用影象分析和字串分析等靜態分析技術,從惡意軟體樣本中提取更多的資訊。