记一次修改DiyBox的经历(openwrt固件解包与打包)

2023-10-26

吐槽几句

做技术的有无私造福人类的,也有耍流氓坑人的。说的不是DiyBox,而是“信利信利就是一家犯贱、祸害大学生、助纣为虐的流氓公司,其所谓的“防私接”技术让电信和移动牢牢的垄断着学校的宽带资源,还让学生花费了大量的冤枉钱。

当然,有狗熊的时代就会有英雄的存在。有miao1007 开源的Openwrt pppd plugin和 sunflyersimple netkeeper ,以及stawidy的抓号脚本 等等其他各路英雄的无私贡献。
而我就是一个乘着英雄带来的东风丰衣足食的小白,身边很多朋友和同学苦于信利的流氓行为而选择了购买那些溢价比OV手机还要高的“校园路由器”,这其中 DiyBox就是一家。我最看不惯的是有技术的人无私的开源、没点能力的人借着流氓的犯贱和小白的懵懂去攫取暴利。17年的五月开始,我们学校的移动宽带进行了升级,老版本的pppd 插件直接不能用了,这让很多同学的路由器成为了废品。而我在帮别人升级时,发现了 DiyBox的存在。


我修改的DiyBox固件是老版本的固件,看文件的日期还是15年11月的。界面是漂亮的Material主题,添加了“校园网认证”(jiaju)入口。总体给我的感觉是这个固件做的很不错:“校园网认证”将“时间”和“拨号”两界面合二为一,使用方便; 还添加了“硬件+授权码”的激活方式,很适合商用; 剔除“dropbear”和“telnetd”,有效防止了用户的乱操作。不足是使用了breeed,如果有自己的bootloader相必会更难破解。


解包与打包

初拿到这款路由器(DiyBox)我是很无奈的,虽然可以使用Breed直接刷机,可是这样子感觉浪费了DiyBox的一些“好设计”。我采取的方式是使用breed获取到整个路由器的编程器固件后,再使用 dd 将编程器固件的各分区分开,使用对应的工具解包获取原文件来研究和修改。

  1. 获取编程器固件
  2. 使用binwalk 获取固件的分区格式和偏移量 ,命令大致如下所示,
    binwalk full.bin
    看懂binwalk 的输出很有用,binwalk的输出每一行的前两列分别是十进制和十六进制的“偏移量”,LZMA compressed 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
    2. 到目录 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是一个校验的关键,以后找个时间再反编译以下它研究研究吧。


另外,这个固件的“系统日志”功能有所修改,还没研究透,待补充。
  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

记一次修改DiyBox的经历(openwrt固件解包与打包) 的相关文章

  • 【LEDE】树莓派上玩LEDE终极指南-75-获取CPU温度

    先来说说获取CPU温度的方法 1 通过hwmon获取 2 通过thermal获取 而树莓派就比较蛋疼了 没有额外的传感器 所以sensor detect这些东西完全不起作用 唯独CPU封装内的VideoCore具有温度传感功能 而想要与Vi
  • 第一次 openwrt源码下载编译

    openwrt 学习记录 第一次 openwrt源码下载编译 MT7620开发板 安装虚拟机VMware 安装Ubnutu 先进入root账户 topeet ubuntu su 输入密码 1 搭建编译环境 参考 https blog csd
  • Python入门教程完整版,Python所有方向学习体系,学完即可就业

    今天给大家带来了干货 Python入门教程完整版 完整版啊 完整版 言归正传 小编该给大家介绍一下这套教程了 希望每个小伙伴都沉迷学习 无法自拔 本套教程学习时间15天 1 3天内容 为Linux基础命令 4 13天内容 为Python基础
  • IP数据包格式各字段详解说明

    1 版本 指IP协议的版本 为0100或0110 即IPv4和IPv6两种版本 通信双方使用的IP协议版本必须一致 2 首部长度 占 4 位 可表示的最大十进制数值是15 请注意 这个字段所表示数的单位是32位字 即0001表示1个32位字
  • 无线路由、AP、网桥之区别详解篇

    通过无线上网冲浪 现在已经不是新鲜的事情 随着近一两年无线 网络的飞速发展 从企业到家庭都开始在不同的领域体验着 自由上网 的乐趣 笔者接触无线网络也有一段时间了 经常在一些无线论坛逛游 无论是在现实生活还是在论坛中 总会有朋友不断的问这样
  • 在openwrt使用C语言增加ubus接口(包含C uci操作)

    在openwrt使用C语言增加ubus接口 包含C uci操作 文章目录 在openwrt使用C语言增加ubus接口 包含C uci操作 创建自己的软件包 软件包结构 编写代码和启动脚本 重点 案例大致分析 实现过程 ubus demo i
  • linux下安装awk

    sudo apt get install gawk 注意名称
  • OpenWrt的SR9000有线网卡驱动

    SR9000芯片的有线网卡驱动可以直接使用kmod usb net CDC ether 若为编译 可采取如下措施 make menuconfig kernel module usb support kmod usb net CDC ethe
  • QT调试详细操作步骤及案例分析

    目录 QT调试详细操作步骤及案例分析 QT调试详细步骤 1 手动调试 1 1 输入备调试的代码 1 2 设置断点 1 3 单步调试简单介绍 1 4 调试案例 1 4 1 纯C 代码的调试 1 4 2 QT程序的调试 2 使用QDebug进行
  • 图像检索传统算法学习笔记

    图像检索领域传统算法学习笔记 与组内同学一起找到的一些图像检索传统算法 作一小结 以防忘记 性能统计 传统图像检索算法 CIFAR 10数据集mAP值 编码数不同 LSH局部敏感哈希 0 116 0 131 SH谱哈希 0 124 0 12
  • Git-第一章:Git概述

    第一章 Git概述 Git 是一个免费的 开源的分布式版本控制系统 可以快速高效地处理从小型到大型的各种 项目 Git 易于学习 占地面积小 性能极快 它具有廉价的本地库 方便的暂存区域和多个工作流分支等特性 其性能优于 Subversio
  • openwrt恢复出厂设置有两种方法

    1 输入以下指令 firstboot mtd r erase rootfs data 2 输入以下指令 mount root firstboot reboot f
  • python入门指南

    python入门指南 python是一门简单易学且功能强大的编程语言 它拥有高效的高级数据结构 并且能够简单而又高效的方式进行面向对象编程 python是一门解释性语言 因为无需编译和链接 在开发中节省时间 使用python解释器 调用py
  • 交换机与路由器工作原理

    前言 这篇博客的主要目的是为了聊一下路由器和交换机 以及它们各自的工作原理和对应的两张表 交换机 1 简单介绍交换机 这里的交换机主要讲的是 二层交换机 它工作在OSI七层模型中的第二层 也就是数据链路层 因此就不得不说一下数据链路层的功能
  • 不在傻傻for循环!完美解决JPA批量插入问题

    前言 jpa在简单的增删改查方面确实帮助我们节省了大部分时间 但是面对复杂的情况就显得心有余而力不足了 最近遇到一个批量插入的情况 jpa虽然提供了saveAll方法 但是底层还是for循环save 如果遇到大量数据插入频繁与数据库交互必然
  • make menuconfig报错:Build dependency: Please install Git (git-core) >= 1.6.5

    版本号为chaos calmer 15 05 1 注意 在执行make menuconfig的时候 会报一个错误 如下 Build dependency Please install Git git core gt 1 6 5 这是open
  • jshn - 如何解析 json 包

    我想知道如何在openwrt上轻松解析json 我有 jhsn 来解析 json 这是我的程序 sh 脚本 download weather wget api openweathermap org data 2 5 weather id 2
  • Linux shell编程学习笔记32:declare 命令

    0 前言 在 Linux shell编程学习笔记16 bash中的关联数组 https blog csdn net Purpleendurer article details 134053506 spm 1001 2014 3001 550
  • 一文图解 Transformer,小白也看得懂(完整版)

    原作者 Jay Alammar 原链接 https jalammar github io illustrated transformer 1 导语 谷歌推出的 BERT 模型在11项NLP任务中夺得SOTA结果 引爆了整个NLP界 而BER
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time

随机推荐

  • MySQL触发器

    MySQL触发器是用于在数据表上自动执行SQL代码的对象 触发器会在指定的数据库事件发生之前或之后触发 这些事件包括 INSERT 向表中插入数据之前或之后 UPDATE 更新表中的数据之前或之后 DELETE 从表中删除数据之前或之后 触
  • SpringBoot中logback不同环境日志配置

  • 高阶数据结构之LRU Cache

    文章目录 什么是LRU Cache LRU Cache的实现 JDK中自带的数据结构 模拟实现LRU Cache 双向链表 哈希表 什么是LRU Cache LRU的全称是 Least Recently Used 的缩写 表示最近最少的使用
  • 固态硬盘编译android源码,Mac 下的 Android 8.1源码编译(LineageOS 15.1 for XiaoMi Mix2)

    编译环境 OSX 10 12 Xcode 8 3 3 JDK 8 Android SDK 需要用到的软件 作者编译时遇到需要安装的目前就这些 不排除有用到之前自己装过的 Sed MacPorts Homebrew Imagemagick G
  • STM32以JSON格式发布HTTP请求

    在本文中 我们将学习如何将SIM800或SIM900与STM32微控制器一起使用 以及如何将JSON格式的HTTP发布请求发送到任何API服务器 介绍 除了Wifi模块或以太网模块 IoT项目也可以通过SIM800 900 GSM GPRS
  • zookeeper实现leader选举的一种方法

    写这篇文章之前 我需要解释下为什么需要实现leader选举 我们在软件系统构建过程中 总会有一个场景 就是如何保证系统高可用 保证高可用有一个简单方式就是多加几个副本 也就是部署多个节点 构成一个集群 一台机器挂掉 业务由另一台接管 在一个
  • Linux下hydra的使用

    Syntax hydra l LOGIN L FILE p PASS P FILE C FILE e nsr o FILE t TASKS M FILE T TASKS w TIME W TIME f s PORT Parameter R
  • java+date+定义+赋值,Java Script基础(五) 内置对象Date

    在JavaScript中 系统的内置对象有Date对象 Array对象 String对象和Math对象等 1 Date 用于操作日期和时间 2 Array 用于在单独的变量名中存储一系列的值 3 String 用于支持对字符串的处理 4 M
  • VS Code for Mac Hello World

    VS Code for Mac Hello World VS Code 控制台应用 打开VSCode gt Open gt 选择已经创建好的空文件夹Hello World Terminal gt New Terminal 打开控制台 dot
  • 算法之线性排序

    目录 前言 桶排序 计数排序 基数排序 问题 总结 参考资料 前言 桶排序 计数排序 基数排序这些排序算法的时间复杂度是线性的 所以我们把这类排序算法叫作线性排序 Linear sort 之所以能做到线性的时间复杂度 主要原因是 这三个算法
  • Qt 5 架构和特点

    Qt 5 模块构架 模块 功能 Qt Core Qt 5 的核心类库 每个模块都建立在Core上 Qt GUI 图形用户界面开发的最基础的类库 Qt Widgets 提供c 用户界面部件 是对Qt GUI的拓展 Qt SQL 对数据库进行操
  • ios开发入门

    开发一个应用程序看起来复杂 实际上我们可以分为以下几个方面来看 设计用户界面 定义交互 实现行为 整合数据 我们这里需要先提一种典型的软件设计典范 也就是我们常说的MVC模式 业务模型 Model 用户界面 View 页面业务逻辑 Cont
  • web前端炫酷实用的HTML5应用和jQuery插件

    又开始了新的一天 我们也将继续为大家分享许多优秀的HTML5应用和jQuery插件 作为前端开发者来说 这些资源可以帮助你在项目开发上派上用场 下面一起来看看这些炫酷而实用的HTML5应用和jQuery插件吧 1 jQuery CSS3图片
  • AI+无线通信

    1 赛题与数据 官方介绍已经比较清楚了 按照需要下载对应的文件 博主使用的是pytorch版本 2 代码的本地部署 2 1 文件列表 示例程序文件有以下几个文件 Model define pytorch py 在这个文件设计网络结构 设计
  • Redis----布隆过滤器

    目录 背景 解决方案 什么是布隆过滤器 布隆过滤器的原理 一些其他运用 背景 比如我们在观看新闻或者刷微博的时候 会不停地给我们推荐新的内容 我们发现几乎没有重复的 说明后台已经进行了去重处理 基于如何去重 Redis给出了高效的方案 布隆
  • shell脚本之实现menu菜单

    bin bash function copy read p please input your old file old file read p please input your new file new file cp r old fi
  • 目标检测 基于IOU的匹配算法

    目标检测是计算机视觉领域的一个重要研究方向 旨在通过算法识别出图像中存在的目标物体 并对其进行分类 定位和跟踪等任务 而基于IOU的匹配算法是目标检测中常用的一种算法 其原理是通过计算目标框之间的重叠率 IOU 来确定目标检测算法所预测的目
  • 什么是哈希算法?

    哈希算法的基本含义 哈希是密码学的基础 理解哈希是理解数字签名和加密通信等技术的必要前提 哈希 英文是 hash 本来意思是 切碎并搅拌 有一种食物就叫 Hash 就是把食材切碎并搅拌一下做成的 哈希函数的运算结果就是哈希值 通常简称为哈希
  • iframe允许嵌入的视频全屏播放

    iframe允许嵌入的视频全屏播放 设置 allowfullscreen true
  • 记一次修改DiyBox的经历(openwrt固件解包与打包)

    吐槽几句 做技术的有无私造福人类的 也有耍流氓坑人的 说的不是DiyBox 而是 信利 信利就是一家犯贱 祸害大学生 助纣为虐的流氓公司 其所谓的 防私接 技术让电信和移动牢牢的垄断着学校的宽带资源 还让学生花费了大量的冤枉钱 当然 有狗熊