惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

腾讯CDC
Hacker News: Ask HN
Hacker News: Ask HN
S
Securelist
Security Latest
Security Latest
S
Schneier on Security
T
Threat Research - Cisco Blogs
Latest news
Latest news
Cyberwarzone
Cyberwarzone
A
Arctic Wolf
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
NISL@THU
NISL@THU
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
I
Intezer
T
The Exploit Database - CXSecurity.com
N
News and Events Feed by Topic
Simon Willison's Weblog
Simon Willison's Weblog
T
Tor Project blog
Blog — PlanetScale
Blog — PlanetScale
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CERT Recently Published Vulnerability Notes
The Hacker News
The Hacker News
月光博客
月光博客
WordPress大学
WordPress大学
博客园 - 叶小钗
Hugging Face - Blog
Hugging Face - Blog
美团技术团队
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cisco Blogs
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
Webroot Blog
Webroot Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
L
LINUX DO - 最新话题
Schneier on Security
Schneier on Security
Engineering at Meta
Engineering at Meta
www.infosecurity-magazine.com
www.infosecurity-magazine.com
aimingoo的专栏
aimingoo的专栏
D
Docker
有赞技术团队
有赞技术团队
Google DeepMind News
Google DeepMind News
宝玉的分享
宝玉的分享
T
Troy Hunt's Blog
L
Lohrmann on Cybersecurity
T
The Blog of Author Tim Ferriss
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
L
LangChain Blog

博客园 - GKLBB

软件神器 --- ctf靶场 之 pwn.college 术语俗话 --- 什么是加密狗 软件神器 --- 自动电脑锁屏软件 软件研发 --- 网络安全 之 putty生成无密码登录密钥 软件神器 --- 视频剪辑 之 Avidemux MP4Joiner Shotcut 软件神器 --- 视频格式转化 之 handbrake 软件研发 --- 应知应会 之 经验之谈 这个是什么图标,经常看到 软件研发 --- 术语俗话 之 多模态 术语俗话 --- 什么是大数据开发 术语俗话 --- 什么是边缘计算 软件研发 --- 应知应会 之 什么是云计算开发 应知应会 --- 如何不装软件查看网速 常见问题解决 --- 360拦截接触 常见问题解决 --- 加入会议摄像头无法打开 网络安全 --- CTF打靶 之 ZIP伪加密 → Robot36慢扫电视 → 二维码补齐 → DeepSound隐写 → GPG解密 → Base64图片 → SilentEye隐写 软件研发 --- 应知应会 之 无错误的闪退如何解决 软件研发 --- 应知应会 之 为什么别人的软件如此复杂我的如此简单 网络安全 --- 应知应会 之 什么是旁站 应知应会 --- 如何查询备案 软件神器 --- 格式转化 之 jpg 2 svg 网络安全 --- CTF打靶 之 flag搜索 软件神器 --- 互联网测速 之 软件神器 --- 局域网测速 之 iperf 常见问题解决 --- 模拟器USG6000打开后,启动设备失败,错误40 软件研发 --- AI网络 之 ensp配置生成 软件研发 --- AI编程 之 极简流程 软件研发 --- AI生图产品比较 常见问题解答 --- 为什么我的服务一直被人DDOS 软件研发 --- 开发万能格式转化工具 网站神器 --- 在线格式转化 之 文档转md 术语俗话 --- 什么是云电脑 常见问题解决 --- 如何在没有安装杀毒软件的情况下知道这个文件是不是牧马 常见问题解决 --- Win10下VMware 17安装VMware Tools选项灰色/失效解决办法 - GKLBB 常见问题解决 --- 云电脑报错 :PAGE FAULT IN NONPAGED AREA - GKLBB 记一次牧马的发现 人生感悟 --- 为什么我们生活中同一件事有多个品牌,他们到底有什么区别 软件运维 --- 云电脑安装打印机 常见问题解决 --- 网络打印默认端口 常见问题解决 --- 京瓷打印云电脑无法设置双面打印 软件研发 --- 网络安全 之 brupsuite如何设置上游袋里 术语俗话 --- 什么是同步和异步 我的目标 软件研发 --- dify配置 之 markword转word带有简单样式的方法 软件研发 --- 接口文档格式 常见问题 --- dify 的 deepseek是旧模型版本 OWASP 非营利性开源社区 计算机标准化组织 术语俗话 --- POSIX 就是 Unix 世界的"普通话",大家说同一种语言就能互相理解。 我的数字生活唯一选择 软件开发 --- 安卓开发 之 命名空间隔离 术语俗话 --- 页面对齐、 跨页 计算机的哪些人 --- 社交之王 马克·扎克伯格 计算机的哪些人 --- 重新定义新能源 之 埃隆·马斯克 软件研发 --- AI生成ppt word excel pdf的开发关键 软件研发 --- AI应用开发 之 AI生成Word 人生感悟 --- 致可悲的人 - GKLBB 软件研发 --- pdf 表格图片 转 excel 常见问题解决 --- 装有系统的固态硬盘错误 人生感悟 --- 什么是行业黑话 术语俗话 --- Kubernetes 术语俗话 --- 什么是DBI,和hook什么区别 答疑解惑 --- 为什么苹果手机电池不允许拆卸 代码可视化技术 术语俗话 --- Wrap 函数 人生感悟 --- 逆向工程为什么十分枯燥且无聊 --- 这里引用一句逆向工程核心原理的话 人生感悟 --- 为什么干活时不见同事,活干完了就来了 软件研发 --- AI应用研发 之 提炼提示词 软件研发 --- AI应用开发 之 AI生成PPT最佳方案 基于屏幕-摄像头的单向数据传输方案设计 俗语俗话 --- 纯虚函数 硬件研发 --- 产品介绍 之 AX6 硬件研发 --- 产品大全 之 SUMAVISION CM50X 应知应会 --- 为什么U盘不识别但是还是可以数据恢复回来 应知应会 --- 为什么我删除了一个文件但是还是可以恢复回来 软件研发 --- AI UI设计 之 PC端效果比对 常见问题修复 --- chrome浏览器白屏 应用安全 --- 逆向工程 之 C++类的本质 软件研发 --- AI提示词开发 之 代码注释提示词 dobby反编译 https://www.cnblogs.com/Un1corn/p/18615567 应知应会 --- 手机作为热点,windows电脑临时作为网关,给其他电脑上网 应知应会 --- 大量小文件如何快速迁移 常见问题解决 --- apk安装过程中闪退 应用安全 --- 安卓逆向 之 dobby框架 在线生成 APK 图标工具推荐 一个开源库 术语俗话 --- 什么是软件即服务 软件神器 --- 常用谷歌插件 应用安全 --- 逆向技巧 之 识别未知函数 人生感悟 --- 为什么两句话可以说明白的事情要500字说明 软件研发 --- Dify 生成 PPT 方案分析 应用安全 --- 逆向技巧 之 IDA未知函数如何识别 https://yuuki.cool/ 应用安全 --- 逆向技巧 之 ELF节(Section) 与 段(Segment) 硬件研发 --- 接口 人生感悟 --- 为什么ld一直爱开会 应用安全 --- 逆向技巧 之 IDA和claude反编译缺陷 应用安全 --- 逆向技巧 之 ida反编译yahfa的so和源码的差异化比对
应用安全 --- IDA签名 之 原理分析
GKLBB · 2026-06-08 · via 博客园 - GKLBB

FLIRT(Fast Library Identification and Recognition Technology)是 IDA 的库函数快速识别技术,核心原理是基于编译器生成的库函数特征模板(签名),用树状模式匹配 + CRC 校验识别二进制中的库函数,把无名的 sub_xxxx 恢复为 strlen/printf 等标准名称。

以识别 strlen 为例


总览

┌─────────────────────────────────────────────────────────────┐
│                    完整识别流程                               │
│                                                             │
│  [静态库] → [提取特征] → [生成签名] → [IDA匹配] → [标注]    │
│   .lib        .pat          .sig        识别          函数名  │
└─────────────────────────────────────────────────────────────┘

第一阶段:准备签名库(离线完成)

1.1 原始函数机器码

; strlen 编译后的机器码
; 地址无关,只看字节内容

偏移  机器码          汇编
+00:  55              push ebp
+01:  8B EC           mov  ebp, esp
+03:  8B 45 08        mov  eax, [ebp+8]    ; eax = s (参数)
+06:  8A 08           mov  cl, [eax]       ; cl = *s
+08:  84 C9           test cl, cl
+0A:  74 09           jz   +09             ; ← 偏移可变!
+0C:  90              nop
+0D:  40              inc  eax
+0E:  8A 08           mov  cl, [eax]
+10:  84 C9           test cl, cl
+12:  75 FB           jnz  -05             ; ← 偏移可变!
+14:  2B 45 08        sub  eax, [ebp+8]
+17:  5D              pop  ebp
+18:  C3              ret
; 函数总长 = 0x19 = 25 字节

1.2 FLAIR工具提取特征 → 生成 .pat

Step1: 提取前32字节
55 8B EC 8B 45 08 8A 08 84 C9 74 09 90 40 8A 08
84 C9 75 FB 2B 45 08 5D C3
(本函数只有25字节,不足32字节则全取)

Step2: 标记可变字节(跳转偏移)
偏移+0A 的 09 → 可变 → 掩码为 ..
偏移+12 的 FB → 可变 → 掩码为 ..

Step3: 生成 pat 条目
55 8B EC 8B 45 08 8A 08 84 C9 74 .. 90 40 8A 08 84 C9 75 .. 2B 45 08 5D C3
                              ^^                        ^^
                           掩码                       掩码

pat完整一行:
55 8B EC 8B 45 08 8A 08 84 C9 74 .. 90 40 8A 08 84 C9 75 .. 2B 45 08 5D C3 19 A1B2 0019 :0000 _strlen
│                                                                           │  │    │    └─── 函数名
│                                                                           │  │    └──────── 函数总长(0x19=25)
│                                                                           │  └───────────── CRC16值
│                                                                           └────────────────可变区长度
└──────────────────────────────────────────────────────────────────────────────────────────── 掩码后的前缀

1.3 sigmake 生成 .sig

运行命令:
sigmake msvcrt.pat msvcrt.sig

内部构建 Trie 树:

└─[55]
  └─[8B EC]
    └─[8B 45 08]
      └─[8A 08 84 C9 74 ..]
        └─[90 40 8A 08 84 C9 75 ..]
          └─[2B 45 08 5D C3]
            └─ 叶子节点
               ├── crc_len : 0x05
               ├── crc16   : 0xA1B2
               ├── total   : 0x19
               └── name    : "_strlen"

第二阶段:IDA 加载分析(在线识别)

2.1 IDA 发现未知函数

IDA 反汇编视图:

.text:00401080 sub_401080:          ; ← 未识别,显示为sub_XXXXXX
.text:00401080     push    ebp
.text:00401081     mov     ebp, esp
.text:00401083     mov     eax, [ebp+8]
.text:00401086     mov     cl, [eax]
.text:00401088     test    cl, cl
.text:0040108A     jz      short loc_401095
.text:0040108C     nop
.text:0040108D loc_40108D:
.text:0040108D     inc     eax
.text:0040108E     mov     cl, [eax]
.text:00401090     test    cl, cl
.text:00401092     jnz     short loc_40108D
.text:00401094 loc_401095:
.text:00401094     sub     eax, [ebp+8]
.text:00401097     pop     ebp
.text:00401098     retn

2.2 加载 .sig 文件

IDA操作:
File → Load File → FLIRT Signature File
选择 msvcrt.sig

或快捷键: Shift+F5

2.3 IDA 提取函数字节

从地址 0x00401080 读取字节:

原始字节:
55 8B EC 8B 45 08 8A 08 84 C9 74 [09] 90 40 8A 08
84 C9 75 [FB] 2B 45 08 5D C3

对可变位置应用掩码:
55 8B EC 8B 45 08 8A 08 84 C9 74 [..] 90 40 8A 08
84 C9 75 [..] 2B 45 08 5D C3

掩码后用于Trie匹配的序列:
55 8B EC 8B 45 08 8A 08 84 C9 74 .. 90 40 8A 08 84 C9 75 .. 2B 45 08 5D C3

2.4 Trie 树匹配过程

逐字节在Trie中查找:

输入:  55  → 匹配根节点子节点[55] ✓
输入:  8B  → 匹配下一层[8B EC]   ✓
输入:  EC  →                      ✓
输入:  8B  → 匹配[8B 45 08]      ✓
输入:  45  →                      ✓
输入:  08  →                      ✓
...
输入:  C3  → 到达叶子节点!

叶子节点数据:
┌──────────────────────────────┐
│ 候选函数: _strlen            │
│ crc_len:  5                  │
│ crc16:    0xA1B2             │
│ total:    0x19               │
└──────────────────────────────┘

结果:找到1个候选 → 进入CRC验证

2.5 CRC16 精确验证

确定CRC计算范围:
函数起始地址:  0x401080
前缀长度:      25字节(函数总长不足32字节的情况)
CRC区域:       这里直接对非可变字节计算

实际参与CRC计算的字节(跳过可变字节):
偏移  字节  是否参与
+00:  55   ✓
+01:  8B   ✓
+02:  EC   ✓
+03:  8B   ✓
+04:  45   ✓
+05:  08   ✓
+06:  8A   ✓
+07:  08   ✓
+08:  84   ✓
+09:  C9   ✓
+0A:  74   ✓
+0B:  09   ✗ 跳过(可变)
+0C:  90   ✓
...
+12:  75   ✓
+13:  FB   ✗ 跳过(可变)
+14:  2B   ✓
...

计算 CRC16 结果 = 0xA1B2

对比签名:
计算值 0xA1B2 == 存储值 0xA1B2  → ✓ 验证通过!

2.6 确认并标注函数名

验证通过!IDA 执行标注:

操作:
sub_401080  →  strlen

同时:
1. 函数注释自动添加
2. 参数名称恢复(如果sig包含类型信息)
3. 相关引用同步更新

第三阶段:识别结果

标注前

.text:00401080 sub_401080 proc near
.text:00401080     push    ebp
.text:00401081     mov     ebp, esp
.text:00401083     mov     eax, [ebp+arg_0]
...
.text:00401098     retn
.text:00401098 sub_401080 endp

标注后

.text:00401080 strlen proc near          ; ← 自动识别!
.text:00401080     push    ebp
.text:00401081     mov     ebp, esp
.text:00401083     mov     eax, [ebp+s]  ; ← 参数名也恢复了
...
.text:00401098     retn
.text:00401098 strlen endp

; 调用处也自动更新:
.text:00401200     push    eax
.text:00401201     call    strlen         ; ← 原来是 call sub_401080

完整流程一图总结

离线阶段                              在线阶段
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                                      
msvcrt.lib                            待分析的 binary
    │                                      │
    ▼                                      ▼
[pelf工具]                          IDA 反汇编
提取每个函数字节                     发现 sub_401080
    │                                      │
    ▼                                      ▼
标记可变字节(..)                     读取函数字节
74 09 → 74 ..                        55 8B EC ...
    │                                      │
    ▼                                      ▼
生成 .pat 文件                       应用 .. 掩码
[前缀+CRC+函数名]                    74 09 → 74 ..
    │                                      │
    ▼                                      ▼
[sigmake工具]                        Trie 前缀匹配
构建压缩Trie树                       找到候选: strlen
    │                                      │
    ▼                                      ▼
生成 .sig 文件  ──────加载──────►    CRC16 验证
                                     0xA1B2 == 0xA1B2 ✓
                                    标注函数名
                                    sub_401080 → strlen ✓

关键点回顾

步骤核心操作目的
提取前缀 取函数前32字节 快速过滤
掩码处理 跳转偏移置.. 消除地址相关性
Trie匹配 逐字节查树 找到候选函数
CRC验证 计算非可变字节校验值 精确区分相似函数
标注结果 写入函数名/参数名 辅助逆向分析

免责声明 本文档所有内容仅供安全研究、学术交流与技术学习使用,严禁用于任何未经授权的逆向破解、网络攻击、隐私窃取、恶意软件开发及其他违反《中华人民共和国网络安全法》《数据安全法》等法律法规的行为,使用者应确保已获得目标软件权利人的合法授权并自行承担因使用本文档内容所产生的一切法律责任与后果,作者不对任何直接或间接损害承担任何责任,继续阅读即视为您已知悉并同意上述全部条款。