FLIRT是IDA提供的一種函數識別技術,即庫文件快速識別與鑑定技術(Fast Library Identification and Recognition Technology)
。這項技術使IDA能在一系列編譯器的標準庫文件裏自動找出調用的函數,使反彙編清單清晰明瞭。好比說一個MFC
庫函數,反彙編出來可能就是call 40a936
,可是IDA能夠經過FLIRT識別函數特徵,從而標記該函數,並在反彙編窗口中顯示爲call CWnd::DestroyWindow
,大大增長了代碼的可讀性,加快分析速度。git
FLIRT技術須要使用到IDA提供的一種sig簽名文件,這是IDA進行函數識別的關鍵。IDA安裝包中攜帶不少經常使用的開發庫的相關簽名文件,好比MFC
、OWL
、BCL
等。部分SIG文件如圖:github
可是若是分析的程序中使用的庫在IDA中並無相應的SIG的話,該怎麼辦呢?這個時候就可使用FLAIR
工具了,這個工具可用於生成FLIRT數據庫,即本身製做一個相應的SIG文件。數據庫
下面先看一下如何使用已有的SIG文件識別庫函數,以後再看下如何對未包含的庫進行SIG文件生成。windows
有時候IDA對於可支持的庫函數並未自動識別,這個時候就須要手動添加SIG文件,強制識別相關的函數。好比下面這種狀況:數組
以後看字符串窗口看到MFC庫函數相關字符串,或者熟悉相關函數的話肉眼識別如下屬於什麼庫函數。編輯器
那就加入手動SIG文件(shift+f5),簽名窗口中能夠查看已使用的SIG簽名文件和已識別的函數(#func)。添加以後,反彙編窗口中成功識別大部分的MFC函數,從而大大增長了程序分析效率。函數
除了使用已有的SIG文件,IDA還提供了工具FLAIR
,便於用戶自行製做識別庫文件。該工具單獨發佈。工具
建立簽名的步驟以下:加密
得到一個須要建立簽名文件的靜態庫*.lib
;debug
用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版本,因爲被去除了符號,解析器將沒法識別,並跳過相關函數。
執行如下命令(這裏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文件後,執行如下命令(爲了兼容性,輸出文件名不該超過8字節):
sigmake.exe Cryptlib.lib Cryptlib.sig
不少時候,因爲PAT中一些函數的特徵一致,也就是操做是同樣的,可是函數名不一致,這個時候會出現衝突。
出現這種狀況,sigmake會將衝突組寫入一個同目錄下同名的EXC
(exclude)文本文件中(本例中爲Cryptlib.exec)。若是已有同名exec文件,則追加至文件尾部。
咱們須要修改這個文件中的衝突組。每組中:
- 標識
+
即表明檢測到這個簽名時使用指定的這個符號名稱;- 標識
-
即不修改IDA反彙編中的函數名,而是以註釋方式顯示;- 若是不進行處理,則在識別到指定標籤後不進行動做。
接着執行一樣的命令,生成sig文件,若是還有衝突,重複上面操做。修改時若是式子過多,能夠在編輯器中正則匹配替換一下。
須要注意的是:
爲最大限度地減小衝突,刪除排斥文件(*.exc
)開頭的4個註釋行;
最多隻能給衝突函數組中的一個函數附加+/-
;
若是一個衝突函數僅包含一個函數,不要在該函數前附加+/-
,讓它保持原狀便可;
《加密與解密(第4版)》第3章
《IDA Pro權威指南》第12章