公司动态

如何训练自己的Pigaios匹配模型:数据集生成与模型训练完整教程

📅 2026/8/23 16:32:53
如何训练自己的Pigaios匹配模型:数据集生成与模型训练完整教程
如何训练自己的Pigaios匹配模型数据集生成与模型训练完整教程【免费下载链接】pigaiosA tool for matching and diffing source codes directly against binaries.项目地址: https://gitcode.com/gh_mirrors/pi/pigaiosPigaios 是一款将 C 源代码直接与二进制文件做匹配和对比diff的逆向工程工具它可以把源代码中的函数名、结构体和枚举直接导入 IDA 数据库。本文是一份完整教程带你从零学会 Pigaios 匹配模型训练如何生成自己的数据集、如何用一条命令训练决策树模型以及如何在 IDA 中验证匹配效果 一、Pigaios 是什么30 秒了解Pigaios希腊语源之意解决的是逆向工程师的一个痛点明明手里有源代码二进制里的函数却全是 sub_401000 这样的无名符号。它的工作流程是用 Clang 解析 C/C 源码即使代码不可完整编译也没关系从每个函数的抽象语法树AST中提取特征用同样的方式从 IDA 数据库导出二进制侧的函数特征对比两边特征找出匹配并通过调用图扩散发现更多符号用专家系统 机器学习双重方式给每个匹配打分——这就是本文要训练的模型机器学习部分的实现位于ml/pigaios_ml.py训练好的模型保存在ml/clf.pkl匹配引擎sourceimp_core.py在打分时会加载该模型做最终判断。二、为什么需要训练自己的匹配模型项目自带的clf.pkl是在 ZLib、Libxml2、Curl、Busybox、GMP、coreutils、SQLite 等库上训练出来的通用模型详见datasets/README.md。但当你面对特定领域的代码比如自家固件、某个编译器版本、特定架构时用自己数据训练过的模型通常能带来更低的误报率。官方数据集的参考成绩是总体正确率约 99.4%误报率仅约 0.08%完全自训练也有机会逼近这个水平。三、环境准备安装依赖并克隆仓库Pigaios 的机器学习部分依赖 SciKit-Learn、NumPy 和 joblib。Debian 系系统可以这样安装sudo apt-get install clang python-clang-5.0 libclang-5.0-dev python-colorama python-sklearnWindows 下则通过 pip 安装pip install clang-5 colorama scikit-learn 注意机器学习属于可选功能即使不安装 SciKit-LearnPigaios 的专家系统评分依然可用。接着克隆项目git clone https://gitcode.com/gh_mirrors/pi/pigaios cd pigaios四、数据集生成如何构建训练数据4.1 数据集长什么样模型训练的原始数据是 CSV 文件每一行代表一对源函数与二进制函数的对比结果。仓库中提供了一个现成的示例数据集datasets/dataset.csv.bz2解压后可以看到它的表头name1,name2,accurate,bin_calls,bin_conditions,bin_externals,bin_globals, bin_loops,bin_recursive,bin_switchs,callees_json_matched, callees_json_non_matched,calls_diff,conditions_diff,src_calls,src_loops,...这些特征都来自函数 AST 统计包括函数调用数、条件分支数、循环数、switch 分支数全局变量、外部符号、是否递归对调用者/被调用者列表JSON 字段还会拆出总数 / 匹配数 / 未匹配数三个维度第三列accurate是标签1 表示真正匹配0 表示不匹配4.2 用两个 SQLite 数据库生成 CSV正式的数据集由源码头数据库和二进制数据库两个 SQLite 文件交叉对比而来。完整流程是先对源代码目录执行srcbindiff.py -create生成项目文件再执行srcbindiff.py -export导出源码头 SQLite 库README 中有完整的 Zlib 示例在 IDA 中打开目标二进制运行sourceimp_ida.py脚本它会把二进制侧同样特征的 SQLite 库导出出来运行数据集生成脚本python2.7 ml/pigaios_create_dataset.py 源码库.sqlite 二进制库.sqlite dataset.csv脚本核心逻辑在ml/pigaios_create_dataset.py的CPigaiosTrainer类中它会attach两个数据库、对 functions 表做全连接对比并把每对函数转成一行特征写入 CSV。同时脚本内置了一个BANNED_FUNCTIONS黑名单如main、__strcpy_chk等编译器/平台内置函数会自动跳过这些噪声样本。4.3 正负样本比例的小技巧只有正样本正确匹配是不够的模型必须见过足够多错误配对。datasets/sqlite.script给出了官方做法——从匹配结果表中取出所有accurate 1的正样本再随机抽取 100 万个accurate 0的负样本select * from matches where accurate 1; select * from matches where accurate 0 order by random() limit 1000000;把两段查询结果拼成一个 CSV就是标准的训练数据集 ✅五、模型训练一条命令搞定5.1 默认训练决策树分类器把训练用的dataset.csv放到当前工作目录脚本默认路径就是它然后执行python2.7 ml/pigaios_ml.py --train训练过程会依次打印四个阶段Loading data...加载 CSV→Fitting data with DecisionTreeClassifier(gini)用基尼系数拟合决策树→Predicting...回测→Saving model...用 joblib 保存为clf.pkl。回测输出示例一眼看懂模型质量[Thu Dec 6 21:05:14 2018] Correctly predicted 13813 out of 19075 (false negatives 5262 - 27.585845%, false positives 832 - 0.083200%) [Thu Dec 6 21:05:14 2018] Total right matches 1012981 - 99.402007%重点关注false positives误报率匹配工具里误报比漏报更伤体验目标应压到 1% 以下。5.2 验证已训练的模型不重新训练、只检验当前clf.pkl的表现python2.7 ml/pigaios_ml.py --verify它会加载模型和数据跑一遍预测输出同样的三项指标方便你横向对比不同轮次训练的效果。六、进阶玩法多分类器投票与决策树可视化pigaios_ml.py还支持多种算法和调试手段完整参数看脚本内usage()输出参数说明--random-forest随机森林分类器内置 10 棵树--logistic-regression逻辑回归--gaussian-naive-bayes高斯朴素贝叶斯--multi-classifierPigaios 多分类器决策树 随机森林 贝叶斯 GBDT 组合投票--voting-classifier硬投票集成并输出 5 折交叉验证准确率--graphviz导出决策树为pigaios.dot并渲染成图直观查看模型学到了什么--criterion-entropy把决策树准则从 gini 换成信息熵官方最终方案--multi-classifier就是多个分类器并行拟合、取平均概率投票这也是datasets/README.md中 99.4% 正确率成绩的来源。想看决策树的思维路径训练后跑一下--graphviz就能用图的方式理解模型依据哪些特征通常是函数名相似度、调用数差异等做判断 七、新模型生效在 IDA 中使用训练出的clf.pkl会被匹配引擎自动加载sourceimp_core.py中通过CPigaiosClassifier().load_model()读取它对每对候选函数调用predict_proba得出一个 0~1 的匹配概率与专家系统评分一起决定最终结果。因此你只需保证训练脚本在项目根目录下运行模型默认保存在ml/同级的clf.pkl在 IDA 中重新运行sourceimp_ida.py新的打分就自动生效了。八、常见问题Q1训练时报 sklearn 相关错误pigaios_ml.py会读取sklearn.__version__适配 0.x 与 1.x 两个大版本建议升级到较新的 scikit-learn旧版 API 差异会导致部分参数如presort失效。Q2脚本是 Python 2.7 的能跑吗仓库附带了others/py3compat.py兼容性处理两个脚本均使用from __future__ import print_functionPython 3 环境一般可直接运行。Q3数据集只有几万行够用吗特征维度约 30 个、且类别边界相对清晰几千到几万行正样本配合足量负样本即可训练出可用模型负样本宁多勿少可参考官方 100 万负样本的做法。Q4如何快速定位效果不好的原因先用--verify复现指标再用--graphviz查看决策树第一层分裂的是哪个特征如果某个特征如calls_diff主导分裂但你的场景里该特征噪声大考虑在生成数据集时过滤对应样本。九、小结本教程完整覆盖了 Pigaios 匹配模型训练闭环导出源码头/二进制两个 SQLite 库 → 用ml/pigaios_create_dataset.py生成 CSV 数据集 → 用ml/pigaios_ml.py --train训练 →--verify验证 → 在 IDA 中享受更准的符号匹配。从准备数据到模型上线熟练后 10 分钟即可跑完一轮迭代。结合--multi-classifier集成投票你完全可以为自己手上的目标平台炼出一个误报率低于 1% 的专属匹配模型 【免费下载链接】pigaiosA tool for matching and diffing source codes directly against binaries.项目地址: https://gitcode.com/gh_mirrors/pi/pigaios创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考