FindFunc 是一款 IDA Pro 插件,用于查找包含指定汇编或字节模式、引用特定名称或字符串、或符合其他各种约束条件的代码函数。
FindFunc 在 2022 年 HexRays IDA Pro 插件大赛 中荣获第三名!

FindFunc 的主要功能是让用户指定一组“规则”或约束条件,IDA Pro 中的代码函数必须满足这些条件。FF 将查找并列出所有满足 所有 规则的函数(因此目前所有规则都是 AND 连接)。例外:规则可以“反转”为否定匹配。因此,此类规则符合“AND NOT”逻辑。
FF 将以智能顺序调度规则,以最大程度减少处理时间。 功能概览:
“查找函数”按钮清除现有结果并开始新搜索, “细化结果”仅考虑上一次搜索的结果。
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 文本反汇编的文本搜索,而是对底层指令执行高级匹配。 代码片段可包含多条连续指令,每行一条。支持函数块。 除了字面汇编外,还支持特殊通配符匹配:
更多示例:
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 的指令示例:
mov eax, 0x100
mov eax, [0x100]
and al, [eax + ebx*8 + 0x100]
push 0x100
立即数可以直接从剪贴板粘贴到规则列表中。 注意:IDA 会对立即数的任意大小和位置进行广泛匹配。如果你知道它是 4 或 8 字节的特定宽度,使用字节模式可能更快(但可能产生误报)。
函数必须至少包含一次给定的字节模式。 模式格式与 IDA 的二进制搜索相同,因此支持通配符——完美匹配高级复制功能!
示例:
11 22 33 44 aa bb cc
11 22 33 ?? ?? bb cc -> ?? 表示任意字节
字节模式可以直接从剪贴板粘贴到规则列表中。 注意:模式匹配相当快,是快速缩小匹配范围的好选择!
函数必须至少引用一次给定的字符串。 字符串匹配使用 Python 的 'fnmatch' 模块,因此支持通配符样式的匹配。 匹配不区分大小写。 考虑以下格式的字符串:[idaapi.STRTYPE_C, idaapi.STRTYPE_C_16](可在 Config 类中更改)。
示例:
注意:字符串匹配很快,是缩小候选范围的好选择!
函数必须至少引用一次给定的名称/标签。 名称/标签匹配使用 Python 的 'fnmatch' 模块,因此支持通配符样式的匹配。 匹配不区分大小写。
示例:
注意:名称匹配非常快,是快速缩小候选范围的好选择!
函数的大小必须在给定的范围内:"min <= 函数大小 <= max"。 数据以 "min,max" 格式的字符串输入。 函数大小包括其所有块。
注意:函数大小匹配非常快,是快速缩小候选范围的好选择!
为了方便使用,FF 支持以下键盘快捷键:
其他 GUI 使用
我们经常需要搜索汇编的二进制模式,但又不希望包含硬编码的地址和值(立即数),甚至只希望得到指令的实际操作码。FindFunc 通过在反汇编弹出菜单中添加三个复制选项使这变得简单:
将所有指令字节作为十六进制字符串复制到剪贴板,用于字节模式规则(或 IDA 的二进制搜索)。
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
将复制为:
b8 44 33 22 11 68 00 00 00 01 66 89 44 24 70
复制给定指令的指令字节,屏蔽任何立即数。
示例:
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
将复制为:
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 44 24 ??
将所有指令字节作为十六进制字符串复制到剪贴板,屏蔽任何不是实际操作码的字节(包括 SIB、ModR/M,但保留传统前缀)。
B8 44332211 mov eax,11223344
68 00000001 push 1000000
66:894424 70 mov word ptr ss:[esp+70],ax
将复制为:
b8 ?? ?? ?? ?? 68 ?? ?? ?? ?? 66 89 ?? ?? ??
一种保留操作码和立即数但屏蔽例如 ModR/M 的组合。 注意,即使操作码强制指定特定寄存器,此选项也会保留操作码,例如:
B8 44332211 mov eax,11223344
将保留操作码 B8。
注意:这是使用 IDA API 的“尽力而为”,因此在极少数情况下可能仅部分有效。 要实现 100% 正确的解决方案,我们需要附带一个专用的 x86 反汇编库。
类似的结果也可以通过代码模式规则实现,但此方法可能更快,无论是用户交互还是实际搜索。
将选中的反汇编文本按 IDA 中的显示方式复制到剪贴板。
关于性能的简要说明: