如何用 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之前,需要满足以下前提:
已安装 Ghidra 发行版。
bsim位于发行版的support目录。不确定参数拼写时,不带参数运行./bsim会打印详细用法信息。有一个包含已分析程序的本地 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。有一个 H2 后端的 BSim 数据库(教程中的例子叫
example)。两种方式任选其一:- 在 Ghidra GUI 的 Code Browser 里运行脚本
CreateH2BSimDatabaseScript.java,Database Name填example,Database 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 位代码能够互相匹配的必要设置。- 在 Ghidra GUI 的 Code Browser 里运行脚本
执行签名生成前退出 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/folderB、file:/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 postgreslistexes列出匹配的可执行文件记录,--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),仅供参考