从 googlecode.com/p/firmware-mod-kit 自动导出
固件修改工具包
本工具包是一套脚本和工具,用于提取和重建基于 Linux 的固件映像。
警告:使用本工具包后你的设备将会变砖(也许不会,但最好还是说会)。变砖意味着设备实际上变成了一块无功能的“砖头”。有时无需硬件修改即可恢复。有时需要硬件修改(例如在 PCB 上焊接串行或 JTAG 接头)。有时根本不可行,或者总恢复成本超过设备本身价值。
如果你还没准备好让你的路由器变砖,请不要使用本工具包!
最终用户许可协议:下载或使用本工具包即表示你同意承担使用或滥用固件修改工具包的后果。这些后果包括设备变砖。本工具包的作者已正式警告你。本工具包仅供嵌入式系统软件工程师使用。
固件修改工具包允许轻松解构和重建各种嵌入式设备的固件映像。虽然它主要针对基于 Linux 的路由器,但应兼容大多数使用常见固件格式和文件系统(如 TRX/uImage 和 SquashFS/CramFS)的固件。
要使用固件修改工具包,你需要一个 Subversion 客户端、标准的 Linux 开发工具(gcc、make 等)、python-magic 模块以及 zlib 和 lzma 开发包。如果你运行的是使用 apt-get 的 Linux 发行版,例如 Ubuntu 或 Debian,请使用:
对于 Ubuntu 18.04 及更早版本:
sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic autoconf
对于 Ubuntu 20.04 及更新版本:
sudo apt-get install git build-essential zlib1g-dev liblzma-dev python3-magic autoconf python-is-python3
对于 RedHat:
yum groupinstall "Development Tools"
yum install git zlib1g-dev xz-devel python-magic zlib-devel util-linux
对于 Arch Linux:
有一个 AUR 包 https://aur.archlinux.org/packages/firmware-mod-kit/
对于其他发行版,你应该使用发行版的包管理器安装等效的包。
git clone https://github.com/rampageX/firmware-mod-kit.git
cd firmware-mod-kit/src
make
Binwalk 2.1.1
[回到 firmware-mod-kit 目录]
cd src/binwalk-2.1.1
sudo python2 setup.py install
固件修改工具包仅支持 Linux 平台。经过少量修改,它应该可以在其他 POSIX 平台上工作。
Git 克隆固件修改工具包仓库。
固件修改工具包包含一系列实用程序和 Shell 脚本。可以直接使用这些实用程序,也可以使用 Shell 脚本来自动化和组合常见的固件操作(例如提取和重建)。下面列出了用于固件操作的核心脚本。
主要脚本:
| 脚本 | 描述 |
|---|---|
| extract-firmware.sh | 固件提取脚本 |
| build-firmware.sh | 固件重建脚本 |
次要脚本:
| ddwrt-gui-extract.sh | 从已提取的 DD-WRT 固件中提取 Web GUI 文件。 |
|---|---|
| ddwrt-gui-rebuild.sh | 将修改后的 Web GUI 文件恢复到已提取的 DD-WRT 固件中。 |
固件修改工具包使用一个“硬编码”的工作目录 'fmk'。提取脚本将数据提取到此文件夹,重建脚本从此文件夹重建。某些操作支持使用其他工作目录,但不是全部。我们将来会扩展这一功能。目前,如果你有多个工作目录,建议重命名当前不操作的那些目录。
自动固件提取通常适用于大多数使用 uImage/TRX 固件头且采用 SquashFS 或 CramFS 文件系统的固件映像。目前,extract-firmware.sh 是首选的提取方法,因为它支持比旧版 old-extract.sh 脚本更多的固件类型。不过,old-extract.sh 仍被包含在内,并且适用于多种固件格式。
extract-firmware.sh 和 build-firmware.sh 的使用方法都很简单:
./extract-firmware.sh firmware.bin
默认情况下,extract-firmware.sh 的输出将位于 'fmk' 目录中,而 old-extract.sh 会将提取的数据放入指定工作目录。
使用哪个重建脚本取决于使用哪个提取脚本。如果你使用 extract-firmware.sh 提取了固件映像,那么必须使用 build-firmware.sh 来重建它。同样,如果使用了 old-extract.sh,那么重建映像时必须调用 old-build.sh:
./build-firmware.sh [-nopad] [-min]
build-firmware.sh 生成的新固件将位于 'fmk/new-firmware.bin',而 old-build.sh 会生成多种不同格式的固件映像并保存到指定的输出目录。
可选的 -nopad 开关将指示 build-firmware.sh 不要将固件填充到原始大小。
可选的 -min 开关将使用最大 1MB 的 squashfs 块大小。这会减小固件映像大小,但会消耗目标设备上更多的 CPU 和 RAM 资源。除非必要,否则不要使用此开关。对于嵌入式系统来说,这是一个非常大的块大小。重建时会保留原始固件的 squashfs 块大小,除非你确信自己知道在做什么,否则应使用原始块大小。块大小过大可能表面上运行正常,但固件的运行时性能可能会在所有或某些负载下受到影响。
固件修改工具包的一个非常独特的功能是能够提取和重建 DD-WRT Web GUI 中的文件。这通过 ddwrt-gui-extract.sh 和 ddwrt-gui-restore.sh 脚本自动完成。
使用 extract-firmwware.sh 提取 DD-WRT 固件映像后,你可以通过运行以下命令来提取 Web 文件:
./ddwrt-gui-extract.sh
这将在当前目录下创建一个名为 'www' 的目录,并将 Web 文件提取到其中。你可以按任意方式修改这些文件,但不能添加或删除文件。
编辑完成后,你可以通过运行以下命令重建 Web 文件:
./ddwrt-gui-rebuild.sh
有时你会热情地刷写第三方固件(如 Gargoyle 或 DD-WRT),却发现它缺少你需要的功能、性能不如原厂固件,或者存在功能问题。在这种情况下,你可能想回到原厂固件,但不知如何操作!
以下是固件修改工具包如何帮助你恢复到原厂固件的方法。过程如下:
一旦你回到原厂固件,它就能再次接受原厂固件映像。
以下示例演示如何提取固件映像,将其现有的 telnet 守护进程替换为自定义构建的版本,然后构建新的固件映像:
./extract-firmware.sh firmware.bin
cp new-telnetd fmk/rootfs/usr/sbin/telnetd
./build-firmware.sh
下面是一个示例,展示如何提取 DD-WRT 固件映像、修改 Web 索引页面并构建新的固件映像:
./extract-firmware.sh firmware.bin
./ddwrt-gui-extract.sh
echo "HELLO WORLD" > www/index.asp
./ddwrt-gui-rebuild.sh
./build-firmware.sh
Linksys 具有带校验和检查的自定义尾部,因此编写此脚本来尝试自动化计算映像校验和并相应修改尾部的过程。新映像将写入 modified_checksum.img。在修改和运行 build-firmware.sh 后运行此脚本。
./linksys_footer.sh modified_firmware.img
固件修改工具包包含一系列在处理嵌入式固件映像时有用的工具。这些工具包括下面列出的,但还有更多未在此列出。
| 工具 | 描述 |
|---|
| AsusTRX | ASUSTRX 的扩展版本,可以构建“标准”TRX 文件,也可以选择性地构建带有 ASUS addver 风格头部附加的 TRX 文件。它还可以独特地强制设置 TRX 中的段偏移(使用 -b 开关),以便与 Marvell ASUS 设备(如 WL-530g)兼容。此工具取代了“标准”trx 工具和 addver。当前包含的版本:0.90 beta。 |
| AddPattern | 用于在 TRX 前面添加 Linksys 风格 HDR0 头部的实用程序。 |
| AddVer | ASUS 实用程序,用于向 TRX 映像附加包含版本信息的头部。ASUSTRX 包含此功能。当前版本:无版本号。 |
| Binwalk | 扫描固件映像以识别已知文件类型(固件头部、压缩内核、文件系统等)。 |
| CramFSCK | CRAMFS 文件系统映像检查器和提取器。当前包含的版本:2.4x。 |
| CramFSSwap | 用于交换 CramFS 映像字节序的实用程序。 |
| CRCalc | 用于修补给定固件映像中所有 uImage 和 TRX 头部的实用程序。 |
| MkSquashFS | 构建 squashfs 文件系统映像。当前包含的版本:2.1-r2、3.0。 |
| MkCramFS | 构建 cramfs 文件系统映像。下一版本将添加。当前包含的版本:2.4x。 |
| MotorolaBin | 用于在 TRX 映像前添加 8 字节头部以用于 Motorola 设备 WR850G、WA840G、WE800G 的实用程序。当前版本:无版本号。 |
| Splitter3 | 用于扫描和提取固件映像组件部分的实用程序。 |
| Tpl-tool | 用于操作 TP-Link 供应商格式映像的实用程序。 |
| UnCramFS | 提取 cramfs 文件系统映像的替代工具。尽可能使用 cramfsck,因为它似乎更可靠。当前包含的版本:0.7(用于 cramfs v2.x)。 |
| UnCramFS-LZMA | 提取 LZMA 压缩的 cramfs 文件系统映像(例如 OpenRG 使用的)的替代工具。 |
| UnSquashFS | 提取 zlib squashfs 文件系统映像。当前包含的版本:用于 3.0 映像的 1.0 和用于 2.x 映像的 1.0(我自己的混合版本)。 |
| UnSquashFS-LZMA | 提取 lzma squashfs 文件系统映像。当前包含的版本:用于 3.0 映像的 1.0 和用于 2.x 映像的 1.0(我自己的混合版本)。注意:并非所有 squashfs-lzma 补丁都是相互兼容的。我正在努力增加对所有常见 squashfs-lzma 变体的支持。 |
| UnTRX | 将 TRX 风格固件拆分为其组件部分。还支持预先添加的 addpattern HDR0 风格头部。此工具是专门为此工具包开发的。当前包含的版本:0.45。 |
| WebDecomp | 从 DD-WRT 固件映像中提取和恢复 Web GUI 文件,允许修改网页。 |
| WRTVxImgTool | 用于为 WRT54G(S) v5 系列生成 VxWorks 兼容固件映像的实用程序。 |