Apple iWork 套件的早期版本使用非常简单的文档格式:
- 文档是资源包(文件夹,压缩或未压缩)
- 该捆绑包包含一个
index.apxl[z]
以专有但相当容易理解的模式描述文档结构的文件
iWork '13 完全重做了格式。文档仍然是捆绑包,但索引 XML 文件中的内容现在编码在一组带有类型后缀的二进制文件中.iwa
装进Index.zip
.
以Keynote为例,有以下内容iwa
files:
AnnotationAuthorStorage.iwa
CalculationEngine.iwa
Document.iwa
DocumentStylesheet.iwa
MasterSlide-{n}.iwa
Metadata.iwa
Slide{m}.iwa
ThemeStylesheet.iwa
ViewState.iwa
Tables/DataList.iwa
for MasterSlide
s 1…n and Slide
s 1…m
从它们的命名中可以清楚地看出它们的用途。这些文件甚至看起来是未压缩的,基本上所有内容文本都作为二进制 blob 中的字符串直接可见(尽管在可读 ASCII 字符中存在一些类似 RTF/NSAttributedString/类似相关的垃圾)。
我已经把解压后的贴贴出来了Index
这里有一个简单的 Keynote 文档示例:https://github.com/jrk/iwork-13-format https://github.com/jrk/iwork-13-format.
然而,整体文件格式对我来说并不明显。 Apple 长期以来一直使用简单的平台标准格式(例如 plists)来编码其大部分文档,但文件开头没有明确的类型标记,而且我不清楚这些文件的含义iwa
文件是。
这些文件有任何提示吗?是否有证据表明它们采用某种合理可理解的序列化格式?
通过 F-Script 翻查 Keynote 应用程序运行时和类转储,我发现的唯一证据是在序列化类中使用了协议缓冲区,这些类似乎用于 iWork,例如:https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/iWorkImport.framework/TSArchiverBase.h https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/iWorkImport.framework/TSPArchiverBase.h.
快速通过管道传输一些文件protoc --decode_raw
前 0…16 个字节被删除,没有产生任何明显可用的东西。