在不重新编译的前提下修改openwrt固件

原帖地址:http://www.minipwner.com/index.p ... t-squashfs-bin-file
有时候我们需要简单定制自己需要的固件,又嫌从头编译太麻烦,怎么办?其实我们可以直接把openwrt固件里的文件解压出来,修改其中文件后重新打包。将需要的软件集成到固件中可以通过压缩节省flash空间,也免去了重置路由器后重装软件的麻烦
需要的软件:linux系统,openwrt-sdk(根据你的cpu架构在http://downloads.openwrt.org下载,比如hg255d对应的sdk是http://downloads.openwrt.org/att ... bc-0.9.33.2.tar.bz2),十六进制编辑器(wxhexeditor,ultraedit等等。vim应该也可以,不过我不会。我就以ultraedit为例)
过程:openwrt的bin固件由三部分组成:第一部分是内核,第二部分是squashfs镜像(也就是我们需要修改的部分),第三部分是填充部分(里面的内容是重复的00和ff)
第一步:获取openwrt固件。假设固件名称为703.bin。

第二步:用十六进制编辑器打开固件,你需要找到squashfs镜像部分(以hsqs开头)的开始位置和填充部分(以ffffff...开头)的开始位置。我以ultraedit例。
搜索ascii字符:hsqs,记下 第二部分开始位置.图中我找到的是917504.

搜索十六进制值FFFFFFFF,找到一大片FFFFFF的开头部分,记下第三部分开始位置,图中我找到的是12279968

定位到文件末尾,记下 整个文件尺寸,图中为12517376

第三步:做一些计算:
第一部分尺寸 = 第二部分开始位置
第二部分尺寸 = 第三部分开始位置 - 第二部分开始位置
第三部分尺寸 = 整个文件尺寸 - 第三部分开始位置

第四步:使用dd命令分割文件

dd if=703.bin of=firstchunk.bin bs=1 ibs=1 count=第一部分尺寸
dd if=703.bin of=secondchunk.bin bs=1 ibs=1 count=第二部分尺寸 skip=第一部分尺寸
dd if=703.bin of=thirdchunk.bin bs=1 ibs=1 count=第三部分尺寸 skip=第三部分开始位置

打开secondchunk.bin,确保文件开头是hsqs,否则是解压不了的

第五步:解压secondtrunk.bin

unsquashfs secondchunk.bin

当前文件夹下会生成squashfs-root文件夹,现在你可以开始修改文件夹里的内容了

第六步:重新打包squashfs-root

解压openwrt-sdk,假设openwrt-sdk解压在/home/ling/OpenWrt-SDK-ramips-for-linux
运行打包命令打包squashfs-root
/home/ling/OpenWrt-SDK-ramips-for-linux/staging_dir/host/bin/mksquashfs4  ./squashfs-root ./newsecondchunk.bin -nopad -noappend -root-owned -comp xz -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 -b 256k -processors 1

就可以生成newsecondchunk.bin

第七步:合并firstchunk.bin,newsecondchunk.bin,thirdchunk.bin

新生成的newsecondchunk.bin可能会比secondchunk.bin稍大,可以使用dd命令将newsecondchunk.bin直接和703.bin合并,第三部分填充的fffffff...会被覆盖一部分,但是没有影响,最后生成的固件和原来一样大

dd if=703.bin of=new_703.bin bs=1 count=第二部分开始位置
dd if=newsecondchunk.bin of=new_703.bin bs=1 count=newsecondchunk.bin的尺寸 seek=第二部分开始位置
dd if=703.bin of=new_703.bin skip=new_703.bin的尺寸 seek=new_703.bin的尺寸 bs=1 ibs=1

也可以用cat简单粗暴地合并
cat firstchunk.bin newsecondchunk.bin thirdchunk.bin > new_703.bin

关于thirdchunk.bin:这个文件的内容是ffffffffff....DEADC0DE00000000..... ,我把重复的ffff和0000删掉一大半再合并也没什么事,所以这部分是干什么的我也不知道

最后用tftp什么的刷进路由器,完事!

本文章由作者:佐须之男 整理编辑,原文地址: 在不重新编译的前提下修改openwrt固件
本站的文章和资源来自互联网或者站长的原创,按照 CC BY -NC -SA 3.0 CN协议发布和共享,转载或引用本站文章应遵循相同协议。如果有侵犯版权的资 源请尽快联系站长,我们会在24h内删除有争议的资源。欢迎大家多多交流,期待共同学习进步。

相关推荐