我想分析嵌入式固件(汽车的ECU)。我的问题是文件已被压缩。

固件随附一个描述xml文件,该文件说明该文件分为多个部分,并且使用NRV算法分别压缩了这些部分。 >
我进行了一些搜索,但固件中没有常见的可疑字符(魔术字符串)。反编译。那行得通,但是只有函数定义,没有流程,程序正在运行,将值传递给函数,等等。只需将调试器附加到正在运行的程序并查看调用即可。但是我不知道这在Java中是否可行。

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

我同时上传了固件和相应的xml,

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

有很多NRV压缩文件,例如具有不同处理器和体系结构的各种电子书。因此,解压缩必须在刷新固件的计算机上进行。

评论

Josh,您能分享UCL的编译版本吗,我在与编译斗争而未获成功:(

#1 楼

NRV是由Markus F.X.J. Oberhumer(www.oberhumer.com)。幸运的是,它具有开放源代码版本,可以从他的网站http://www.oberhumer.com/opensource/ucl/#download下载。它有多种形式,我一直在使用的一种叫做UCL1.03。使用此软件和您的xml描述文件,我能够解压缩您的二进制文件。我是通过以下方式完成的:


从提供的源构建可执行文件(在我的下载中,没有二进制文件)。有一个用于各种平台的bat文件,用于Windows的文件称为vc.bat。但是,它对我不起作用,大概是因为我的环境变量未按蝙蝠运行的正确方式设置。因此,我制作了一个VStudio解决方案(VS2013,VS2015出现了一些错误),该解决方案产生了一个能够读取和解压缩文件的exe文件。

“ src”目录中的所有.c文件
文件uclpack.c,位于“示例”目录中,并包含“主”。
必要的标头文件,它们都在“ include”目录或“ examples”目录中。



在“项目设置”中,请确保正确设置了include目录(通常)在VS中)。


将正确的标头添加到二进制文件。

标头包含以下部分:



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

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

为了进行比较,这是解压缩文件中存在的字符串,文件偏移为0x6a56:

Incomming message not handled


评论


很高兴它对你有效!我没有使用-F参数,但是在调试器中使用了它,并在第一个文件之后停止。也许就是这个原因。顺便问一句,以前从未听说过NRV!

–乔什
18年5月28日在20:14

您怎么知道NRV仍然是Oberhumer的UPX / UCL的一部分?您是如何从源头中提出标题的?

–PhreakShow
18年5月28日在21:32



一点都不神奇:问题1:Oberhumer在他的网站oberhumer.com/opensource/ucl上写了它:“ UCL是对某些NRV压缩算法的OpenSource重新实现。” Q2:没有任何标头,在调试器中运行会导致程序尝试读取标头并退出并出现错误。分析源代码后,您将以避免该错误的方式插入标头。您以这种方式进行迭代,直到满足所有“标题”错误为止。直截了当。

–乔什
18年5月28日在21:54