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

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

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

本文的代碼和數據,可以在公衆號後臺回覆惡意軟件獲取下載方式。你將在數據目錄/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中導入它:

現在,使用代碼清單1-1中的命令啓動Python,導入pefile模塊,然後使用pefile打開並解析PE文件ircbot.exe。

  • 代碼清單1-1 加載pefile模塊並解析PE文件(ircbot.exe)

我們實例化pefile.PE,它是PE模塊實現的核心類。它解析PE文件,以便我們可以查看它們的屬性。通過調用PE構造函數,我們加載並解析指定的PE文件,在本例中爲ircbot.exe。現在我們已經加載並解析了這個文件,運行代碼清單1-2中的代碼從ircbot.exe的pe字段中提取信息。

  • 代碼清單1-2 遍歷PE文件的各個節並打印有關它們的信息

代碼清單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中提取導入信息

代碼清單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命令

我們首先使用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,按照以下語法進行使用:

該命令將文件中的所有字符串逐行打印到終端上。在末尾添加 | less可以防止字符串在終端上跨屏顯示。默認情況下,strings命令查找所有最小長度爲4字節的可打印字符串,但是你可以設置不同的最小長度並更改“命令手冊”中所列各種其他參數。

我建議只使用默認的最小字符串長度4,但是你可以使用-n選項更改最小字符串長度。例如,“string -n 10 filepath”只提取最小長度爲10字節的字符串。

2. 分析鏡像字符串

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

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二進制文件。

你還使用圖像分析和字符串分析等靜態分析技術,從惡意軟件樣本中提取更多的信息

推薦我們的Python學習扣qun:784758214 ,看看前輩們是如何學習的!從基礎的python腳本到web開發、爬蟲、django、數據挖掘等【PDF,實戰源碼】,零基礎到項目實戰的資料都有整理。送給每一位python的小夥伴!每天都有大牛定時講解Python技術,分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章