news 2026/9/9 22:30:44

如何用 bsim 命令行从本地 Ghidra 项目生成并提交函数签名文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 bsim 命令行从本地 Ghidra 项目生成并提交函数签名文件

如何用 bsim 命令行从本地 Ghidra 项目生成并提交函数签名文件

【免费下载链接】ghidraGhidra is a software reverse engineering (SRE) framework项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra

BSim 要在 BSim 数据库里检索相似函数,前提是先有函数的 BSim 签名(feature vector)。如果你手里只有一个本地 Ghidra 项目——里面放着一批已分析的二进制文件——需要把它们的签名批量导入数据库,就可以用 Ghidra 发行版support目录下的bsim命令行工具,分两步完成:先用generatesigs从本地项目生成签名的 XML 文件,再用commitsigs把这些文件提交进 BSim 数据库。本文以本地(non-shared)Ghidra 项目和 H2 文件型 BSim 数据库为主线,因为官方参考明确建议:本地 Ghidra 项目 URL 的可见性有限,只应与本地 H2 BSim 数据库配合使用。命令均来自 BSim 教程的 BSim from the Command Line 一节和 Command-Line Utility Reference。

准备条件

在运行bsim之前,需要满足以下前提:

  1. 已安装 Ghidra 发行版bsim位于发行版的support目录。不确定参数拼写时,不带参数运行./bsim会打印详细用法信息。

  2. 有一个包含已分析程序的本地 Ghidra 项目。教程里的示例项目是postgres_object_files,它是先用 headless 分析器批量分析得到的:

    cd <ghidra_install_dir>/support ./analyzeHeadless <ghidra_project_dir> postgres_object_files -import ~/postgres_object_files/*

    这条命令会在<ghidra_project_dir>目录下创建名为postgres_object_files的本地 Ghidra 项目(Windows 上使用analyzeHeadless.bat并相应调整路径)。如果你的项目已经存在且包含已分析的二进制,跳过这一步。细节见 Ghidra Analysis from the Command Line。

  3. 有一个 H2 后端的 BSim 数据库(教程中的例子叫example)。两种方式任选其一:

    • 在 Ghidra GUI 的 Code Browser 里运行脚本CreateH2BSimDatabaseScript.javaDatabase NameexampleDatabase Directory选一个新建目录,其他字段不动,点OK,得到example.mv.db(详见 Creating and Populating a BSim Database from the GUI);
    • 或者直接在support目录执行:
    ./bsim createdatabase file:/<database_dir>/example medium_nosize

    其中medium_nosize是数据库模板:medium(相对于large)影响向量索引设置,对 H2 数据库无实际影响;nosize表示 4 字节及以上的 varnode 尺寸差异不计入 BSim 特征,这是让 32 位与 64 位代码能够互相匹配的必要设置。

  4. 执行签名生成前退出 Ghidra。原因(教程原文的 Important 提示):

    • H2 后端的数据库一次只能被一个进程访问;
    • 如果非共享项目(如postgres_object_files)正被 Ghidra 打开,项目处于锁定状态,签名生成会失败。

URL 书写规则(来自 Command-Line Utility Reference 的 "Ghidra and BSim URLs" 一节,后面所有命令都依赖它):

  • 本地 Ghidra 项目 URL 格式为ghidra:[/<directory_path>]/<project_name>[?/<folder_path>]<directory_path>是项目*.gprlocator 文件所在目录的绝对路径,项目名不带.gpr/.rep后缀,路径分隔符只用/本地ghidra:file:URL 的协议后只有一个斜杠,不能出现//
  • H2 文件数据库 URL 格式为file:[/<directory_path>]/<dbname>:指向数据库文件的绝对路径,不带.mv.db后缀
  • Windows 上路径要带盘符,且盘符前加/,例如ghidra:/C:/mydir/myproject?/folderA/folderBfile:/C:/mydir/mydb

下文中三个占位符的含义:<ghidra_install_dir>是 Ghidra 发行版根目录;<ghidra_project_dir>是项目*.gpr文件所在目录的绝对路径;<database_dir>是存放example.mv.db的目录绝对路径。

第一步:generatesigs 生成签名文件

进入support目录后执行(Linux/macOS 写法,Windows 自行调整路径分隔):

cd <ghidra_install_dir>/support mkdir ~/bsim_sigs ./bsim generatesigs ghidra:/<ghidra_project_dir>/postgres_object_files ~/bsim_sigs --bsim file:/<database_dir>/example

各参数与行为的含义:

  • ghidra:/<ghidra_project_dir>/postgres_object_files是存放已分析二进制的本地 Ghidra 项目 URL,注意只有一个斜杠;
  • ~/bsim_sigs是签名 XML 文件的存放目录。签名文件是包含 BSim 签名和元数据的 XML "sigs_" 文件,供 BSim 数据库使用;
  • --bsim file:/<database_dir>/example指定 BSim 数据库 URL。要强调的一点:这条命令不会把任何签名写入数据库,它只是查询数据库的配置(settings)用来生成文件;真正入库发生在下一步commitsigs
  • 如果~/bsim_sigs中已存在会冲突的签名文件,追加--overwrite允许覆盖。

如果此时还没有任何 BSim 数据库,也可以用--config选项代替--bsim直接生成 XML 文件:

./bsim generatesigs ghidra:/<ghidra_project_dir>/postgres_object_files ~/bsim_sigs --config medium_nosize

参考文档列出的可用模板为large_32, medium_32, medium_64, medium_cpool, medium_nosize

可选分支:一步到位。如果不想要中间的 XML 目录,直接省略 XML 目录参数:

./bsim generatesigs ghidra:/<ghidra_project_dir>/postgres_object_files --bsim file:/<database_dir>/example

按参考文档,指定了 BSim URL 而不带 XML 存储目录时,--commit是隐含的,生成的签名会直接提交进数据库。注意此时 XML 目录未指定,--overwrite不适用。

第二步:commitsigs 提交签名文件

签名文件生成后,仍在support目录执行:

./bsim commitsigs file:/<database_dir>/example ~/bsim_sigs

该命令把目录中的 "sigs_" XML 文件连同元数据一起提交到file:URL 指定的 BSim 仓库。两个可选参数:

  • --md5|-m <hash>:只提交与指定可执行文件 MD5(32 位十六进制)对应的签名文件;
  • --override <ghidraURL>:提交时用给定的 Ghidra URL 覆盖 sigs_ 文件里记录的可执行文件存储位置 URL。

结果验证

教程本身给出的下一步是重新启动 Ghidra(因为生成/提交期间要求 Ghidra 处于退出状态)。

如果想直接在命令行核对入库结果,Command-Line Utility Reference 提供了查询命令,它们都要求一个 BSim URL 加上--md5--name之一来定位可执行文件:

./bsim listexes file:/<database_dir>/example --name postgres ./bsim getexecount file:/<database_dir>/example --name postgres ./bsim listfuncs file:/<database_dir>/example --name postgres
  • listexes列出匹配的可执行文件记录,--limit默认 20 条,0表示不限;还可以用--arch(Ghidra processor id)、--compiler(cspec id)、--sortcol md5|name过滤和排序;
  • listfuncs列出某个可执行文件关联的全部函数记录,--maxfunc默认 1000,0不限;若可执行文件无法被唯一确定,命令会报错而不是随便挑一个。

如果listexes能列出你在generatesigs所针对项目中的可执行文件,说明提交成功。

限制与注意事项

  • 本地项目 URL 只适合本地 H2 数据库。参考文档指出,写入共享 BSim 数据库的本地 Ghidra 项目 URL 对其他用户可见性和路径有效性都很有限,共享场景应使用 Ghidra Server 仓库 URL(ghidra://<hostname>[:<port>]/<repository_name>[/<folder_path>])。
  • H2 后端不适合大规模或多用户场景:它基于本机文件、创建和填充快、全平台支持,但官方说明它不支持大集合二进制或多个用户(见 Introduction to BSim)。
  • 进程互斥:H2 数据库一次只允许一个进程访问,generatesigs/commitsigs期间不要开着 Ghidra 打开该项目。
  • 数据库已经建好时,createdatabase这一步是多余的,不要重复执行。

下一步

提交完成后重新启动 Ghidra,就可以在 GUI 里用这些签名做 BSim 查询:导入待逆向的可执行文件,在 Listing 中选中函数,对example数据库发起 BSim 查询,然后在 decompiler diff 视图中评估匹配结果——完整流程见教程的 Evaluating Matches 一节。

【免费下载链接】ghidraGhidra is a software reverse engineering (SRE) framework项目地址: https://gitcode.com/GitHub_Trending/gh/ghidra

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/9 22:27:03

Python数据处理作业实战:从解压zip到数据清洗与提交

简介&#xff1a;这是一份面向北京邮电大学《Python程序设计》课程的数据处理作业合集&#xff0c;目标读者是正在学习Python数据分析、爬虫与可视化的在校生及自学者。压缩包共103个文件&#xff0c;体积84.46MB&#xff0c;以Python脚本&#xff08;.py&#xff09;、Jupyter…

作者头像 李华
网站建设 2026/9/9 22:26:47

AI系统架构分层指南:Workflow与Inference的边界与协作

我这两年跟不少团队聊过AI系统架构&#xff0c;发现一个很有意思的现象&#xff1a;刚把模型训练跑通的人&#xff0c;几乎都会觉得"分层"是多余的。逻辑很简单——一个脚本里把数据处理、模型调用、结果拼装全写完&#xff0c;调通就能上线&#xff0c;为什么要拆成…

作者头像 李华
网站建设 2026/9/9 22:26:16

从零搭建LeNet风格CNN:PyTorch实现MNIST图像分类

前两篇我们把卷积的计算方式、卷积核的含义、特征图是怎么来的这些基础概念过了一遍&#xff0c;可能你已经有点感觉了&#xff1a;卷积本身不复杂&#xff0c;复杂的是怎么组织成一整套能解决实际问题的网络。这一篇就干一件事——把前面那些零散概念组装起来&#xff0c;搭出…

作者头像 李华
网站建设 2026/9/9 22:22:33

Seelen-UI:如何把 Windows 桌面改造成 5 分钟上手的高效率工具

Seelen-UI&#xff1a;如何把 Windows 桌面改造成 5 分钟上手的高效率工具 【免费下载链接】Seelen-UI The Fully Customizable Desktop Environment for Windows 10/11. 项目地址: https://gitcode.com/GitHub_Trending/se/Seelen-UI Seelen-UI 是一套跑在 Windows 10/…

作者头像 李华