IDA FLIRT使用


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安裝包中攜帶很多常用的開發庫的相關簽名文件,比如MFCOWLBCL等。部分SIG文件如圖:

  但是如果分析的程序中使用的庫在IDA中並沒有相應的SIG的話,該怎么辦呢?這個時候就可以使用FLAIR工具了,這個工具可用於生成FLIRT數據庫,即自己制作一個相應的SIG文件。

  下面先看一下如何使用已有的SIG文件識別庫函數,之后再看下如何對未包含的庫進行SIG文件生成。

一、使用已有的SIG文件識別函數

  有時候IDA對於可支持的庫函數並未自動識別,這個時候就需要手動添加SIG文件,強制識別相關的函數。比如下面這種情況:

  之后看字符串窗口看到MFC庫函數相關字符串,或者熟悉相關函數的話肉眼識別以下屬於什么庫函數。

  那就加入手動SIG文件(shift+f5),簽名窗口中可以查看已使用的SIG簽名文件和已識別的函數(#func)。添加之后,反匯編窗口中成功識別大部分的MFC函數,從而大大增加了程序分析效率。

二、生成SIG文件

  除了使用已有的SIG文件,IDA還提供了工具FLAIR,便於用戶自行制作識別庫文件。該工具單獨發布。

  創建簽名的步驟如下:

  1. 獲得一個需要創建簽名文件的靜態庫*.lib

  2. 用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文件。

  3. 用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文件,則追加至文件尾部。

  我們需要修改這個文件中的沖突組。每組中:

  1. 標識+即代表檢測到這個簽名時使用指定的這個符號名稱;
  2. 標識-即不修改IDA反匯編中的函數名,而是以注釋方式顯示;
  3. 如果不進行處理,則在識別到指定標簽后不進行動作。

  接着執行同樣的命令,生成sig文件,如果還有沖突,重復上面操作。修改時如果式子過多,可以在編輯器中正則匹配替換一下。

  需要注意的是:

  • 為最大限度地減少沖突,刪除排斥文件(*.exc)開頭的4個注釋行;

  • 最多只能給沖突函數組中的一個函數附加+/-

  • 如果一個沖突函數僅包含一個函數,不要在該函數前附加+/-,讓它保持原狀即可;

參考:

《加密與解密(第4版)》第3章

《IDA Pro權威指南》第12章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM