提取压缩固件 (NRV) 进行分析

逆向工程 开箱
2021-06-23 08:41:22

我想分析一个嵌入式固件(汽车的 ecu)。我的问题是,文件被压缩了。

固件附带一个描述 xml 文件,该文件指出它被分成多个部分,并且这些部分使用 NRV 算法单独压缩。

我做了一些搜索,固件中没有任何常见的嫌疑人(魔法字符串)。

实际上通过 CAN 刷新固件的程序是用 Java 编写的,所以我尝试反编译它。那行得通,但只有函数的定义,没有流程,程序在运行,哪些值传递给函数等。

如果是通常的汇编代码,我只需将调试器附加到正在运行的程序并查看调用。但我不知道这在 Java 中是否可行。

所以我的问题是,我将如何开始解压固件?

我上传了固件和相应的 xml,也许有些可以推动我朝着正确的方向前进。

https://mega.nz/#!bctSTB5S!ZYKN48DgJYQnOU1yMkIEcpheoYFG0wgtTrZqNfxtwE4

有很多 NRV 压缩文件,适用于具有不同处理器和架构的各种 ecus。所以解压必须在刷入固件的计算机上进行。

1个回答

NRV 是一种压缩-解压缩器,由 Markus FXJ Oberhumer (www.oberhumer.com) 对尺寸和速度进行了高度优化。幸运的是,它有开源版本,可在他的网站http://www.oberhumer.com/opensource/ucl/#download下载它有多种口味,我一直在使用的一种叫做 UCL1.03。

使用这个软件和你的 xml 描述文件,我能够解压缩你的二进制文件。我是通过以下方式做到的:

  1. 从提供的源构建一个可执行文件(在我的下载中,没有二进制文件)。有一个适用于各种平台的 bat 文件,适用于 Windows 的文件称为 vc.bat。但是,它对我不起作用,大概是因为我的环境变量没有以正确的方式设置 bat 运行。因此我做了一个VStudio解决方案(VS2013,VS2015给出了一些错误),它产生了一个能够读取和解压文件的exe。这个 VS 项目包含以下文件(全部来自下载):
    • “src”目录中的所有 .c 文件
    • 文件 uclpack.c,位于“examples”目录中,包含“main”。
    • 必要的头文件,它们都在“include”或“examples”目录中。

在项目设置中确保正确设置了包含目录(与 VS 中一样)。

  1. 将正确的标头添加到您的二进制文件中。

标题由以下部分组成: 在此处输入图片说明

  • “魔法”前缀:见图
  • 标志:大部分不清楚,LSByte 控制 CRC-32 的生成(与 xml 文件中的不同)。
  • 解压方式:2B、2D、2E可用,只有2B适用于您的文件。
  • 级别:不清楚,但不得为零。
  • 块大小:解压缩器的内存。必须至少具有未压缩块的大小。
  • 未压缩大小:从您的 xml 文件中读取
  • 压缩大小:从您的 xml 文件中读取。

标头中的所有数字都是 Big-Endian(即 MSB 优先)。请注意,软件需要在每个压缩块后都有一个标头,因此最好将您的文件拆分为三个单独的文件。只有第一个是有意义的,其他两个只包含一个常数。通过逐步执行程序,可以很容易地找到标题的内容。在无错误的情况下,解压器返回 0。

为了您的比较,这里有一个字符串存在于解压文件中,文件偏移量为 0x6a56:

Incomming message not handled