逆向工程 Devolo 固件

逆向工程 固件 米普
2021-06-21 09:02:46

我正在尝试对 Devolo dlan wifi 500 设备(MIPS 架构)进行一些逆向工程。我的目标是在那里放一些我修改过的固件。

这是我到目前为止的地方:

  1. http://update.devolo.com/linux2/apt/pool/main/d/devolo-firmware-dlan500-wifi/下载固件更新
  2. 从 debian 包中提取固件映像
  3. 使用 binwalk 分析图像
  4. 使用固件模块工具包提取的内容(存在于谷歌代码中)。
  5. 修改后的图像
  6. 用 fmk 重建
  7. 使用设备的网络界面上传新固件

它在第 7 步失败。我收到一条消息,内容类似于“此文件不包含有效数据”。因此,在安装更新之前,设备会执行某种验证。

所以我一直在调查。devolo 映像包含一个 devolo 页眉/页脚、一个 uboot 和一个 uimage。页眉/页脚必须包含某种校验和。我尝试选择有效(未修改)的更新并在填充上更改一位,将其上传到设备并收到相同的错误消息。

如果我知道校验和在哪里或如何获得,我可以在重建图像后更改它。但是我没有找到关于 devolo 格式的文档。为了找到总和,我比较了两个 devolo 图像的十六进制:wifi 和无线(无线图像在我下载 wifi 图像的同一个站点上;无法发布此链接和 fmk 链接,因为我有不到 10声誉 :( )。页眉/页脚在大多数领域都非常相似,尽管我发现没有 32 字节的字段是一个总和。也许在逆向工程方面更有经验的人可以帮助我。

我可以尝试蛮力求和。由于它是一个总和,我可以通过向填充区域添加位来创建碰撞。为此,我有两个想法:

  1. 通过网络发送所有可能的组合;
  2. 使用下载的图像库在本地测试总和;

选项 1 可能需要几年时间......

对于选项 2,我尝试使用 qemu 虚拟机并在那里编译,然后交叉编译,但没有结果,因为 devolo 库使用旧的 libc 版本(https://stackoverflow.com/questions/29153924/how-to- solve-c-conflicts- between-system-and-library-dependencies)。

我的最后一个想法是以某种方式在我的 amd64 机器上模拟下载的固件,在那里编译一些将使用 devolo 库的代码,从而规避依赖问题。

所以,我要感谢我之前步骤中的任何提示/错误,以及有关如何在我的电脑上运行下载的图像的任何指示。

1个回答

固件文件中的每个部分在其内容上都有一个 crc32。

看到这个

它应该使选项 1 更可行。

更多细节:在squashfs 图像中,有一大堆基于busybox 的工具和一些独立程序。有一个(/usr/sbin/chunk)看起来可能有关于固件文件遍历的逻辑。它包含许多与固件文件中的值相匹配的 32 位值,这些值看起来像 magic/fourcc 值。strings(1) 的输出也非常令人鼓舞。