IDA FLIRT使用

IDA FLIRT/FLAIR

  FLIRT是IDA提供的一種函數識別技術,即庫文件快速識別與鑑定技術(Fast Library Identification and Recognition Technology)。這項技術使IDA能在一系列編譯器的標準庫文件裏自動找出調用的函數,使反彙編清單清晰明瞭。好比說一個MFC庫函數,反彙編出來可能就是call 40a936,可是IDA能夠經過FLIRT識別函數特徵,從而標記該函數,並在反彙編窗口中顯示爲call CWnd::DestroyWindow,大大增長了代碼的可讀性,加快分析速度。git

  FLIRT技術須要使用到IDA提供的一種sig簽名文件,這是IDA進行函數識別的關鍵。IDA安裝包中攜帶不少經常使用的開發庫的相關簽名文件,好比MFCOWLBCL等。部分SIG文件如圖:github

  可是若是分析的程序中使用的庫在IDA中並無相應的SIG的話,該怎麼辦呢?這個時候就可使用FLAIR工具了,這個工具可用於生成FLIRT數據庫,即本身製做一個相應的SIG文件。數據庫

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

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

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

  以後看字符串窗口看到MFC庫函數相關字符串,或者熟悉相關函數的話肉眼識別如下屬於什麼庫函數。編輯器

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

2、生成SIG文件

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

  建立簽名的步驟以下:加密

  1. 得到一個須要建立簽名文件的靜態庫*.libdebug

  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.lib Cryptlib.sig

  不少時候,因爲PAT中一些函數的特徵一致,也就是操做是同樣的,可是函數名不一致,這個時候會出現衝突。

  出現這種狀況,sigmake會將衝突組寫入一個同目錄下同名的EXC(exclude)文本文件中(本例中爲Cryptlib.exec)。若是已有同名exec文件,則追加至文件尾部。

  咱們須要修改這個文件中的衝突組。每組中:

  1. 標識+即表明檢測到這個簽名時使用指定的這個符號名稱;
  2. 標識-即不修改IDA反彙編中的函數名,而是以註釋方式顯示;
  3. 若是不進行處理,則在識別到指定標籤後不進行動做。

  接着執行一樣的命令,生成sig文件,若是還有衝突,重複上面操做。修改時若是式子過多,能夠在編輯器中正則匹配替換一下。

  須要注意的是:

  • 爲最大限度地減小衝突,刪除排斥文件(*.exc)開頭的4個註釋行;

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

  • 若是一個衝突函數僅包含一個函數,不要在該函數前附加+/-,讓它保持原狀便可;

參考:

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

《IDA Pro權威指南》第12章

相關文章
相關標籤/搜索