您好,登錄后才能下訂單哦!
這篇文章給大家介紹Python中怎么識別惡意軟件,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
要進行惡意軟件靜態分析,你需要了解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中提取節數據
如代碼清單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") 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中怎么識別惡意軟件就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。