17

Apple iWork 套件的早期版本使用非常简单的文档格式:

  • 文档是资源包(文件夹,压缩与否)
  • 该捆绑包包含一个index.apxl[z]文件,该文件以专有但相当容易理解的模式描述文档结构

iWork '13 完全重做格式。文档仍然是捆绑包,但索引 XML 文件中的内容现在被编码在一组二进制文件中,类型后缀.iwaIndex.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…<em>n 和Slides 1…<em>m

从它们的命名中可以清楚地看出它们中的每一个的目的。这些文件甚至看起来是未压缩的,基本上所有内容文本都直接作为二进制 blob 中的字符串可见(尽管在可读的 ASCII 字符中间有一些像 RTF/NSAttributedString/类似相关的垃圾)。

我在Index这里发布了一个简单示例 Keynote 文档的解包: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/TSPArchiverBase.h

快速传输一些文件protoc --decode_raw,去掉前 0…16 个字节,并没有产生任何明显可用的东西。

4

2 回答 2

27

我已经对格式进行了一些逆向工程,并在此处发布了我的结果。我已经写了格式的描述并提供了一个示例项目。

基本上,.iwa 文件是使用 Snappy 压缩的 Protobuf 流。

希望这可以帮助!

于 2013-11-08T03:52:21.150 回答
3

很有意思的项目,喜欢!这是我到目前为止发现的。

每个 iwa 文件的前 4 个字节似乎是一个长度,并进行了调整。所以看起来不会有任何“魔法”来验证文件类型。

看一下 Slide1.iwa:
前 4 个字节是00 79 02 00
文件大小是 637 个字节,
取第一个字节00,然后反转字节:00 02 79
00 02 79== 633
637 - 633 = 4 个字节,保存文件的大小。

这检查了我查看的 4 个文件:Slide1.iwa、Slide2.iwa、Document.iwa、DocumentStylesheet.iwa

于 2013-10-24T21:19:57.710 回答