在反转基于DD-WRT的路由器固件时,我遇到了“ webcomp”的提法。似乎它用于存储Web界面的内部HTML文件。究竟是什么,如何从固件映像中提取这些文件?

注意:这是一个自我提出的问题,可以添加到基于知识库的问题中。

评论

这种格式真的可行吗?看起来更像是属于wiki上描述webcomp而不是QA的内容。

@ 90h:然后在meta上鸣响;)

@ 90h对meta的投票是观点的表达。在任何现实世界中,都会有人与您达成一致,而有些人则不同意。您不应该以此来阻止您发表对该网站应如何运作的看法。

尽管这很有趣,但听起来对我来说并不是一个真正的“精确”问题,因此我也将答案/内容也复制到了新的webcomp标签Wiki中。
@ 90h虽然我喜欢您的热情,但我认为您一直在问这些问题的方式有些偏离。我对问题进行了一些编辑,使其更像一个真正的问题。

#1 楼

/*
 * webcomp -- Compile web pages into C source
 *
 * Copyright (c) GoAhead Software Inc., 1995-2000. All Rights Reserved.
 */


Webcomp说明

Webcomp或“ Web编译器”是GoAhead Software在1995-2000年期间编写的非常简单的工具。它将Web页面“编译”为单个二进制Blob,并将Blob中的文件索引添加到httpd以便在运行时使用。

Webcomp可在DD-WRT源代码中获得。显然,它是以“只是破解一下”的样式创建的,无需过多关注其外观。不过,它确实可以完成工作,这很重要。

DD-WRT使用此工具来“保护”其Web管理控制台。由于他们的Web管理控制台源自GPL的开放源代码,多年来有无数的贡献者,并且webcomp本身是开放源代码,因此我认为在记录他们使用的机制方面没有任何法律限制。
<数据类型
二进制Blob。
通常作为文件存储在/ etc / www,这是设备上所有网页的简单连接。它没有被压缩或混淆。也不应该。嵌入式Linux固件(如squashfs)使用的文件系统将压缩作为主要属性。因此,压缩此Blob将是多余的,并且会损害文件系统的最终压缩率。类似地,对块的混淆将实质上影响可压缩性。但是,webcomp源代码中有一个注释掉的部分,它将lzma应用于二进制blob。由于我给出的原因,没有证据表明它曾经被使用过。

索引数组。
添加到httpd的数组是通过在构建之前修改源代码来完成的。它添加了一个名为websRomPageIndex的对象,该对象包含有关级联二进制Blob中文件的此信息数组。

该数组由文件名和大小组成。较早版本的webcomp也包含偏移量,但由于二进制blob文件的排列顺序与索引数组中出现的顺序相同,因此这些偏移量是多余的。因此,在遍历数组时,每个文件的大小都会导致二进制blob中下一个文件的相对偏移。

克雷格·赫夫纳(Craig Heffner)的webdecomp可对Webcomp的Web包进行反编译和重新编译。格式化的代码比webcomp本身要好得多,因此我将使用其数据结构,并用自己的注释进行修改。

数组的每个成员都定义为:

/* OLD webcomp file_entry data type */
struct file_entry
{
    uint32_t name;   /* virtual offset of asciiz file name in httpd  */
    uint32_t offset; /* offset to file in blob (unnecessary) */
    uint32_t size;   /* size of file data in blob */
};


NEW格式

/* NEWER webcomp file_entry data type */
struct new_file_entry
{
    uint32_t name;  /* virtual offset of asciiz file name in httpd  */
    uint32_t size;  /* size of file data in blob */
};


通过DD-WRT进行的修改

DD -WRT多次入侵了webcomp代码。它们的修改不公开。实际上,DD-WRT源代码中仅包含使用原始file_entry数据类型的旧webcomp.c。他们可能负责切换到排除冗余偏移量的更有效的file_entry数据类型。他们通过在尺寸上添加常数来实现。在最新版本的DD-WRT中,该值似乎为0x4BF8。

因此,混淆非常简单:

new_file_entry.size += key;


动态计算密钥。由于我们可以假定包中文件的实际大小(很多年都没有改变,如果有的话),因此我们可以计算固件使用的密钥。这具有处理没有键(0)的较旧图像的额外好处。为此,我们找到已知大小的文件(索引0很好),然后:

key = new_file_entry.size - assumed_known_size;


要进行进一步的完整性检查,可以确认样本是否正确。实际上,已提取文件以匹配该文件的已知样本。一个简单的哈希比较就可以解决问题。

更新:请参阅devttys0的答案,该答案利用了所有文件的总和与实际blob大小的关系,然后除以文件数以获得平均差,这就是关键。

Webdecomp

由Craig Heffner创建,此工具可以提取和重建webcomp的程序包。具有讽刺意味的是,它是比webcomp工具优越的代码。我最近修改了webdecomp以处理这些新的DD-WRT密钥,在提取时计算密钥并将其保存以供以后重建。这是固件Mod Kit的一部分。

#2 楼

对90h的答案进行了小幅更新:密钥可以动态计算,而无需假设任何特定文件的大小。这是所有文件的实际大小。由于将相同的固定值添加到httpd中报告的所有文件大小中,因此您可以简单地将报告大小与实际大小之差除以文件数即可得出所使用的固定值:

key = (total_reported_size - actual_etc_www_size) / number_of_files


#3 楼

webdecomp工具不适用于最新版本的DD-WRT,但设法提取了固件。

root@ubuntu:~/Desktop/firmware-mod-kit/src/webcomp-tools$ ./webdecomp --httpd="/home/root/Desktop/firmware-mod-kit/fmk/rootfs/usr/sbin/httpd" -www="/home/root/Desktop/firmware-mod-kit/fmk/rootfs/etc/www" --dir="/home/root/Desktop/www" --extract
Failed to locate websRomPageIndex!
Failed to detect httpd settings!
Failed to process Web files!

root@ubuntu:~/Desktop/firmware-mod-kit/fmk/rootfs/usr/sbin$ file httpd 
httpd: ELF 32-bit LSB executable, MIPS, MIPS32 version 1, dynamically linked, interpreter /lib/ld-uClibc.so.0, corrupted section header size


看起来好像混淆了节标题。

root@ubuntu:~/Desktop/firmware-mod-kit/src/webcomp-tools$ readelf -a /home/root/Desktop/firmware-mod-kit/fmk/rootfs/usr/sbin/httpd
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 01 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       1
  Type:                              EXEC (Executable file)
  Machine:                           MIPS R3000
  Version:                           0x1
  Entry point address:               0x401a30
  Start of program headers:          52 (bytes into file)
  Start of section headers:          0 (bytes into file)
  Flags:                             0x54001005, noreorder, cpic, o32, mips16, mips32
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         7
  Size of section headers:           0 (bytes)
  Number of section headers:         0
  Section header string table index: 0

There are no sections in this file.

There are no sections to group in this file.


评论


这不是已发布问题的答案。随意发布新问题(先检查规则);您可以链接到此上下文。

–伊戈尔·斯科钦斯基♦
18/09/23在19:52