逆向解析苹果 bplist 的问题

scienhub · 2025-3-20 08:02:53 · 1778 次点击

目的

解析 bplist 文件

背景

本人研究医学图像 AI 的,现在有个需求,就是把医生在 Osirix (一个医生看影像的软件)上圈出来的 ROI ( region of interest ,就是一个闭合的多边形,将目标区域,比如肿瘤,围起来)转出来存成 json/xml 等 readable 的格式。

由于 Osirix 批量导出的时候导出的是它自己的一个格式,里面存的是一堆 bytes ,类似于这种

b'bplist00\xd4 后面很长

说白了这东西里面存的就是 ROI 上的每个点的坐标,以及医生标注的 ROI 的名字(比如恶性肿瘤,良性肿瘤)。

大概问了下 chatGPT ,说这是 bplist 的格式(我的理解大概是 Google protobuf 类似的东西,不过是 apple 的)。

目前我们尝试了两种方案去解析 Osirix 导出的文件:

  1. 逆向工程。我们尝试了逆向工程,通过标注一些特定坐标的标注,然后观察 Osirix 导出的文件格式,大概写了个解析的代码。问题是这个逆向并不完美,总有些 case 会出现无法解析的问题。这个成功率大概有个 92%。

  2. 直接用 python 的 bplist 解析库。这个错误率更高,成功率大概只有 20%。很多 case 都无法解析。

然后我今天突然发现 Osirix 居然有个开源版本Horos,并且有 ROI 导出的相关功能。

如果有了怎么编码 ROI 的源码,按理说就能开发一个完美的工具来逆向了。问题是这个开源项目比较大,难以定位相关代码。我大概用 bplist/roi/NSKeyedArchiver 等关键词搜了下,没找到。

我的问题

有没有大哥比较熟悉 bplist 的,或者比较懂 MacOS 开发的,可以指点下如何快速定位源代码里相关代码的?

举报· 1778 次点击
登录 注册 站外分享
16 条回复  
shuax 小成 2025-3-20 10:35:41
plist 文件发来
rozbo 小成 2025-3-20 10:06:15
这种有两个格式 plist ,其实就是 xml bplist ,其实就是二进制的 plist ,b 代表 binary 是一种标准的格式,如果你只是想打开看一下,用 xcode 双击就可以 如果你想用编程的方式解析, 各个语言基本都有 libplist 可以支持到 针对你的情况,如果连 xcode 都无法打开,那有可能魔改了部分行为,就要具体去分析目标 app 的实现了。通过 ida 结合 lldb 调试去定位到。
icyalala 小成 2025-3-20 10:04:02
直接把文件改名为 plist ,然后就能用 Xcode 直接打开。或者直接下个 plistedit pro 来导出其他格式
MozzieW 小成 2025-3-20 09:52:48
按照开发改代码的思路,假设你已经把 Horos 运行起来了,可以找到页面按钮的文案,搜索文案找到对应页面,也就能找到对应的逻辑。 另外代码里面有个 ROIWindow 里面有 export xml 功能,不知道是不是你要找的
elgae 小成 2025-3-20 09:48:04
发个 ROI 文件,我试试看
scienhub 楼主 小成 2025-3-20 09:14:16
@ETiV @shuax @ratazzi python bplist 这个我试过的,很多 case 会报错。 /usr/libexec/PlistBuddy 这个我没有试过,但是我记得我试过另外一个 macOS 自带的命令行工具,也是无法转出,报错。 我猜是 Osirix 在存 bplist 的时候做了什么特殊的处理,导致标准库无法读,所以比较想到源代码里看看啥情况。
ratazzi 小成 2025-3-20 09:09:53
python plistlib 这个是标准库,也支持二进制的
ratazzi 小成 2025-3-20 09:07:04
man plutil 可以转成 xml ,也可以从 xml 转回去
shuax 小成 2025-3-20 08:43:53
你把 python 的 bplist 代码改改就行了吧,那个比较简单的。
12下一页
返回顶部