逆向解析苹果 bplist 的问题

6 天前
scienhub  scienhub

目的

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

2532 次点击
所在节点   iDev  iDev
26 条回复
shuax
shuax
6 天前
@scienhub 你的不能解析的 bplist 末尾都多一个 0 ,然后 python 库 unsupported type: <class 'plistlib.UID'> 你自己补充一下应该就好吧。
ETiV
ETiV
6 天前
看了这 4 个文件,要是只需要坐标的话,直接正则匹配就行了:XY 坐标对儿都是 {a.b, m.n} 这样的字面量格式

strings {文件名} 先转一下,然后从 XNSObject 的下一行开始读,读到含有 NSMutableArray 的行截止

至于 [医生标注的 ROI 的名字(比如恶性肿瘤,良性肿瘤)] ,不知道是不是个枚举值,没有字面量的表示形式。
icyalala
icyalala
5 天前
这就是 NSKeyedArchiver 生成的 plist 文件,我逆向了一下 osirix lite ,丢给 copliot 让它写个转 json 的工具:
https://pastebin.com/JMDB5h0m

这个 plist 可能会在结尾多一个或者两个 0 ,所以解析的时候要多尝试两次。
icyalala
icyalala
5 天前
scienhub
scienhub
5 天前
@icyalala 感谢大哥!你这个代码我编译了一下能解析我这边所有的文件!

太感激了,大哥方便加个联系方式不,我主页有绿色软件联系方式,我这边给大哥发个红包,以示感谢。
icyalala
icyalala
4 天前
@scienhub 不用不用。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1119754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX