macos - 逆向工程 iWork '13 格式

标签 macos cocoa serialization format reverse-engineering

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

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

iWork '13 完全重做了格式。文档仍然是 bundle ,但索引 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/类似相关的垃圾)。

我在这里发布了一个简单示例主题文档的解压Index:https://github.com/jrk/iwork-13-format .

但是,整体文件格式对我来说并不明显。 Apple 长期以来一直使用简单的平台标准格式(例如 plists)来对其大部分文档进行编码,但文件开头没有明确的类型标记,而且对我来说这些 iwa< 的含义并不明显 文件是。

这些文件有任何提示吗?是否有证据表明它们采用某种合理可理解的序列化格式?

通过 F-Script 翻查 Keynote 应用程序运行时和类转储,我发现的唯一证据是在似乎用于 iWork 的序列化类中使用了 Protocol Buffer ,例如:https://github.com/nst/iOS-Runtime-Headers/blob/master/PrivateFrameworks/iWorkImport.framework/TSPArchiverBase.h .

通过 protoc --decode_raw 快速传输一些文件,并删除前 0…16 个字节,没有产生任何明显可用的内容。

最佳答案

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

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

希望这有帮助!

关于macos - 逆向工程 iWork '13 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19571787/

相关文章:

cocoa - 如何检测 NSOutlineView 的滚动?

objective-c - 使用 Spotlight 搜索结果以特定状态打开应用程序

Java - 方法的存在导致程序无法正常工作

macos - 执行此命令的 Mac OS X 方式是什么

在 Linux/MAC 上无法识别 http 响应中的 JSON 编码的 unicode 但在 Windows 上?

ios - 我在 Mac OSX 应用程序上使用的类似于 iOS 上的 UITableView 的控件是什么?

c++ - MacOS Sierra - cmake 因 qt5 而失败

objective-c - 固定对象位于 NSWindow 右侧

ios - 我如何判断 NSData dataWithContentsOfFile 何时加载我的 plist?我什么时候可以获取/分配值?

java - 在客户端使用额外变量但版本 ID 相同的序列化和反序列化