记⼀次修改DiyBox的经历(openwrt固件解包与打包)
林语堂 生活的艺术
吐槽⼏句
erotica做技术的有⽆私造福⼈类的,也有耍流氓坑⼈的。说的不是DiyBox,⽽是“”。就是⼀家犯贱、祸害⼤学⽣、助纣为虐的流氓公司,其所谓的“防私接”技术让电信和移动牢牢的垄断着学校的宽带资源,还让学⽣花费了⼤量的冤枉钱。
当然,有狗熊的时代就会有英雄的存在。有 开源的Openwrt pppd plugin和 的 ,以及stawidy的 等等其他各路英雄的⽆私贡献。
⽽我就是⼀个乘着英雄带来的东风丰⾐⾜⾷的⼩⽩,⾝边很多朋友和同学苦于信利的流氓⾏为⽽选择了购买那些溢价⽐OV⼿机还要⾼
的“校园路由器”,这其中 DiyBox就是⼀家。我最看不惯的是有技术的⼈⽆私的开源、没点能⼒的⼈借着流氓的犯贱和⼩⽩的懵懂去攫取暴利。17年的五⽉开始,我们学校的移动宽带进⾏了升级,⽼版本的pppd 插件直接不能⽤了,这让很多同学的路由器成为了废品。⽽我在帮别⼈升级时,发现了 DiyBox的存在。
我修改的DiyBox固件是⽼版本的固件,看⽂件的⽇期还是15年11⽉的。界⾯是漂亮的Material主题,添推荐信 范文
加了“校园⽹认证”(jiaju)⼊⼝。总体给我的感觉是这个固件做的很不错:“校园⽹认证”将“时间”和“拨号”两界⾯合⼆为⼀,使⽤⽅便; 还添加了“硬件+授权码”的激活⽅式,很适合商⽤; 剔除“dropbear”和“telnetd”,有效防⽌了⽤户的乱操作。不⾜是使⽤了breeed,如果有⾃⼰的bootloader相必会更难破解。
解包与打包
有声读物免费下载mp3大学英语六级考试网初拿到这款路由器(DiyBox)我是很⽆奈的,虽然可以使⽤Breed直接刷机,可是这样⼦感觉浪费了DiyBox的⼀些“好设计”。我采取的⽅式是使⽤breed获取到整个路由器的编程器固件后,再使⽤ dd 将编程器固件的各分区分开,使⽤对应的⼯具解包获取原⽂件来研究和修改。
1. 获取编程器固件
2. 使⽤binwalk 获取固件的分区格式和偏移量 ,命令⼤致如下所⽰,
binwalk full.bin
看懂binwalk 的输出很有⽤,binwalk的输出每⼀⾏的前两列分别是⼗进制和⼗六进制的“偏移量”,LZMA compresd data ⼀般是内核,Squashfs filesystem 是rootfs,该分区只读JFFS2 filesystem 是保留路由器的⽤户配置的分区,清空该分区即意味着“恢复出⼚设置”……(还有⼀些别的,我也不好
举例了)
3. 使⽤dd将各部分分开
dd if=full.bin of=xx.bin bs=1 skip=xxx count=xxx
#if是原固件,of是输出⽂件,bs是单位长度,skip是偏移量,count是分区⼤⼩
1. 使⽤ unsquashfs 解包rootfs
unsquashfs rootfs.bin
lively是什么意思
2. 到⽬录 squashfs-root 下查看与分析固件
当然,使⽤ binwalk -e 能直接解包固件,使⽤ (传闻中的fmk) 也可以直接解包,当然后者集成了⼤量的⾃动化⼯具,很是⽅便。
另注: fmk在解包固件时建议使⽤ dd 将编程器固件分解成 “sysgraude 包” ,即只保留内核和rootfs的包,尤其是报 Unsupported file system 'jffs2'! 错误时。
打包过程是上述的逆向:
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("jiajut", "zgwl", "uidkey"))
………………
<% if uid_key == 0then %>
<form method="post"name="cert"onsubmit="writecode()"">
<div class="cbi-map">
<h2name="content"><%:Authorization Required%></h2>
<div class="cbi-map-descr">
<p class="error"><%:路由器的授权信息⽆效或需要升级,请输⼊新的授权信息。%></p>
………………
打开 /etc/config/jiajut 可以看到 zgwl 接⼝下的 uidkey 的值(因为此时是解包的rootfs,所以这个值是全新刷机后的“缺省值”)
是‘0’。所以可以断定,当这个uidkey是 0 时便视为“设备未授权”,直接将 sysauth.htm 中的 uid_key == 0 改为 uid_key == 100,解决。
DiyBox的授权认证过程
从⼊⼝开始分析,在访问路由器的web页⾯时,⾸先加载 sysauth.htm 中的lua代码,获取“uid”和“wl.uidkey”的值。其中 uid 的获取是通过以下代码:
local uid = ("echo `dmesg | grep 'flash id' | awk -F 'flash id: ' '{print $2}'`")
在输⼊了“授权信息”、按下提交按钮后,表单提交到 sysauth.htm ,它会获取输⼊的“授权信息”并将配sneaker是什么意思
置“wl.luidcode”设置为输⼊的“授权信息”,之后调⽤JS函数 writecode() , 此函数会打开固件中 /www/cgi-bin/uuid ⽂件,这个⽂件是⼀个shell脚本。
打开uuid脚本,可以看到此脚本除了向浏览器发送⼀堆的交互信息外,会调⽤到 /usr/share/uuid/uuidcheck ⽂件,并将
/usr/share/uuid/下的1 2 3 着三个⽂件作为参数传给 uuidcheck 这个程序。最后调⽤ uuidcheck 检查授权结果。
可见这个uuidcheck是⼀个校验的关键,以后找个时间再反编译以下它研究研究吧。
另外,这个固件的“系统⽇志”功能有所修改,还没研究透,待补充。