游客发表
手里那台老路由器,器固官方固件已经三年没更新了。编辑器后台登录界面还是器固十年前的风格,功能少得可怜,编辑器连个像样的器固流量统计都没有。我盯着它看了一会儿,编辑器决定把固件提取出来,器固自己改改。编辑器
这事没想象中那么玄乎。器固路由器固件本质上就是编辑器一个打包好的文件系统镜像,里面装着Linux内核、器固驱动、编辑器Web界面、器固各种配置文件。编辑器厂商用工具把一堆东西塞进一个.bin或.trx文件里,器固刷进路由器的闪存。我们要做的,就是把它拆开。
Binwalk是第一个该装的。这东西能扫描固件文件,告诉你里面有哪些分区、文件系统、压缩格式。跑一遍binwalk firmware.bin,输出通常是一串偏移地址和类型标记。看到SquashFS或者JFFS2,那就是文件系统了。SquashFS是只读压缩文件系统,路由器上最常见,因为它省空间。
拆SquashFS需要unsquashfs,装好squashfs-tools就有。命令很简单:unsquashfs -d output_dir squashfs_partition.bin。跑完打开output_dir,整个路由器的根文件系统就摊在你面前了。etc、usr、www、bin,跟普通Linux系统长得差不多。
但事情往往没那么顺利。有些厂商会在文件系统外面套一层加密,或者用非标准的头部结构。我遇到过一台TP-Link,binwalk扫出来一堆乱码,最后发现固件头部有个自定义的校验块,得先手动跳过256字节才能识别出真正的文件系统。这种时候就得看十六进制,用xxd一点一点翻,找SquashFS的magic number——hsqs这四个字节。
拆开之后,最有意思的是/etc/config/目录。OpenWrt系的固件把网络配置、无线设置、DHCP都放在这里,纯文本,改起来毫无压力。想改默认WiFi密码?直接编辑wireless文件。想加个开机脚本?扔进/etc/init.d/,再做个软链接到rc.d目录。
Web界面在/www/下面。大部分是HTML和Lua脚本。有次我想给路由器加个实时网速显示,就在index页面里塞了一段JavaScript,调后端已有的/cgi-bin/接口。改完重新打包,刷进去,能用。那种感觉比刷第三方固件更有成就感——毕竟每一行代码都是自己写的。
重新打包用mksquashfs,指定好压缩算法和块大小。这里有个坑:块大小必须跟原固件一致,通常是64K或128K,否则刷进去可能启动不了。打包完还要把内核和文件系统重新拼成一个完整的固件镜像,这一步不同厂商差异很大,有的直接cat就行,有的需要专门的打包脚本。
说句实在话,刷自己改的固件比刷官方固件危险得多。官方固件至少经过测试,你改的东西可能让路由器直接变砖。我一般会先确认路由器有没有TFTP恢复模式或者串口,有的话还有救。没有的话,改之前最好用编程器把原闪存备份一遍。
还有校验和的问题。很多路由器启动时会检查固件头部的CRC或者MD5,对不上就拒绝启动。得找到校验算法,重新算一遍填回去。有次我忘了这步,路由器反复重启,指示灯闪得跟警灯似的,最后靠串口进uboot才救回来。
折腾路由器固件这件事,门槛不算高,但需要耐心。每次拆开一个固件,就像打开一个陌生人的抽屉,里面有什么全凭运气。有的厂商把注释都留在配置文件里,有的把整个开发环境路径都打包进去了——/home/zhangsan/project/...这种。看到这些的时候,你会觉得写固件的人也挺随意的。
改完的固件不一定比原版好用,但至少你知道里面每一处改动的来龙去脉。这种掌控感,是刷现成固件给不了的。
友情链接