逆向解析苹果 bplist 的问题

scienhub · 昨天 08:02 · 1769 次点击

目的

解析 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 开发的,可以指点下如何快速定位源代码里相关代码的?

举报· 1769 次点击
登录 注册 站外分享
16 条回复  
levelworm 初学 昨天 08:14
Is this something related? https://github.com/horosproject/horos/blob/880829c8ae5cee1f660ac37c4181bd7b37dc4259/NIfTI_Library/nifti1_io.c#L6847
levelworm 初学 昨天 08:15
OK maybe this one... https://github.com/horosproject/horos/blob/880829c8ae5cee1f660ac37c4181bd7b37dc4259/Horos/Sources/ROI.h#L88
scienhub 楼主 小成 昨天 08:19
@levelworm Thanks for checking the source! I’ll look into the two spots you mentioned, but might be tricky without a proper debug.
levelworm 初学 昨天 08:20
@scienhub #3 Sorry I know very little about MacOS programming, and not a good programmer :) 92% doesn't look bad though, what are the rest of 8%? Just curious.
levelworm 初学 昨天 08:21
Also, try out this tool: ImHex, a hex editor for reverse engineering. It has a bplist pattern parser: https://github.com/WerWolv/ImHex-Patterns/blob/master/patterns/bplist.hexpat
scienhub 楼主 小成 昨天 08:24
@levelworm No clear pattern in the failed cases. All were exported from the same OsiriX version on the same Mac Studio server, and the patients are from the same hospital cohort.
ETiV 小成 昨天 08:34
macOS 自带一个 PlistBuddy 没在默认的 PATH 下, /usr/libexec/PlistBuddy 。可以 dump 成 xml 再进行解析。
shuax 小成 昨天 08:43
你把 python 的 bplist 代码改改就行了吧,那个比较简单的。
ratazzi 小成 昨天 09:07
man plutil 可以转成 xml ,也可以从 xml 转回去
12下一页
返回顶部