IDA Pro 插件的功能詳解
IDA Pro是反匯編程序
反匯編程序用于將機器代碼轉換為人類可讀的格式,稱為匯編語言。
我們每天使用的軟件的源代碼并不總是可用。像IDA Pro這樣的反匯編程序能夠創建其執行的映射,以顯示處理器實際以稱為匯編語言的符號表示形式執行的二進制指令。通過這種反匯編過程,軟件專家可以分析懷疑是惡意軟件的程序,例如間諜軟件或惡意軟件。但是,匯編語言很難閱讀和理解。這就是為什么在IDA Pro中實施了高級技術以使該復雜代碼更具可讀性的原因。在某些情況下,可以將二進制程序還原到相當接近的水平,還原為產生二進制程序的原始源代碼。然后可以對該程序的代碼圖進行后處理以進行進一步調查。
IDA Pro是調試器
調試器是一種計算機程序,可幫助檢測和糾正其他計算機程序中的錯誤。
在軟件分析中(就像在現實生活中一樣),事情很少是簡單明了的。惡意代碼通常不與分析人員合作。病毒,蠕蟲和特洛伊木馬程序的創建者通常以一種混淆的方式編寫其代碼,這使得閱讀和分析變得異常困難。因此,需要更強大的工具來有效地幫助分析師。IDA Pro中的調試器通過允許用戶單步執行要研究的代碼來補充反匯編程序的靜態分析功能(在不執行程序的情況下檢查代碼);通過這種方式,調試器通常會繞過混淆,并幫助獲取功能更強大的靜態反匯編程序將能夠進行深度處理的數據。
IDA Pro在Windows,Linux和Mac OS X上運行,并且可以調試各種特定平臺(Windows 32/64位,Linux 32/64位,OS X x86 / x64,iOS,Android等)。這可以在本地或遠程執行。遠程調試器對于安全地剖析潛在有害的程序非常有用。一些IDA調試器還可以在虛擬環境中運行該應用程序,從而使惡意軟件分析更加安全。
IDA Pro是交互式的
由于在探索未知事物時,目前還沒有計算機能擊敗人腦,因此IDA Pro具有完全的交互性。IDA始終允許人工分析人員覆蓋其決策或提供提示。內置的編程語言和開放的插件體系結構進一步提高了交互性。
插件體系結構允許程序在某些時候調用外部代碼,而無需事先知道該代碼的所有細節。
IDA Pro是可編程的
IDA Pro是一個完整的集成開發環境。它由一種非常強大的類宏語言組成,可用于自動執行從簡單到中等復雜性的任務。對于更高級的任務,開放式插件體系結構允許外部開發人員增強IDA Pro的功能。
突出顯示控制流傳輸指令
在對二進制文件進行逆向工程時,遵循控制流傳輸指令非常重要,特別是那些用于將控制流傳輸到其他過程的指令。對于x86/64架構,這是通過調用指令完成的。如果您是一名有經驗的逆向工程師,您通常可以通過快速查看函數匯編來大致了解函數的功能(尤其是當函數相對較小時)。當要理解一個函數的功能時,您最可能做的第一件事就是檢查它有多少調用指令以及它們執行了哪些其他函數。如果一個函數只是執行計算,在內存中存儲一些值,而您并不真正關心這些細節,那么您可以跳過這個函數,繼續進行逆向工程。當一個函數執行其他函數時,情況就完全不同了;您可以先了解這些函數的功能。
所有用于編寫代碼的開發環境都支持語法高亮顯示,因為它有助于軟件編碼。但是,語法高光也可以極大地幫助軟件反轉。讓我們快速看一下IDA Pro和其他用于逆向工程的工具提供的語法突出顯示功能。

如您所見,Immunity Debugger,x64dbg和radare2都突出顯示了控制流傳輸指令,但沒有突出顯示IDA Pro。默認的IDA Pro主題看起來很普通。但是,如果轉到“選項->顏色…”,則可以使內容變亮。在“ IDA顏色”窗口中,可以為指令助記符、寄存器、地址、常量和變量配置不同的顏色。它使IDA Pro的輸出看起來更加令人愉悅,但是并不能完全解決問題,因為所有指令助記符都具有相同的顏色,并且如果您依賴地址突出顯示,則不能與間接函數調用一起使用。為什么IDA Pro沒有選擇突出顯示CALL指令的選項?直到今天,這種疏忽困擾著我。似乎不僅僅是我,因為有許多針對同一問題的腳本和插件(例如:Fluor.py和Highlight_calls.py)。這些腳本使用API??函數set_color() / set_item_color()在指令后設置背景色。雖然可以肯定地完成了任務,但最終結果可能不如改變某些特定指令助記符的顏色那么好。
在某個時候,我決定檢查是否有一種方法可以使用更高級的插件來更改某些特定指令的顏色,并深入到IDA Pro SDK頭文件中。我在lines.hpp頭文件中找到了要查找的內容,該文件揭示了IDA Pro用于顯示反匯編文本的內部格式。事實證明,API函數generate_disassembly()和generate_disasm_line()輸出反匯編的文本行以及用于實現語法高亮顯示的特殊轉義序列。如果您將IDc.generate_disasm_line(ea,flags)與IDAPython一起使用,則這些顏色轉義序列將從輸出中刪除,但是如果您使用,仍可以查看原始的反匯編文本行ida_lines.generate_disasm_line(ea,flag)顏色轉義序列的格式非常簡單,典型的顏色序列如下所示:#COLOR_ON #COLOR_xxx text #COLOR_OFF #COLOR_xxx。#COLOR_ON等于\ x01,并且指令助記符的#COLOR_xxx值定義為COLOR_INSN并等于\ x05。結果,CALL指令的反匯編文本行將始終以“ \ x01 \ x05call \ x02 \ x05”開頭。IDA Pro SDK還提供了函數hook_to_notification_point(),可用于為不同事件安裝回調,這些事件包括UI通知ui_gen_idanode_text可以用來為IDA圖節點提供自定義文本。因此,計劃如下:我們對ui_gen_idanode_text通知進行回調,檢查當前地址的反匯編文本行是否以\ x01 \ x05call \ x02 \ x05開頭,如果是,則將ID為的COLOR_INSN替換為一些其他顏色。

這種方法的問題在于它只能在x86 / 64上使用,但是ARM,MIPS等呢?需要與CPU無關的解決方案。值得慶幸的是,它很容易實現。每個處理器模塊都有一個稱為LPH的特殊導出結構(processor_t)。此結構具有一個instruc字段,該字段是指向處理器指令數組的指針。該表中的每條指令均由指令助記符及其功能組合表示。這些功能包括修的操作數(CF_CHGX),使用的操作數(CF_USEX),是否暫停執行(CF_STOP),跳轉到另一個位置(CF_JUMP)或調用另一個過程(CF_CALL)。這意味著在插件啟動時,我們可以解析已加載的處理器模塊中的指令列表,找到所有具有CF_CALL功能的指令,并在以后進行比較時使用它們。您可以在下面看到結果。

只要處理器模塊正確填充了instruc表,插件就可以正常工作。到目前為止,我只遇到的問題與PowerPC的,因為在這種特殊情況下,如“bl”和“bctrl”缺少的一切必要的指示instruc表。但是仍然可以為它們創建解決方法。
已知函數的識別
已知函數的識別是一個巨大的逆向工程問題。您可能會熟悉以下兩種情況:
- 您正在對沒有調試符號的二進制文件進行逆向工程,該二進制文件與已知庫靜態鏈接,并且您想要自動重命名IDA Pro數據庫文件中該庫中的所有函數。
- 您花了一些時間對沒有調試符號的二進制文件進行逆向工程,但是出現了二進制文件的新版本,并且您想將所有重命名的函數移植到新的IDA Pro數據庫文件中。
為了解決第一個問題,IDA Pro背后的公司Hex-Rays提出了一種用于存儲和應用簽名以進行庫功能識別的技術。這項技術稱為FLIRT。這樣就可以使用特殊的工具預處理 .obj 和 .lib 文件,生成帶有功能模式和其他必要數據的文件 .pat,然后將其轉換為簽名文件 .sig。最后,您將獲得特定庫的簽名文件,可以將其放入IDA Pro目錄內的“ sig \ < arch>”文件夾中,然后從“視圖->打開子視圖->簽名”將其應用于IDA Pro數據庫。 ”窗口。如果庫中的功能逐字節匹配IDA Pro數據庫中存在的功能,則它們將被識別并正確重命名。
雖然前面描述的方法部分解決了第一個問題,但對第二個問題完全沒有幫助。正式地,FLIRT僅提供一種為庫創建簽名文件的方法,因此不能用于將知識從一個IDA Pro數據庫轉移到另一個IDA Pro數據庫。多年之后,這個問題終于在IDA Pro 7.2中得到了解決。此版本引入了一種稱為Lumina服務器的新技術。它可用于推送和檢索有關數據庫中存在的功能(名稱、注釋等)的元數據。但是,當您想將此信息從一個數據庫轉移到另一個數據庫而不與世界其他地方共享時,這并沒有真正的幫助。這是因為當前只有公共Lumina服務器可用。這意味著執行此操作的唯一方法是使用插件。值得慶幸的是,這類插件已經存在了很長時間。IDA2PAT和IDB2SIG可以用來從現有IDA Pro數據庫生成FLIRT文件,然后將其應用于新數據庫,就像它是庫的常規簽名文件一樣。它們非常易于使用,如果在新數據庫中未標識函數,則可以立即看到它已被更改。原始的IDA2PAT和IDB2SIG插件未維護,因此您可能要使用具有IDA Pro 7.* 支持或現代IDAPython端口idb2pat.py。
如前所述,FLIRT技術的缺點是,僅當簽名與功能主體的字節緊密匹配時,它才起作用。例如,當您只有一個庫的源代碼,而當您嘗試編譯它的結果與所分析的二進制文件實際上不匹配時,這可能是個問題。在這種情況下,二進制差異會派上用場BinDiff和Diaphora插件的主要功能是,它們不僅可以用于比較不同二進制文件之間的函數,還可以用于端口函數名稱和注釋。Karta是專門為直接從源代碼以二進制形式識別庫函數而開發的。您可以在官方網站閱讀有關其工作原理的更多信息。
YARA + IDA Pro =?
YARA是瑞士軍刀的圖案搭配。它可能是惡意軟件研究人員最鐘愛的工具。模式匹配在逆向工程中非常有用,YARA就是要使用的工具。下面是一些用法:在IDA Pro數據庫中查找重要的常量、magic values和GUIDs,并在找到匹配時打印消息、重命名地址或留下注釋。這里的關鍵是知道你可以尋找YARA和它如何改進你的工作流程。例如,插件findcrypt-yara使用YARA查找公共密碼常量。
import idaapi, idautils, idc
import yara
# rules can be compiled from a file path or as string
rules = yara.compile(filepath=file_with_rules)
# iterate all segments present in database
for segment_start in idautils.Segments():
segment_size = get_segm_end(segment_start) - segment_start
# read segment data
data = get_bytes(segment_start, segment_size)
# scan segment data with rules
matches = rules.match(data=data)
# iterate all matched data
for m in matches:
for s in m.strings:
offset = s[0]
name = s[1]
# leave a comment with pattern name at matched offset in database
set_cmt(get_item_head(segment_start+offset), name, 0)