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章