[原创]路由器另类玩法之提取根文件系统映像并解包
之前发了篇文章关于拿路由器shell的:http://bbs.pediy.com/showthread.php?p=1336958
忘了介绍下我的路由器了,我路由器是WO-GWH-11(W).好像是星网 AR800-hn的联通版.
不过对于我这种人来说,这些还不够玩,不研究到底怎能罢休
于是乎想研究一下路由器的系统和固件(不知道是不是一个东西
),
一直以来都很想自己diy路由器固件,不过也一直没机会,加上我这路由器是办宽带送的(算是定制路由器?).
固件也就在网上压根看不到.所以想把路由器固件导出来look look.能自己修改就最好了.
网上查了一大堆资料,再次感谢谷歌~~~
看到一些资料,关于备份路由器固件的.
http://www.v2ex.com/t/131986
首先需要知道固件在哪个设备,命令行里输入:
# cat /proc/mtd dev: size erasesize name mtd0: 0053c000 00000000 "BCM63XX RootFS" #
看到这里我就无语了,为什么别人的mtd里那么多东西,而我的就一行,送的也不能这么寒酸吧
.不过基本能看出来,这玩意应该是根文件系统.
于是准备转储出来:
# dd if=/dev/mtd0 of=/mnt/usb1_1/rootfs.bin dd: not found #
连基本的linux命令都没有.想起来之前在/bin看到了busybox.这回有救了~~# busybox
BusyBox v1.00 (2011.06.20-01:20+0000) multi-call binary
Usage: busybox [function] [arguments]...
or: [function] [arguments]...
BusyBox is a multi-call binary that combines many common Unix
utilities into a single executable. Most people will create a
link to busybox for each function they wish to use, and BusyBox
will act like whatever it was invoked as.
Currently defined functions:
[, busybox, cat, chmod, cp, date, deluser, df, dmesg, echo, expr,
false, ftpget, ifconfig, init, insmod, kill, killall, klogd, linuxrc,
ln, logger, logread, ls, lsmod, mkdir, mknod, mount, msh, ping,
ping6, ps, pwd, reboot, rm, rmdir, rmmod, route, sendarp, sh,
sleep, smuxctl, sync, syslogd, test, tftp, tftpd, top, true, tty,
umount, vconfig
# 
还真是送的...还好我这路由器支持U盘,而且之前测试过,U盘的里文件可以执行~~
然后去busybox官网上下了个预构建的busybox-mips.(我可没工夫配置交叉编译器)
copy到U盘里,插进路由器执行:
# /mnt/usb1_1/busybox-mips dd if=/dev/mtd0 of=/mnt/usb1_1/rootfs 10720+0 records in 10720+0 records out 5488640 bytes (5.2MB) copied, 2.524430 seconds, 2.1MB/s #
总算把根文件系统转储出来了.现在的问题就是怎么解包了~
把U盘插回PC,用UE看了下刚转储出来的文件.映入眼帘的就是四个小写字母"qshs",猜测这是个Magics Word.类似于PE文件的"MZ".
于是google: rootfs qshs
https://huaweihg612hacking.wordpress.com/2011/07/05/hexdumping-the-firmware/
发现是一种名为squashfs的文件系统映像,继续google之,找到了解包打包这种映像的工具:
http://sourceforge.net/projects/squashfs/files/
下载下来后发现好像不支持msvc构建,于是vm跑起ubuntu,将源码拖进去之后make.
make时,提示缺少zlib.h,又去zlib官网下载了最新的版本并make install.
再接着make就成功了,然后终端里执行:unsquashfs ./rootfs
结果提示好像是无效的格式,百思不得解.继续google~
就发现了好东西:
http://sourceforge.net/p/squashfs/patches/20/
原来需要patch源码,手工patch后,编译~
接着执行:unsquashfs ./rootfs
又提示什么不支持LZMA...然后又google.
原来要支持LZMA需要下载LZMA SDK,并修改makefile里的编译参数.
全部弄完后,终于解包成功了!!



最后附上我路由器固件(因为有些文件是字符或块设备,所以打包不进压缩文件中):
http://CserSoft.opendrive.com/files/NV81NDIyNTY5MF9yOGduMl83YjQ5/squashfs-root.tar.gz
和我修改过的squashfs4.3(src和bin):
squashfs4.3-patched.7z
本来是.tar.gz,结果论坛不支持上传gz
