【问题标题】:Reverse engineering iWork '13 formats逆向工程 iWork '13 格式
【发布时间】: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…nSlides 1…m

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

我已在此处发布了一个简单示例 Keynote 文档的解包 Indexhttps://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


【解决方案1】:

我已经对格式进行了一些逆向工程并发布了我的结果here。我已经编写了格式的description 并提供了一个示例项目。

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

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    有趣的项目,我喜欢!这是我目前发现的。

    每个 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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 2022-01-22
    • 2010-12-23
    • 2012-08-26
    • 1970-01-01
    • 2012-05-01
    相关资源
    最近更新 更多