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章

IDA FLIRT使用的更多相关文章

  1. IDA Pro使用(静态分析+动态调试)

    链接:http://skysider.com/?p=458 IDA Pro使用(静态分析+动态调试) 1.静态分析 IDA FLIRT Signature Database —— 用于识别静态编译的可 ...

  2. IDA,IDA PRO 产品介绍

    IDA理念这是我们在开发产品时竭尽全力遵循的理念--在此过程中,我们相信我们将开发出能够为您带来所需的可靠性.便利性和易用性的软件.没有什么能打败人脑因为我们知道一秒钟的洞察力仍然胜过百年的处理时间, ...

  3. IDA PRO:庆祝成立创新 30 周年

    今天,IDA 已经三十岁了.为了纪念周年纪念,我们将描述史诗旅程的开始和主要里程碑. 背景 在 1990 年代初期,DOS 是最流行的 PC 操作系统,主要是 8086,偶尔有 80286(80386 ...

  4. 逆向工程 - Reveal、IDA、Hopper、HTTPS抓包 等

    目录: 一. iOS 如何做才安全 二.ipa文件 三.沙盒 中的数据 四.Reveal:查看 任何APP 的UI结构 五.反编译工具:IDA 六.反编译工具:Hopper Disassembler ...

  5. IDA的脚本IDC的一个简单使用

    目的:主要是想学习一下IDA的IDC的脚本的使用.这里做了一个小的测试. 这里使用的是VS2015Community来生成文件的. 一.编写测试程序: 这里先生成我们的目标数据. 然后编写测试程序.得 ...

  6. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

  7. iOS程序逆向Mac下常用工具——Reveal、HopperDisassemble、IDA

    原文在此 一.Reveal 1 一般使用     Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局.如下图所示:     Reveal是需要付费的,需要89美元, ...

  8. IDA插件栈字符串识别插件

    该插件是一款可以自动识别栈上局部变量为字符串的插件,字符串形式如下,并自动的加上注释                                       如图:可以自动识别栈上的字符串 项目主 ...

  9. Android动态方式破解apk进阶篇(IDA调试so源码)

    一.前言 今天我们继续来看破解apk的相关知识,在前一篇:Eclipse动态调试smali源码破解apk 我们今天主要来看如何使用IDA来调试Android中的native源码,因为现在一些app,为 ...

随机推荐

  1. 自定义异步爬虫架构 - AsyncSpider

    作者:张亚飞 山西医科大学在读研究生 1. 并发编程 Python中实现并发编程的三种方案:多线程.多进程和异步I/O.并发编程的好处在于可以提升程序的执行效率以及改善用户体验:坏处在于并发的程序不容 ...

  2. STM32 EXTI(外部中断)

    一.EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20个中断/事件线.每个中断/事件线都对应有一个边沿检测器 ...

  3. HttpServer: 基于IOCP模型且集成Openssl的轻量级高性能web服务器

    2021年4月写过一个轻量级的web服务器HttpServer,见文章: <HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器>,但一直没有时间添加O ...

  4. 拉普拉斯平滑(Laplacian smoothing)

    概念 零概率问题:在计算事件的概率时,如果某个事件在观察样本库(训练集)中没有出现过,会导致该事件的概率结果是  $0$ .这是不合理的,不能因为一个事件没有观察到,就被认为该事件一定不可能发生(即该 ...

  5. leetcode 24. 两两交换链表中的节点 及 25. K 个一组翻转链表

    24. 两两交换链表中的节点 问题描述 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2-> ...

  6. Hybrid App(混合开发) 移动端开发调试

    1.下载项目,npm install安装依赖 本地运行 npm run dev(根据具体packjson配 置而定) 2.局域网访问:http://172.20.9.35:8080/ 3.手机端访问: ...

  7. STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  8. 513. Find Bottom Left Tree Value

    Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...

  9. springboot实战小项目-简要介绍、vue项目创建

    因为菜,所以要好好学习! 一.项目介绍:这是一个后台管理系统,准备实现的功能: 1.登录.注册.个人信息查看.退出登录 2.根据关键字查询用户.新增用户.根据id或者其他字段排序.编辑用户信息.删除用 ...

  10. AT3913 XOR Tree

    经过长时间的思考,我发现直接考虑对一条链进行修改是很难做出本题的,可能需要换一个方向. 可以发现本题中有操作的存在,是没有可以反过来做的做法的,因此正难则反这条路应该走不通. 那么唯一的办法就是简化这 ...