【发布时间】:2013-11-03 12:08:42
【问题描述】:
Apple 的 iWork 套件的早期版本使用非常简单的文档格式:
- 文档是资源包(文件夹,无论是否压缩)
- 捆绑包包含一个
index.apxl[z]文件,该文件以专有但相当容易理解的模式描述文档结构
iWork '13 已完全重做格式。文档仍然是捆绑包,但索引 XML 文件中的内容现在被编码在一组二进制文件中,类型后缀为 .iwa 打包到 Index.zip 中。
例如,在 Keynote 中,有以下iwa 文件:
AnnotationAuthorStorage.iwa
CalculationEngine.iwa
Document.iwa
DocumentStylesheet.iwa
MasterSlide-{n}.iwa
Metadata.iwa
Slide{m}.iwa
ThemeStylesheet.iwa
ViewState.iwa
Tables/DataList.iwa
对于MasterSlides 1…n 和Slides 1…m
从它们的命名中可以清楚地看出它们中的每一个的目的。这些文件甚至看起来是未压缩的,基本上所有内容文本都直接作为字符串在二进制 blob 中可见(尽管在可读的 ASCII 字符中间有一些像 RTF/NSAttributedString/类似相关的垃圾)。
我已在此处发布了一个简单示例 Keynote 文档的解包 Index:https://github.com/jrk/iwork-13-format。
但是,整体文件格式对我来说并不明显。 Apple 长期以来一直使用简单的平台标准格式(如 plist)来编码他们的大部分文档,但文件开头没有明确的类型标签,我不清楚这些 iwa 文件是什么.
这些文件是否敲响了警钟?是否有证据表明它们采用某种可合理理解的序列化格式?
翻阅 Keynote 应用程序运行时和使用 F 脚本的类转储,我发现的唯一证据是在似乎用于 iWork 的序列化类中使用了协议缓冲区,例如:https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/iWorkImport.framework/TSPArchiverBase.h。
通过protoc --decode_raw 快速传输一些文件,去掉前 0…16 个字节,没有任何明显可用的东西。
【问题讨论】:
-
你有没有试过
file ThemeStylesheet.iwa看看file是否能弄清楚它们是什么? -
是的,文件只返回
data(即它不知道)。 -
我也在尝试解码这种格式,但专注于页面,所以我在看
Document.iwa。有几个人建议 Apple 正在使用协议缓冲区,所以我写了一个脚本到--decode_raw文档的所有可能切片(例如字节 100 -> 3000)。和你一样,我发现没有可用的输出。 -
尝试
strings /Applications/Pages.app/Contents/MacOS/Pages | grep google::protobuf从 Pages 应用程序中获取所有 protobuf 数据,您可以将这些数据与各个 Pages 文档相关联。
标签: macos cocoa serialization format reverse-engineering