Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
FindFunc — IDA Pro 插件,用于根据汇编模式、字节序列、字符串/名称引用和大小约束过滤函数,支持基于规则的搜索和高级二进制复制。 | Kitploit
工具/GitHubGitHub/felixber/findfunc
静态分析代码分析逆向工程调试器二进制分析
GitHubfelixber/findfunc

FindFunc

IDA Pro 插件,用于根据汇编模式、字节序列、字符串/名称引用和大小约束过滤函数,支持基于规则的搜索和高级二进制复制。

查看仓库
362369个月前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

FindFunc: IDA Pro 中函数的高级筛选/搜索

FindFunc 是一款 IDA Pro 插件,用于查找包含指定汇编或字节模式、引用特定名称或字符串、或符合其他各种约束条件的代码函数。

FindFunc 在 2022 年 HexRays IDA Pro 插件大赛 中荣获第三名!

ffmain

通过规则进行筛选

FindFunc 的主要功能是让用户指定一组“规则”或约束条件,IDA Pro 中的代码函数必须满足这些条件。FF 将查找并列出所有满足 所有 规则的函数(因此目前所有规则都是 AND 连接)。例外:规则可以“反转”为否定匹配。因此,此类规则符合“AND NOT”逻辑。

FF 将以智能顺序调度规则,以最大程度减少处理时间。 功能概览:

  • 目前提供 6 种规则,见下文
  • 支持函数块(Function Chunks)
  • 智能规则调度以提升性能
  • 将规则保存/加载到/从文件(简单 ASCII 格式)
  • 多个独立标签页用于实验
  • 通过剪贴板在标签页之间复制规则(与文件格式相同)
  • 将会话(所有标签页)保存到文件
  • 高级指令字节复制(全部复制、仅操作码、除立即数外全部复制等)
  • 克隆标签页以便快速细化结果
  • 代码匹配尊重地址大小前缀和操作数大小前缀

“查找函数”按钮清除现有结果并开始新搜索, “细化结果”仅考虑上一次搜索的结果。

高级二进制复制

FF 的次要功能是提供了以以下选项复制指令二进制表示的功能:

  • 全部复制 -> 将所有字节复制到剪贴板
  • 不包含立即数复制 -> 用占位符(??)屏蔽指令字节中的立即数
  • 仅操作码 -> 除指令的实际操作码(及前缀)外,所有内容均被屏蔽
  • ...

详见下文“高级复制”部分。 此功能与字节模式规则完美互补!

构建与安装

FindFunc 是一个 IDA Pro Python 插件,没有外部包依赖。 安装方式:下载仓库,然后将文件 'findfuncmain.py' 和文件夹 'findfunc' 复制到 IDA Pro 插件目录。 对于 IDA 9.0+,也可以将仓库直接克隆到插件目录中。 无论哪种方式,都不需要构建。

要求:IDA Pro 8.x(8.3+)及 python3 环境。 FindFunc 仅设计用于 x86/x64 架构。 已在 IDA 8.3 - 9.2、python 3.11、Windows 10 + 11 上测试。

可用规则

目前提供以下六种规则。此处按对性能的影响从重到轻排列。 对于大型数据库,建议先使用代价较低的规则缩小候选函数范围,然后再进行例如代码规则之类的重量级匹配。FF 将自动以智能方式调度规则。

代码模式

用于根据函数是否包含给定的汇编代码片段进行筛选。 这不是对 IDA 文本反汇编的文本搜索,而是对底层指令执行高级匹配。 代码片段可包含多条连续指令,每行一条。支持函数块。 除了字面汇编外,还支持特殊通配符匹配:

  • "pass" -> 匹配任意操作数的任意指令
  • "mov* any,any" -> 匹配助记符以 "mov*" 开头的指令(如 mov, movzx, ...) 以及任意两个参数。
  • "mov eax, r32" -> 匹配助记符为 "mov"、第一个操作数为寄存器 eax、第二个操作数为任意 32 位寄存器的指令。
    • 类似地:r 表示任意寄存器,r8/r16/r32/r64 表示特定宽度的寄存器,"imm" 表示任意立即数
  • "mov r64, imm" -> 匹配将常量移动到 64 位寄存器的任何指令
  • "any r64,r64" -> 匹配任意两个 64 位寄存器之间的操作
  • mov -> 匹配助记符为 mov 的任何指令

更多示例:

root@kitploit:~
mov r64, [r32 * 8 + 0x100]
mov r, [r * 8 - 0x100]
mov r64, [r32 * 8 + imm]
pass
mov r, word [eax + r32 * 8 - 0x100]
any r64, r64
push imm
push any

注意事项: 从 IDA 复制汇编时要小心。 IDA 会将局部变量名和其他信息混入指令中,导致匹配失败。 此外,不支持标签("call sub_123456")。

请注意,代码模式是最昂贵的规则,如果只有代码规则,FF 别无选择,只能反汇编整个数据库。对于非常大的二进制文件,这可能需要几分钟。见下方关于性能的说明。

立即数(常量)

函数必须至少包含一次给定的立即数(出现在任何位置)。 立即数是固定在指令二进制表示中的数值。 匹配立即数 0x100 的指令示例:

root@kitploit:~
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100

立即数可以直接从剪贴板粘贴到规则列表中。 注意:IDA 会对立即数的任意大小和位置进行广泛匹配。如果你知道它是 4 或 8 字节的特定宽度,使用字节模式可能更快(但可能产生误报)。

字节模式

函数必须至少包含一次给定的字节模式。 模式格式与 IDA 的二进制搜索相同,因此支持通配符——完美匹配高级复制功能!

示例:

root@kitploit:~
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? 表示任意字节

字节模式可以直接从剪贴板粘贴到规则列表中。 注意:模式匹配相当快,是快速缩小匹配范围的好选择!

字符串引用

函数必须至少引用一次给定的字符串。 字符串匹配使用 Python 的 'fnmatch' 模块,因此支持通配符样式的匹配。 匹配不区分大小写。 考虑以下格式的字符串:[idaapi.STRTYPE_C, idaapi.STRTYPE_C_16](可在 Config 类中更改)。

示例:

  • "TestString" -> 函数必须至少引用一次确切的字符串(忽略大小写)
  • "TestStr*" -> 函数必须至少引用一次以 'TestStr' 开头的字符串(例如 TestString, TestStrong)(忽略大小写)

注意:字符串匹配很快,是缩小候选范围的好选择!

名称引用

函数必须至少引用一次给定的名称/标签。 名称/标签匹配使用 Python 的 'fnmatch' 模块,因此支持通配符样式的匹配。 匹配不区分大小写。

示例:

  • "memset" -> 函数必须至少引用一次名称 "memset"
  • "mem*" -> 函数必须至少引用一次以 "mem" 开头的名称(memset, memcpy, memcmp)

注意:名称匹配非常快,是快速缩小候选范围的好选择!

函数大小

函数的大小必须在给定的范围内:"min <= 函数大小 <= max"。 数据以 "min,max" 格式的字符串输入。 函数大小包括其所有块。

注意:函数大小匹配非常快,是快速缩小候选范围的好选择!

键盘快捷键和 GUI

为了方便使用,FF 支持以下键盘快捷键:

  • Ctrl+Alt+F -> 启动/显示标签页小部件(主 GUI)
    • 或 View->FindFunc
  • Ctrl+F -> 使用当前启用的规则开始搜索
  • Ctrl+R -> 使用当前启用的规则细化现有结果
  • 规则
    • Ctrl+C -> 复制选中的规则到剪贴板
    • Ctrl+V -> 从剪贴板粘贴规则到当前标签页(追加)
    • Ctrl+S -> 将选中的规则保存到文件
    • Ctrl+L -> 从文件加载规则(追加)
    • Ctrl+A -> 选择所有规则
    • Del -> 删除选中的规则
  • 保存会话
    • Ctrl+Shift+S -> 将会话保存到文件
    • Ctrl+Shift+L -> 从文件加载会话

其他 GUI 使用

  • 右键单击标签页:克隆标签页选项
  • 双击数据列可编辑规则
  • 双击反转匹配列可反转规则(否定匹配)
  • 双击启用/禁用列可启用/禁用规则
  • 鼠标中键单击规则或结果中的任意单元格可将其复制到剪贴板
  • 字节模式和立即数可以直接从剪贴板粘贴到规则表中
  • 双击标签页可重命名
  • 规则列表和结果列表均支持排序
  • 双击结果项可在 IDA 中跳转到该位置
    • 函数名:跳转到函数起始处
    • 其他列:跳转到最后匹配的规则的匹配位置
  • 复选框 Profile:输出搜索的剖析信息
  • 复选框 Debug:输出代码规则匹配的详细调试信息——仅在少量函数进入代码检查规则时使用,否则可能需要很长时间!

高级二进制复制

我们经常需要搜索汇编的二进制模式,但又不希望包含硬编码的地址和值(立即数),甚至只希望得到指令的实际操作码。FindFunc 通过在反汇编弹出菜单中添加三个复制选项使这变得简单:

复制所有字节

将所有指令字节作为十六进制字符串复制到剪贴板,用于字节模式规则(或 IDA 的二进制搜索)。

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

将复制为:

root@kitploit:~
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70

仅复制非立即数字节

复制给定指令的指令字节,屏蔽任何立即数。

示例:

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

将复制为:

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??

仅复制操作码

将所有指令字节作为十六进制字符串复制到剪贴板,屏蔽任何不是实际操作码的字节(包括 SIB、ModR/M,但保留传统前缀)。

root@kitploit:~
B8 44332211      mov eax,11223344
68 00000001      push 1000000
66:894424 70     mov word ptr ss:[esp+70],ax

将复制为:

root@kitploit:~
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??

复制操作码 + 立即数

一种保留操作码和立即数但屏蔽例如 ModR/M 的组合。 注意,即使操作码强制指定特定寄存器,此选项也会保留操作码,例如:

root@kitploit:~
B8 44332211      mov eax,11223344

将保留操作码 B8。

注意:这是使用 IDA API 的“尽力而为”,因此在极少数情况下可能仅部分有效。 要实现 100% 正确的解决方案,我们需要附带一个专用的 x86 反汇编库。

类似的结果也可以通过代码模式规则实现,但此方法可能更快,无论是用户交互还是实际搜索。

复制反汇编

将选中的反汇编文本按 IDA 中的显示方式复制到剪贴板。

性能

关于性能的简要说明:

  1. 名称、字符串、函数大小在所有情况下几乎免费
  2. 字节模式对于长度 > 2 的模式几乎免费
  3. 立即数比较复杂: 我们可以使用 idaapi 搜索,或者自行反汇编整个数据库并进行搜索——如果我们正在查找代码模式,则无论如何可能都必须这样做。 但是:扫描代码模式实际上比扫描立即数便宜得多。 使用 api 搜索所有匹配项相对昂贵——大约相当于完全反汇编整个数据库的 1/8 成本。 因此:如果我们先用便宜的规则缩小匹配范围,那么反汇编剩余函数并自己查找立即数会大大受益,特别是如果同时还存在代码规则。 然而:如果没有廉价选项可用,并且由于存在代码模式规则,我们无论如何都必须反汇编数据库的大部分,那么使用一个立即数规则作为预过滤器可以带来很大好处。 使用 api 搜索一个立即数大约相当于搜索任意数量的代码模式规则的 1/8——尽管这也取决于许多不同的因素……
  4. 代码模式是迄今为止最昂贵的,但检查一个模式与检查多个模式的开销非常相似。

待办事项(未排序):

  • jcc 伪助记符
  • 允许代码规则中的命名位置('call memset')
  • 添加规则:交叉引用入/出
  • 撤销/重做
  • 进度条
  • 鼠标中键关闭标签页
  • 标签页菜单:关闭除此以外的所有标签页
  • '忽略所有后续操作数' 选项
  • 函数内部 API 调用的参数规则
  • 父/调用点/子函数要求的规则
  • 函数参数规则
  • 正则表达式规则
  • 字符串/名称:大小写选项
  • 自动将立即数规则转换为字节模式(如果适用)?
  • 设置:大小写敏感、字符串类型、范围等
  • Hexray 规则?
  • 规则的 OR 组合
  • 代码的 Python 化 ;)
  • 并行化
  • 自动生成规则以识别函数?
下载工具