要進行惡意軟體靜態分析,你需要了解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作業系統將該檔案的程式碼中進行記憶體位址轉換,這樣程式碼仍可以正確運作。這些轉換通常涉及在記憶體位址中添加或減去偏移量。
由Ero Carerra編寫和維護的Python模組pefile已經成為解析PE檔案的一個產業標準的惡意軟體分析函式庫。在本節中,我將向你展示如何使用pefile來解析ircbot.exe。程式碼清單1-1假設ircbot.exe已位於你目前的工作目錄中。
輸入以下命令安裝pefile庫,以便我們可以在Python中導入它:
$ pip install pefile
現在,使用程式碼清單1-1中的命令啟動Python,導入pefile模組,然後使用pefile開啟並解析PE檔ircbot.exe。
程式碼清單1-1 載入pefile模組並解析PE檔(ircbot.exe)
$ python >>> import pefile >>> pe = pefile.PE("ircbot.exe")
我們實例化pefile.PE,它是PE模組實現的核心類別。它解析PE文件,以便我們可以查看它們的屬性。透過呼叫PE建構函數,我們載入並解析指定的PE文件,在本例中為ircbot.exe。現在我們已經載入並解析了這個文件,運行程式碼清單1-2中的程式碼從ircbot.exe的pe欄位中提取資訊。
程式碼清單1-2 遍歷PE檔案的各個節並列印有關它們的資訊
#基于 Ero Carrera的示例代码(pefile库的作者) for section in pe.sections: print(section.Name, hex(section.VirtualAddress), hex(section.Misc_VirtualSize), section.SizeOfRawData)
程式碼清單1-3顯示了列印輸出的內容。
程式碼清單1-3 使用Python的pefile模組從ircbot.exe中提取節資料
我們從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") for entry in pe.DIRECTORY_ENTRY_IMPORT: print entry.dll for function in entry.imports: print '\t', function.name
程式碼清單1-4會產生如程式碼清單1-5所示的輸出(為了簡潔起見,輸出進行了截斷)。
程式碼清單1-5 ircbot.exe的IAT表內容,其顯示了這個惡意軟體所使用的函式庫函數
如程式碼清單1-5所示,這個輸出對於惡意軟體分析很有價值,因為它列出了惡意軟體宣告和將要引用的豐富的函數陣列。
例如,輸出的前幾行告訴我們,惡意軟體將使用WriteFile❶寫入文件,使用CreateFileA❷開啟文件,並使用CreateProcessA❸建立新的進程。雖然這些只是關於惡意軟體的基本信息,但它們是了解惡意軟體更詳細行為的開始。
要了解惡意軟體是如何設計來捉弄攻擊目標的,讓我們看看在它的.rsrc節中所包含的圖示。例如,惡意軟體二進位檔案常常被設計成偽裝的Word文件、遊戲安裝程式、PDF檔案等常用軟體的圖示來欺騙使用者點擊它們。
你还可以在恶意软件中找到攻击者自己感兴趣程序中的图像,例如攻击者为远程控制受感染机器而运行的网络攻击工具和程序。
回到我们的样本图像分析,你可以在本文的数据目录中找到名为fakepdfmalware.exe的这个恶意软件样本。这个样本使用Adobe Acrobat图标诱骗用户认为它是一个Adobe Acrobat文档,而实际上它是一个恶意的PE可执行文件。
在我们使用Linux命令行工具wrestool从二进制文件fakepdfmalware.exe中提取图像之前,我们首先需要创建一个目录来保存我们将提取的图像。代码清单1-6显示了如何完成所有这些操作。
代码清单1-6 从恶意软件样本中提取图像的Shell命令
$ mkdir images $ wrestool -x fakepdfmalware.exe -output=images $ icotool -x -o images images/*.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文件中提取图像和图标相对简单,可以快速显示与恶意软件二进制文件相关的有趣且又有用的信息。同样地,我们可以轻松地从恶意软件中提取可打印字符串来获取更多信息,我们接下来会做这项工作。
字符串是程序二进制文件中可打印字符的序列。恶意软件分析师通常依赖恶意样本中的字符串来快速了解其中可能发生的情况。这些字符串通常包含下载网页和文件的HTTP和FTP命令,用于告诉你恶意软件连接到的地址的IP地址和主机名等类似信息。
有时,即使用于编写字符串的语言也有可能暗示恶意软件二进制文件的来源国,尽管这可能是伪造的。你甚至可以在一个字符串中找到一些文本,它们用网络用语解释了恶意二进制文件的用途。
字符串还可以显示有关二进制文件的更多技术信息。例如,你可能会发现有关用于创建二进制文件的编译器、编写二进制文件所使用的编程语言、嵌入式脚本或HTML等信息。
虽然恶意软件作者可以对所有这些痕迹进行混淆、加密和压缩等处理,但是即便是高水平的恶意软件作者也经常会暴露并留下一些痕迹,因此在分析恶意软件时,对镜像的字符串进行细致检查显得尤为重要。
1. 使用字符串程序
查看文件中所有字符串的标准方法是使用命令行工具strings,按照以下语法进行使用:
$ strings filepath | less
该命令将文件中的所有字符串逐行打印到终端上。在末尾添加 | less可以防止字符串在终端上跨屏显示。默认情况下,strings命令查找所有最小长度为4字节的可打印字符串,但是你可以设置不同的最小长度并更改“命令手册”中所列各种其他参数。
我建议只使用默认的最小字符串长度4,但是你可以使用-n选项更改最小字符串长度。例如,“string -n 10 filepath”只提取最小长度为10字节的字符串。
2. 分析镜像字符串
现在我们镜像了一个恶意软件程序的可打印字符串,但是挑战在于要理解这些字符串的含义。例如,假设我们将ircbot.exe中的字符串镜像到ircbotstring.txt文件中,这在本文前面的内容中,我们使用pefile库已经进行了探讨,如下所示:
$ strings ircbot.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伺服器,當你連接到它時,它會輸出特定的字串,這樣你就可以藉此掃描你的網路來識別受感染的主機。
以上是Python如何辨識惡意軟體的詳細內容。更多資訊請關注PHP中文網其他相關文章!