记一次修改DiyBox的经历(openwrt固件解包与打包)
2017-09-27 22:25
716 查看
吐槽几句
做技术的有无私造福人类的,也有耍流氓坑人的。说的不是DiyBox,而是“信利”。信利就是一家犯贱、祸害大学生、助纣为虐的流氓公司,其所谓的“防私接”技术让电信和移动牢牢的垄断着学校的宽带资源,还让学生花费了大量的冤枉钱。当然,有狗熊的时代就会有英雄的存在。有miao1007 开源的Openwrt pppd plugin和 sunflyer 的simple netkeeper ,以及stawidy的抓号脚本 等等其他各路英雄的无私贡献。
而我就是一个乘着英雄带来的东风丰衣足食的小白,身边很多朋友和同学苦于信利的流氓行为而选择了购买那些溢价比OV手机还要高的“校园路由器”,这其中 DiyBox就是一家。我最看不惯的是有技术的人无私的开源、没点能力的人借着流氓的犯贱和小白的懵懂去攫取暴利。17年的五月开始,我们学校的移动宽带进行了升级,老版本的pppd 插件直接不能用了,这让很多同学的路由器成为了废品。而我在帮别人升级时,发现了 DiyBox的存在。
我修改的DiyBox固件是老版本的固件,看文件的日期还是15年11月的。界面是漂亮的Material主题,添加了“校园网认证”(jiaju)入口。总体给我的感觉是这个固件做的很不错:“校园网认证”将“时间”和“拨号”两界面合二为一,使用方便; 还添加了“硬件+授权码”的激活方式,很适合商用; 剔除“dropbear”和“telnetd”,有效防止了用户的乱操作。不足是使用了breeed,如果有自己的bootloader相必会更难破解。
解包与打包
初拿到这款路由器(DiyBox)我是很无奈的,虽然可以使用Breed直接刷机,可是这样子感觉浪费了DiyBox的一些“好设计”。我采取的方式是使用breed获取到整个路由器的编程器固件后,再使用dd将编程器固件的各分区分开,使用对应的工具解包获取原文件来研究和修改。
获取编程器固件
使用
binwalk获取固件的分区格式和偏移量 ,命令大致如下所示,
binwalk full.bin
看懂binwalk 的输出很有用,binwalk的输出每一行的前两列分别是十进制和十六进制的“偏移量”,
LZMA compressed data一般是内核,
Squashfs filesystem是rootfs,该分区只读
JFFS2 filesystem是保留路由器的用户配置的分区,清空该分区即意味着“恢复出厂设置”……(还有一些别的,我也不好举例了)
使用dd将各部分分开
dd if=full.bin of=xx.bin bs=1 skip=xxx count=xxx #if是原固件,of是输出文件,bs是单位长度,skip是偏移量,count是分区大小
使用
unsquashfs解包rootfs
unsquashfs rootfs.bin
到目录 squashfs-root 下查看与分析固件
当然,使用
binwalk -e能直接解包固件,使用 firmware-mod-kit(传闻中的fmk) 也可以直接解包,当然后者集成了大量的自动化工具,很是方便。
另注: fmk在解包固件时建议使用
dd将编程器固件分解成 “sysgraude 包” ,即只保留内核和rootfs的包,尤其是报
Unsupported file system 'jffs2'! Quitting...错误时。
打包过程是上述的逆向:
1. 使用
mksquashfs打包rootfs
mksquashfs squashfs-root rootfs.squashfs -comp xz #squashfs-root指定目录,rootfs.squashfs指定输出文件,-comp xz 说明压缩方式为 xz ,视binwalk的输出而定。
2. 使用
lzma压缩内核
lzma -k ./head #内核部分一般不解压,lzma压缩时目录名视情况而定
3. 使用
cat拼接各部分
cat head.lzma rootfs.squashfs > sysgradue.bin
小注: 使用fmk解压后在 image_parts 目录下的header.img即是原固件的内核,rootfs.img既为原固件中的rootfs,可以直接使用。
以上是解包和打包固件的步骤,下面是改造DiyBox。
修改DiyBox的认证
DiyBox在“未授权”情况下弹出的“认证页面”不是标准的openwrt认证页而是“DiyBox授权页”。但是它们的框架是一致的,所以定位到luci框架的认证页面模板: /usr/lib/lua/luci/view/sysauth.htm ,打开这个文件可以找到以下代码:local uid_key = tonumber(uci:get("jiajuset", "zgwl", "uidkey")) ……………… <% if uid_key == 0 then %> <form method="post" name="cert" onsubmit="writecode()""> <div class="cbi-map"> <h2 name="content"><%:Authorization Required%></h2> <div class="cbi-map-descr"> <p class="error"><%:路由器的授权信息无效或需要升级,请输入新的授权信息。%></p> ………………
打开 /etc/config/jiajuset 可以看到 zgwl 接口下的 uidkey 的值(因为此时是解包的rootfs,所以这个值是全新刷机后的“缺省值”) 是‘0’。所以可以断定,当这个uidkey是 0 时便视为“设备未授权”,直接将 sysauth.htm 中的
uid_key == 0改为
uid_key == 100,解决。
DiyBox的授权认证过程
从入口开始分析,在访问路由器的web页面时,首先加载 sysauth.htm 中的lua代码,获取“uid”和“jiajuset.zgwl.uidkey”的值。其中 uid 的获取是通过以下代码:local uid = luci.sys.exec("echo `dmesg | grep 'flash id' | awk -F 'flash id: ' '{print $2}'`")
在输入了“授权信息”、按下提交按钮后,表单提交到 sysauth.htm ,它会获取输入的“授权信息”并将配置“jiajuset.zgwl.luidcode”设置为输入的“授权信息”,之后调用JS函数 writecode() , 此函数会打开固件中 /www/cgi-bin/uuid 文件,这个文件是一个shell脚本。
打开uuid脚本,可以看到此脚本除了向浏览器发送一堆的交互信息外,会调用到 /usr/share/uuid/uuidcheck 文件,并将 /usr/share/uuid/下的1 2 3 着三个文件作为参数传给 uuidcheck 这个程序。最后调用 uuidcheck 检查授权结果。
可见这个uuidcheck是一个校验的关键,以后找个时间再反编译以下它研究研究吧。
另外,这个固件的“系统日志”功能有所修改,还没研究透,待补充。
相关文章推荐
- 搞定openwrt固件的解包打包
- 一次优化webpack打包的经历
- 【Eclipse】一次Eclipse插件修改经历
- APK应用程序的解包、修改、编辑、汉化、打包及应用
- 【android】APK文件解包修改重打包签名操作详解
- OpenWRT的ROM固件内置软件包修改与定制
- APK应用程序的解包、修改、编辑、打包及应用(一)
- 记录一次http切换成https,并修改域名过程的坑自己的经历
- 解包system.img, cache.img,修改并重新打包
- [工具] 小白如何修改解包打包system.img
- 针对Mtk平台 Android 打包解包*.img ,修改system.img 参数
- APK应用程序的解包、修改、编辑、打包及应用(二)
- 【ROM制作工具】华为UPDATE.APP固件一键解包打包教程
- Ubuntu下修改system.img 解包system.img、打包system.img
- APK应用程序的解包、修改、编辑、打包及应用(三)
- 【第一讲】APK应用程序的解包、修改、编辑、打包及应用(转)
- 简单的APK解包、修改、打包范例
- 将应用程序打包进openwrt固件,随着系统自启动
- apktool工具在centos环境中-解包 修改 打包 签名
- [教程] iOS设备上修改deb解包打包 教程