如何对专有文件格式进行逆向工程 - 嘶吼 RoarTalk – 网络安全行业综合服务平台,4hou.com

如何对专有文件格式进行逆向工程

walker 技术 2023-03-07 11:00:00
99219
收藏

导语:现代 IT 产品通常必须处理各种文件格式。虽然确保与开放文件格式的兼容性很容易,但让您的软件处理专有或封闭文件格式却很棘手。

现代 IT 产品通常必须处理各种文件格式。虽然确保与开放文件格式的兼容性很容易,但让您的软件处理专有或封闭文件格式却很棘手。

主要的挑战是没有一种通用的解决方案来反转专有文件格式。在每种情况下,您都必须根据手头的数据采取不同的行动。

在本文中,我们探讨了专有文件格式是什么以及为什么您可能需要对一种文件格式进行逆向工程。我们还分享了我们处理封闭格式文件的经验,并展示了一些从中恢复数据的方法。本文对于希望通过支持封闭文件格式来增强产品互操作性的开发领导者很有用。

以专有格式反转文件的方式和原因

文件格式具有用于结构化和存储数据的特定编码方案。如果没有特定的软件或硬件,专有文件格式通常无法解码和解释。数据通常由专有软件以专有格式读取和保存。

专有格式通常被设计为保密的,这意味着数据编码格式的规范不公开发布或仅在保密协议下披露。有时,创建者(个人开发者或组织)会发布编码详细信息,但会通过许可证限制格式的使用。因此,专有格式被认为是封闭格式,与公开格式形成对比,开放格式可供所有人免费使用。

封闭文件格式的著名示例是 WMA 和 CDR。一些流行的文件格式,如 XLS 和 DOC,过去是封闭的和未记录的,但现在是开放的。

为什么需要对专有文件格式进行逆向工程?

软件开发人员通常需要对专有文件格式进行逆向工程以提高软件互操作性。

处理封闭文件格式的法律立场因各国与软件专利相关的法律而异。但是,为提高互操作性而对文件格式进行逆向工程通常是合法的。此外,您可能需要对计算机取证的封闭文件格式进行逆向工程。

没有通用的方法来对每次都有效的封闭文件格式进行逆向工程。每个案例都是独立的。在本文中,我们探讨了针对不同情况恢复专有文件格式的三个示例:

image.png

确定专有文件格式的 3 种方法

让我们详细探讨每个场景,从我们可以避免逆向工程的场景开始。

如何根据文件签名确定专有文件格式

使用任何文件格式都从发现格式的名称并找到可以使用它的解析器开始。有时,此过程可能很简单,您只需在 Google 中键入< file extension > parser 即可找到相关的解析器。

但是,文件扩展名有时与文件的实际格式不匹配。例如,计算机游戏通常将其资源文件扩展名指定为 DAT,尽管它们内部可以是 ZIP 文件。此外,一些基于Matroska容器的视频格式使用自定义编解码器来传输视频,因此它们具有非标准文件扩展名。

要确定文件格式,您可以使用专门的工具,例如:

  • file(1) — 在 Linux 中确定文件类型的工具

  • Binwalk — 用于分析、逆向工程和提取固件映像的工具

  • FACT 提取器——提取最常见容器格式的工具

然后,您需要检查文件是否已存档和加密。一种方法是使用Hex Workshop 中的Data Visualizer功能。

如果文件可能被归档,请尝试使用7-Zip打开它。令人惊讶的是,这个文件归档器可以通过扫描文件的开头来识别格式。即使文件在 ZIP 数据之前有一些自定义标头,7-Zip 仍然可以识别它。

另一个有用的工具是Offzip,它允许您以二进制代码搜索 zlib 流并将它们提取为文件。

所有这些工具都提供了识别已知文件格式并避免在没有实际需要的情况下进行逆向工程的机会。但是如果您找不到文件格式,您可以尝试使用文件的签名来搜索它。要发现文件的签名,请在十六进制编辑器中打开文件。

文件签名,也称为幻数,是文件开头的唯一字节序列,用于标识其格式。通常,文件签名是指文件的前二到八个字节。获得文件签名后,在 Google 和 GitHub 上搜索幻数,使用在网站或代码中如何描述这些数字的不同变体。

假设您的文件签名以以下字节开头:41 50 52 34 65 76 65 72。以下是您应该尝试的搜索请求的几个示例:

  • 41 50 52 34 65 76 65 72 签名

  • 41 50 52 34 65 76 65 72 魔法

  • 41 50 52 34 签名

  • 41 50 52 34 魔法

  • 41505234(因为签名也可以是DWORD)

  • 0x41 0x50 0x52 0x34 0x65 0x76 0x65 0x72 签名

  • 0x41505234

  • 0x34525041(如果是小端)

  • 您还可以使用美国信息交换标准代码(ASCII)。在我们的例子中,我们对文件签名的搜索查询看起来像“APR4ever”。

这种方法可以帮助您识别这种文件格式类似于什么,甚至可以找到一个现成的解析器。您还可以找到这种格式的其他文件,并分析它们的创建者和解析方式。

如何使用可执行文件对数据格式进行逆向工程

如果您在 Google 上彻底搜索文件签名后仍未找到任何内容,则可能意味着您的文件格式确实很少见。在这种情况下,您可以使用可以解析此特定格式的可执行文件开始对您的专有文件格式进行逆向工程。但是如何找到这个可执行文件呢?

有两种选择:

方案一:通过目标文件的签名查找可执行文件。

扫描与您计划进行逆向工程的文件一起使用的整个程序目录,搜索二进制形式的签名。按文件内容启动搜索以查找与目标文件匹配的签名。查找目标文件以使用专用工具(如Effective File Search或Total Commander for Windows)或命令行工具(如分别在 Linux 和 macOS 上的grep或Binwalk)开头的字节。

如果找到匹配的签名,则将可执行文件加载到交互式反汇编程序 (IDA) 中,搜索检查文件签名的位置,然后开始逆向执行进一步解析数据的代码。

如果一个文件没有签名或者你在按文件内容搜索时没有找到任何东西,你可以在运行时分析这个文件。

选项 2:在运行时分析目标文件。

启动Process Monitor,为文件操作设置过滤器,并尝试捕捉专有文件打开的时刻。然后,查看进程监视器中的相关行以查找文件的 CreateFile 操作或第一个 ReadFile。查看此事件的堆栈,了解哪个可执行文件试图调用 ReadFile(),更重要的是,代码中的地址是什么。将您的文件上传到 IDA 并查看解析如何运行,就像签名搜索一样。

通常,用于解析的代码位于靠近阅读开始的地方。在这种情况下,查看所有 ReadFile 操作,查看读取了多少字节,并查看这些字节在文件中的位置。

但是,有些文件可以用更复杂的方式开发。例如,开发人员可以使用流类甚至自定义类来访问基于具有虚拟函数和多线程的类层次结构的文件,而不是使用简单的函数来读取文件。

在这种情况下,当您找到ReadFile函数时,您将找不到任何接近它的解析代码。您将看到的只是一个从某个虚函数调用的 ReadFile,读取的数据将存储在缓冲区中。

在这种情况下,您必须:

  1. 恢复阅读器的类

  2. 找到使用读取器从缓冲区接收数据的类

  3. 了解该类如何与读者同步

只有这样你才能找到解析文件中数据的类。

但是,有时您可能需要从既没有签名也没有可执行文件的文件中恢复数据。让我们探讨一下在这种情况下可以做什么。

如何在没有可执行文件的情况下对数据格式进行逆向工程

在我们开始探索如何从没有可执行文件的专有文件格式恢复数据的示例之前,让我们简要概述一下信息如何存储在文件中的一般逻辑。

了解所有文件都具有结构化数据这一点很重要。没有人以允许随机放置对象的方式创建文件格式。

每种文件格式都有一定的逻辑。而这个逻辑通常与文件的用途有关。例如,文件系统映像的文件必须具有特定的结构才能存储元数据,例如大小、名称和其他属性。图像文件必须能够存储有关图像大小、颜色数量和其他图像元数据的信息。

开发人员在他们创建的文件中组织信息存储的选项通常有限。逻辑的选择通常基于开发人员的知识和经验。没有必要使这样的任务过于复杂并尝试提出原创想法,尤其是在创建专有文件格式时。

现在让我们探讨如何使用真实示例对专有数据文件格式进行逆向工程。这里我们有一个封闭格式的随机固件文件。我们无法根据其签名在 Internet 上找到任何信息,并且它没有可以帮助我们识别格式的独特扩展名。

image.png

截图 1. 文件夹中的一个固件文件

显然数据在最大的文件中:swfl_00005684.bin.001_032_079。但我们也可以看到 swfl_00005684.xml.001_032_079 文件,这对于揭示如何从目标文件中解析数据很有用。

第一条规则是不要忽视元数据。

在这种情况下,我们会在要恢复的文件附近看到一个 XML 文件。打开 swfl_00005684.xml.001_032_079 文件后,我们会发现 BIN 文件部分的描述:

image.png

在此示例中,SOURCE-START-ADDRESS指向 BIN 文件中偏移的片段的开头。并且SOURCE-END-ADDRESS是这个片段的结尾。

从 swfl_00005684.bin.001_032_079 文件中提取数据片段后,如 XML 文件中所述,我们得到三个文件。其中一个是数字签名,另外两个是另一种具有 HAR#$%&@ 签名的专有格式。

我们发现这两个文件是存档。第一条线索是 Data Visualizer 向我们展示了这些文件在开头有一些文本,然后是高熵数据。

image.png

屏幕截图 2. 高熵数据在数据可视化工具中的外观

第二条线索是这个文件在十六进制编辑器中的样子:

image.png

屏幕截图 3. HAR 文件的开头在十六进制编辑器中的样子

它看起来像一个包含存档文件名称的表格。然而,挑战在于找到一种方法来解析这些数据,以便我们可以将 zlib 流与其元数据连接起来。

由于我们知道它是有关存档文件的信息,因此我们将此数据粘贴到记事本中以查看哪些数据正在更改,哪些没有。这是我们最终得到的:

image.png

屏幕截图 4. HAR 文件头中的数据在记事本中的外观

因此,存档中保存的文件元数据很可能包含创建/更新日期、属性以及压缩和解压缩文件的大小等信息。

关于存档中不同文件的创建/更新日期的信息会略有不同,因为文件元数据通常以 Unix 时间格式显示。这就是为什么我们可以看到这个数据大部分是重复的。

我们可以学习使用此文件的第二条规则是了解常见数据类型在十六进制编辑器中的外观。对于常见的数据类型,我们指的是 Unix Time、Dos Time、Float、Double 等。

很明显,如果元数据包含目录描述(而不是文件),则不会提及大小。

在目录之后,我们有一个条目,如下面的屏幕截图所示。由于它是一个文件描述符,因此该条目的大小字段中填充了值。

image.png

屏幕截图 5. 我们在目录后得到的条目

出于好奇,我们使用 Offzip 扫描工具来验证我们的猜测,结果如下:

image.png

截图 6. Offzip 工具扫描 HAR 文件后的结果

让我们看看 HAR 文件末尾偏移量 0x335 处的数据:

image.png

屏幕截图 7. HAR 文件末尾偏移量 0x335 处的数据

它是偏移量为 0x335 的 zlib 流,长度为 0x99 字节。

这些是我们已经在元数据中看到的相同数字。所以我们可以得出结论,这个HAR文件只包含/tmp/manifest/usr/share/swe/00005684/00f15000.manifest文件,其余都是目录。

因此,我们仅使用文件本身的数据提取了一个未知格式的文件,因为我们了解我们希望在那里找到的内容。

结论

了解如何对专有文件格式进行逆向工程可以帮助您确保您的软件适用于各种文件格式。

但逆向工程一个封闭的文件格式是具有挑战性的。它不仅需要逆向工程方面的专业技能,还需要对许多其他主题的深入了解。例如,必须注意存储在您需要进行逆向工程的文件附近的其他文件,并了解十六进制编辑器中不同数据类型的外观。

本文翻译自:https://www.apriorit.com/dev-blog/780-reverse-reverse-engineer-a-proprietary-file-format如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论

 
本站4hou.com,所使用的字体和图片文字等素材部分来源于原作者或互联网共享平台。如使用任何字体和图片文字有侵犯其版权所有方的,嘶吼将配合联系原作者核实,并做出删除处理。
©2024 北京嘶吼文化传媒有限公司 京ICP备16063439号-1 本站由 提供云计算服务