openwrt squashfs固件解包打包与签名方法

2023-11-13

我们有时没有时间重新编译整个固件,但是却又想修改其中的某个功能,这时就涉及到了固件的解包与打包

下面提供一个简单的解包打包脚本:openwrt固件修改(squashfs+jffs2格式固件)

#!/bin/sh
sudo echo "Starting..."
MKSQSHFS4='./bin/mksquashfs4'
PADJFFS2='./bin/padjffs2'
case "$1" in
'extract'|'e')
offset1=`grep -oba hsqs $2 | grep -oP '[0-9]*(?=:hsqs)'`
offset2=`wc -c $2 | grep -oP '[0-9]*(?= )'`
size2=`expr $offset2 - $offset1`
#echo $offset1 " " $offset2 " " $size2
dd if=$2 of=kernel.bin bs=1 ibs=1 count=$offset1
dd if=$2 of=secondchunk.bin bs=1 ibs=1 count=$size2 skip=$offset1
sudo rm -rf squashfs-root 2>&1
sudo unsquashfs -d squashfs-root secondchunk.bin
rm secondchunk.bin
;;
'create'|'c')
sudo $MKSQSHFS4 ./squashfs-root ./newsecondchunk.bin -nopad -noappend -root-owned -comp xz -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 -b 256k -processors 1
sudo chown $USER ./newsecondchunk.bin
cat kernel.bin newsecondchunk.bin > $2
$PADJFFS2 $2
rm newsecondchunk.bin
;;
*)
echo 'run
"modify-firmware.sh extract firmware.bin"
You will find file "kernel.bin" and folder "squashfs-root".
Modify "squashfs-root" as you like,after everything is done,run
"modify-firmware.sh create newfirmware.bin"
And you will get a modified firmware named newfirmware.bin.
'
;;
esac

然而,修改好固件重新打包之后,固件末尾的签名却丢失了。

官方固件结尾
修改后结尾丢失
分析可知,丢失的内容大致可分为两部分。
  1. 元数据metadata
  2. 签名comment

查找openwrt编译所用工具目录openwrt/staging_dir/host/bin,发现以下两个程序与签名以及元数据有关:

fwtool usign

分别查看帮助如下:

$ ./fwtool
Usage: ./fwtool <options> <firmware>

Options:
  -S <file>:            Append signature file to firmware image
  -I <file>:            Append metadata file to firmware image
  -s <file>:            Extract signature file from firmware image
  -i <file>:            Extract metadata file from firmware image
  -t:                   Remove extracted chunks from firmare image (using -s, -i)
  -T:                   Output firmware image without extracted chunks to stdout (using -s, -i)
  -q:                   Quiet (suppress error messages)
$ ./usign
Usage: ./usign <command> <options>
Commands:
  -V:                   verify (needs at least -m and -p|-P)
  -S:                   sign (needs at least -m and -s)
  -F:                   print key fingerprint of public/secret key or signature
  -G:                   generate a new keypair (needs at least -p and -s)
Options:
  -c <comment>:         add comment to keys
  -m <file>:            message file
  -p <file>:            public key file (verify/fingerprint only)
  -P <path>:            public key directory (verify only)
  -q:                   quiet (do not print verification result, use return code only)
  -s <file>:            secret key file (sign/fingerprint only)
  -x <file>:            signature file (defaults to <message file>.sig)

分析可知签名步骤如下:

  1. 从编译好的固件提取元数据metadata,如果不是自己编译的固件或者已经删除编译目录,还需要提取build key
./fwtool -i ~/mt7621.meta ~/mt7621.bin #提取元数据
  1. 将元数据metadata附加到新固件尾。
./fwtool -I ~/mt7621.meta ~/newifi3_nosign.bin
  1. 根据build key生成签名文件,默认生成为同目录下<message file>.sig
./usign -S -m ~/newifi3_nosign.bin -s ~/openwrt/key-build
  1. 附加签名到末尾。
./fwtool -S ~/newifi3_nosign.bin.sig ~/newifi3_nosign.bin

此时已经可以正常刷入。如果想要和官方固件格式完全相同。还可以把ucert文件再添加到末尾。

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

openwrt squashfs固件解包打包与签名方法 的相关文章

  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 如何从 Linux 的 shell 中删除所有以 ._ 开头的文件?

    确实如标题所示 我已将许多文件从 Mac 复制到 Raspberry Pi 这导致了许多以前缀开头的多余文件 我想删除以以下开头的文件夹中的每个文件 我该怎么做 尝试类似的方法 cd path to directory rm rf 或者 如
  • 在 shell 脚本中查找和替换

    是否可以使用 shell 在文件中搜索然后替换值 当我安装服务时 我希望能够在配置文件中搜索变量 然后在该值中替换 插入我自己的设置 当然 您可以使用 sed 或 awk 来完成此操作 sed 示例 sed i s Andrew James
  • 是否从页面缓存中的脏页面进行文件读取?

    当字节写入文件时 内核不会立即将这些字节写入磁盘 而是将这些字节存储在页缓存中的脏页中 回写缓存 问题是 如果在脏页刷新到磁盘之前发出文件读取 则将从缓存中的脏页提供字节 还是首先将脏页刷新到磁盘 然后进行磁盘读取以提供字节 将它们存储在进
  • 如何通过代理将套接字连接到http服务器?

    最近 我使用 C 语言编写了一个程序 用于连接到本地运行的 HTTP 服务器 从而向该服务器发出请求 这对我来说效果很好 之后 我尝试使用相同的代码连接到网络上的另一台服务器 例如 www google com 但我无法连接并从网络中的代理
  • 具有少量父设备属性的 udev 规则

    我需要复杂且通用的udev规则来确定插入任何 USB 集线器的特定端口的 USB 设备 所以 我必须结合设备树不同层的父属性 我有这个 udevadm info query all name dev ttyUSB0 attribute wa
  • 为 Linux 安装 R 包时出错

    我试图在 R 3 3 上安装一个名为 rgeos 的包 但是当我输入 install packages rgeos 但它返回给我以下错误 其他包也会发生同样的情况 但不是所有包 gt installing source package rg
  • 如何调用位于其他目录的Makefile?

    我正在尝试这样做 我想打电话给 make Makefile存在于其他目录中 abc可以使用位于不同目录中的 shell 脚本的路径 我该怎么做呢 由于 shell 脚本不允许我cd进入Makefile目录并执行make 我怎样才能编写she
  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • 如何用X11复制到剪贴板?

    使用 OS X 上的框架 我可以使用以下命令将 PNG 复制到粘贴板 在 C 中 显然我可以将 NSPasteboard 与 Cocoa 一起使用 include
  • 无法执行'x86_64-conda_cos6-linux-gnu-gcc':没有这样的文件或目录(pysam安装)

    我正在尝试安装 pysam 执行后 python path to pysam master setup py build 这个错误的产生是 unable to execute x86 64 conda cos6 linux gnu gcc
  • 在Linux中断上下文中运行用户线程

    我正在编写一些定制的应用程序 并允许更改 Linux 内核中的中断处理程序代码 我有一个用户线程正在等待中断发生 如果发生中断 那么我要做的第一件事就是执行该用户线程 有什么办法让它发挥作用吗 Thanks 创建一个字符设备 这就是内核所做
  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie

随机推荐

  • 分布式限流之 - Nginx层限流

    写在前面的话 高并发的三驾马车 缓存 降级 限流 这里仅仅说限流 常用的限流算法有 计数器算法 固定窗口算法 滑动窗口算法 漏桶算法 令牌桶算法 每种算法的特点和优缺点这里不展开 比较适用的限流算法基本都会选择令牌桶 并且这里基于Sprin
  • 《Perl语言入门》读书笔记(五)输入与输出

    1 读取标准输入 使用
  • Android Data Binding

    请注明链接 https blog csdn net feather wch article details 79789597 Data Binding 1 DataBinding引入 android compileSdkVersion 23
  • 自动备份脚本linux下,Linux七牛云自动备份脚本

    1 下载七牛云自动备份脚本 目录如下 image png 进入此目录 执行命令 python setup py install 需要python2 7以上 安装完毕 目录如下 image png 2 编写配置文件 备份名称 用于标记 BAC
  • 基于Qt实现分块下载网络文件

    实际开发经常遇到下载网络文件的需求 对于一些比较大的网络文件 如果通过网络接口一次性读取数据后再写入文件 会占用较大的内存 比较好的做法是 先通过QNetworkRequest ContentLengthHeader获取文件的大小 然后设定
  • LED摩托车灯升降压恒流芯片OC4000电路原理图

    LED摩托车灯升降压恒流芯片OC4000是一种可以将不稳定的直流电压转化为稳定的直流电压的电子元件 特别适合用于需要大电流 高电压的LED灯具中 它是一种高精度 高效率的降压型LED恒流驱动控制芯片 可以将电压降至适合LED灯珠的安全范围
  • 综合交易平台API技术开发指南

    综合交易平台API技术开发指南 草稿 第一章 CTP 产品特性 2 第二章 CTP API 技术基础 4 第三章 CTP API 证券交易
  • APP自动化-- 03 adb简介

    文章目录 1 ADB简介 2 adb命令 3 参考资料 4 monkey 1 ADB简介 adb组成 adb adb exe 运行于PC端 包括Linux Windows Mac OS等系统之中 通常是x86架构上 下文中 ADB指整个模块
  • js之匿名函数详解

    1 函数的声明与函数表达式区别 1 1 函数的声明 如下方法 add 就是函数声明的代码结构 function add x y alert x y add 1 2 弹窗显示 3 关于函数声明 它最重要的一个特征就是函数声明提升 意思是执行代
  • 【项目总结】基于SSM+SpringBoot+Redis的个人博客系统项目总结

    文章目录 项目介绍 开发背景 数据库设计 主要使用到的技术点 前端 后端 自定义统一返回对象 自定义拦截器 加盐加密操作 分页功能 session持久化 自定义头像的存储和获取 项目编写过程中遇到的困难点 困难点一 小 困难点二 小 困难点
  • javascript取Date时间的前一天和后一天

    在页面里直接用js Date curDate new Date var preDate new Date curDate getTime 24 60 60 1000 前一天var nextDate new Date curDate getT
  • Python 入门

    python输出 python输出hello world print hello world 变量 print 12 34 print 12 34 2 print 12 34 2 3 a 12 34 b a 2 c b 3 print a
  • 网络安全期末整理

    什么网络安全 网络安全是指网络系统的硬件 软件及其系统中的数据受到保护 不因偶然的或者恶意的原因而遭到破坏 更改或泄露 系统连续 可靠 正常地运行 网络服务不中断 网络安全的特征 保密性 完整性 可用性 可控性 面对威胁网络安全的安全措施
  • 关于深度图像

    深度图像 深度图像 depth image 也被称为距离影像 range image 是指将从图像采集器到场景中各点的距离 深度 作为像素值的图像 它直接反映了景物可见表面的几何形状 深度图像经过坐标转换可以计算为点云数据 有规则及必要信息
  • 泊松曲面重建(基于PCL)

    Possion重建是Kazhdan等2006年提出的网格重建方法 Possion重建的输入是点云及其法向量 输出是三维网格 表面重建流程 1 构建八叉树 采用的是自适应的空间网格划分的方法 根据点云的密度调整网格的深度 根据采样点集的位置定
  • 自动控制原理知识点梳理——8.非线性控制系统分析

    1 非线性控制系统 线性控制系统 由线性元件组成 输入输出具有叠加性和齐次性性质 非线性控制系统 系统中有非线性元件 输入输出间不具有叠加性和齐次性性质 非线性系统的特征 非线性系统的特征 稳定性问题 稳定性问题 频率响应畸变 常见的非线性
  • Elastic-job 启动阻塞“假死”的问题

    问题记录 最近项目引入Elastic Job实现定时任务的分布式调度 引入的版本2 1 5 加入相关的job配置后启动项目 主线程假死 不进行后续逻辑处理和日志输出 输出的日志如下 INFO RMI TCP Connection 2 127
  • 联想拯救者y7000 ALT+TAB卡顿问题

    联想拯救者y7000 ALT TAB卡顿问题 我是2019年买的联想拯救者y7000 能吃鸡中画质也不卡 但是在使用alt tab切屏幕时 总是出现一两秒的卡顿 感觉非常难受 后来解决了问题 在这分享下 方法一 方法二 题主亲测有效 大家可
  • JAVA数组排序之冒泡排序

    冒泡排序 基本思路 从数组中第一个数开始与相邻的数比较 若前一个数大于后一个数则两个数位置进行交换 arr i gt arr i 1 这样的步骤进行多次 直到数组中所有元素按照大小排序 如图所示 int arr 1 99 22 76 24
  • openwrt squashfs固件解包打包与签名方法

    我们有时没有时间重新编译整个固件 但是却又想修改其中的某个功能 这时就涉及到了固件的解包与打包 下面提供一个简单的解包打包脚本 openwrt固件修改 squashfs jffs2格式固件 bin sh sudo echo Starting