IDA FLIRT/FLAIR
FLIRT是IDA提供的一種函數識別技術,即庫文件快速識別與鑒定技術(Fast Library Identification and Recognition Technology)
。這項技術使IDA能在一系列編譯器的標准庫文件里自動找出調用的函數,使反匯編清單清晰明了。比如說一個MFC
庫函數,反匯編出來可能就是call 40a936
,但是IDA可以通過FLIRT識別函數特征,從而標記該函數,並在反匯編窗口中顯示為call CWnd::DestroyWindow
,大大增加了代碼的可讀性,加快分析速度。
FLIRT技術需要使用到IDA提供的一種sig簽名文件,這是IDA進行函數識別的關鍵。IDA安裝包中攜帶很多常用的開發庫的相關簽名文件,比如MFC
、OWL
、BCL
等。部分SIG文件如圖:
但是如果分析的程序中使用的庫在IDA中並沒有相應的SIG的話,該怎么辦呢?這個時候就可以使用FLAIR
工具了,這個工具可用於生成FLIRT數據庫,即自己制作一個相應的SIG文件。
下面先看一下如何使用已有的SIG文件識別庫函數,之后再看下如何對未包含的庫進行SIG文件生成。
一、使用已有的SIG文件識別函數
有時候IDA對於可支持的庫函數並未自動識別,這個時候就需要手動添加SIG文件,強制識別相關的函數。比如下面這種情況:
之后看字符串窗口看到MFC庫函數相關字符串,或者熟悉相關函數的話肉眼識別以下屬於什么庫函數。
那就加入手動SIG文件(shift+f5),簽名窗口中可以查看已使用的SIG簽名文件和已識別的函數(#func)。添加之后,反匯編窗口中成功識別大部分的MFC函數,從而大大增加了程序分析效率。
二、生成SIG文件
除了使用已有的SIG文件,IDA還提供了工具FLAIR
,便於用戶自行制作識別庫文件。該工具單獨發布。
創建簽名的步驟如下:
-
獲得一個需要創建簽名文件的靜態庫
*.lib
; -
用FLAIR解析器為該庫創建一個模式文件(
.pat
)。模式文件是一個文本文件,包含提取出來的表示被解析庫中的函數的模式。-
plb.exe:OMF庫的解析器(Borland編譯器常用)。
-
pcf.exe:COFF庫的解析器(微軟編譯器常用)。
-
pelf.exe:ELF庫的解析器(UNIX系統常用)。
-
ppsx.exe:Sony PlayStation PSX庫的解析器。
-
ptmobj.exe:TriMedia庫的解析器。
-
pomf166.exe:Kiel OMF 166對象文件的解析器。
如果要為某個庫創建一個模式文件,需要指定與庫的格式對應的解析器。如果沒有LIB相應的靜態庫文件,可以使用IDB2PAT創建將
.LIB
文件轉為.PAT
文件。 -
-
用sigmake.exe將
.PAT
文件轉為*.sig
簽名文件,之后就可以使用該文件。
現在進行實際操作。比如在分析勒索病毒的時候,一些家族的病毒會使用CryptoPP加密庫進行數據加密,而IDA並無相關簽名文件,那么就可以自己制作一個SIG文件。
在Github上下載項目,VS編譯出靜態庫Cryptlib.lib(如果是其他已有的lib庫可以直接使用)。在編譯的時候一定要選擇debug
方式進行編譯,因為生成PAT文件時,解析器主要是根據符號進行分析的,如果是release版本,由於被去除了符號,解析器將無法識別,並跳過相關函數。
lib -> PAT
執行以下命令(這里windows平台選擇pcf.exe
):
pcf.exe Cryptlib.lib Cryptlib.pat
PAT
實際上是一個文本文件,記錄了在lib文件中提取的相關文件的特征,如:558BEC83EC44535657894DFC8B45FCC700........8B4DFC83C110E8........ 04 4256 002F :0000 ??1Exception@CryptoPP@@UAE@XZ ^0011 ??_7Exception@CryptoPP@@6B@ ^001C ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ ^0024 ??1exception@std@@UAE@XZ ........5F5E5B8BE55DC3
。
PAT記錄特征方式在FLIAT工具包中的pat.txt
有詳細介紹,比如上例中:
-
前64十六進制串
558BEC83EC44535657894DFC8B45FCC700........8B4DFC83C110E8........
對應標記(函數)模塊的前32字節,.
表示任意字符; -
04 4256
表示隨后的4字節的CRC16
校驗值為0x4256
; -
002F :0000
冒號前后分別表示這個(函數)模塊長度(0x2f字節)和函數名在模塊中的偏移(offset:0x0000); -
1Exception@CryptoPP@@UAE@XZ
為函數符號名; -
^0011 ??_7Exception@CryptoPP@@6B@
表示在函數0x11偏移處引用了符號_7Exception@CryptoPP@@6B@; -
........5F5E5B8BE55DC
為模塊剩余字節,也正因為此,一些長函數的特征就很長。
PAT -> SIG
成功生成PAT文件后,執行以下命令(為了兼容性,輸出文件名不應超過8字節):
sigmake.exe Cryptlib.pat Cryptlib.sig
很多時候,由於PAT中一些函數的特征一致,也就是操作是一樣的,但是函數名不一致,這個時候會出現沖突。
出現這種情況,sigmake會將沖突組寫入一個同目錄下同名的EXC
(exclude)文本文件中(本例中為Cryptlib.exec)。如果已有同名exec文件,則追加至文件尾部。
我們需要修改這個文件中的沖突組。每組中:
- 標識
+
即代表檢測到這個簽名時使用指定的這個符號名稱;- 標識
-
即不修改IDA反匯編中的函數名,而是以注釋方式顯示;- 如果不進行處理,則在識別到指定標簽后不進行動作。
接着執行同樣的命令,生成sig文件,如果還有沖突,重復上面操作。修改時如果式子過多,可以在編輯器中正則匹配替換一下。
需要注意的是:
-
為最大限度地減少沖突,刪除排斥文件(
*.exc
)開頭的4個注釋行; -
最多只能給沖突函數組中的一個函數附加
+/-
; -
如果一個沖突函數僅包含一個函數,不要在該函數前附加
+/-
,讓它保持原狀即可;
參考:
《加密與解密(第4版)》第3章
《IDA Pro權威指南》第12章