天天看點

IDA-建立自己的sig檔案

工具

flirt68.zip

pcf.exe/pcf: 生成一個模式檔案.pat

sigmake.exe: 生成一個簽名檔案.sig

流程

建立PAT

IDA-建立自己的sig檔案

生成pat檔案,pat.txt檔案說明各個模式的格式。

第一部分

列舉了它所代表的函數的初始位元組序列,最長為32個位元組。一些位元組因為重定位的入口而有所不同,這些位元組将得到“補償”,每個位元組以兩點顯示。。如果一個函數短于32個位元組(例如前面代碼中的_ffs函數),用點将模式填充到64個字元。

每個位元組需要兩個字元。要顯示32個位元組的内容,需要64個十六進制字元。      
IDA-建立自己的sig檔案

可以看到,OnFinalRelease函數的初始位元組序為

85C974098B018B50046A01FFD2C3..........................      

可以使用windbg檢視下函數:

0:000> db 3e1010 
 003e1010 85 c9 74 09 8b 01 8b 50-04 6a 01 ff d2 c3 cc cc      

其他部分

CRC16值、函數的位元組長度以及函數引用的符号名稱清單

IDA-建立自己的sig檔案

建立sig

IDA-建立自己的sig檔案

隻要有兩個函數的模式相同,就會發生沖突。如果不能解決沖突,在應用簽名的過程中,我們就無法确定函數到底與哪一個簽名相比對。

隻要存在沖存,sigmake生成的就不是.sig檔案,而是一個排斥檔案(.exc),.exc檔案是文本檔案,它詳細說明了sigmake在處理模式檔案時遇到的沖突

排斥檔案是文本檔案,它詳細說明了sigmake在處理模式檔案時遇到的沖突

每次運作sigmake失敗都會産生以下注釋,如再次失敗,注釋會附加在原來.ecx的最後

;--------- (delete these lines to allow sigmake to read this file) 
 ; add '+' at the start of a line to select a module 
 ; add '-' if you are not sure about the selection 
 ; do nothing if you want to exclude all modules      

随便找一個沖突點(可以看到它們的初始位元組序列完全相同)

+?GetDrawState@DUICheckBox@DM@@QAEHXZ 14 3ACE 33C03981A000000074298B4920F6C1107407B803000000EB12F6C1027407B802 
 ?GetDrawState@DUIRadioButton@DM@@QAEHXZ 14 3ACE 33C03981A000000074298B4920F6C1107407B803000000EB12F6C1027407B802      

1. 删除上面4行以分号開頭的注釋

2.sigmake讓你僅指定一個函數作為相關簽名的比對函數。任何時候,如果在資料庫中發現一個對應的簽名,并且你想應用一個函數的名稱,那麼,你可以在該函數名稱前附加一個加号;如果你隻想在資料庫中添加某個函數的注釋,則在該函數名稱前附加一個減号;如果在資料庫中發現對應的簽名時,你不想應用任何名稱,那麼,你不需要添加任何符号。(+号隻能有一個,-号和+号二者隻能存一)

比如上面DUICheckBox使用了+号(注意比較初始位元組序号):

IDA-建立自己的sig檔案

加載sig

成功生成簽名檔案後,你需要将它複制到你的/sig目錄中,以便IDA使用這個檔案。随後,你可以通過File▶Load File▶FLIRT Signature File通路這個新簽名。

(1)為最大限度地減少沖突,請删除排斥檔案開頭的4個注釋行。 
 (2)最多隻能給沖突函數組中的一個函數附加+/-。 
 (3)如果一個沖突函數組僅包含一個函數,不要在該函數前附加+/-,讓它保持原狀即可。 
 (4)sigmake連續運作失敗會将資料(包括注釋行)附加到現有的任何.exc檔案後。在再次運作sigmake之前,你必須删除這些額外的資料,并更正原始資料(如果這些資料是正确的,sigmake将不會再次運作失敗)。