一种只读文件系统的破解方法

2024-08-28 06:58

本文主要是介绍一种只读文件系统的破解方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文基于Linux 操作系统(内核版本2.6 )MIPS 处理器

 

我们内核使用initramfs根文件系统。它的作用和initrd类似,只是和内核编译成一个文件(该initramfs是经过gzip压缩后的cpio格式的数据文件),该cpio格式的文件被链接进了内核中特殊的数据段.init.ramfs上,其中全局变量__initramfs_start和__initramfs_end分别指向这个数据段的起始地址和结束地址。内核启动时会对.init.ramfs段中的数据进行解压,然后使用它作为根文件系统。initramfs编译到内核中,会导致最后生成的uImage/vmlinux会比平时大许多。

 

设备上的 NANDFLASH 存储介质在出厂时,分为两个区:第一个区为内核文件区,第二个区为应用程序区。为了防止用户误操作导致系统故障并且不可恢复,生产烧写完程序后,设置第一个区(内核分区)为只读分区。分区表及属性信息都是在BIOS阶段通过环境变量配置的,BOIS引导linux 内核时通过启动参数再传给内核的MTD层创建设备分区表信息,当分区设备mount到具体的文件系统后,只读分区的文件系统属性也变为只读。目前分区表及属性信息只能在BOIS 中修改,对BOIS 的操作只能通过串口完成。这就成为直接在线通过网络升级内核文件的障碍

 

Linux 内核中分区表信息保存在数组mtd_table 中

 

代码中定义:

struct mtd_info *mtd_table[MAX_MTD_DEVICES];

 

struct mtd_info {

         u_char type;

         uint32_t flags;                 //分区属性

         uint64_t size;  // Total size of the MTD

 

第一步: 修改分区表属性

在 system.map 中查找 mtd_table 地址

 

map中地址:

ffffffff813e3570 B mtd_table

 

修改属性

 

/ # devmem 0x90000000813e3570 64       //mips 64位的地址

0x9800000136053500

/ # devmem 0x9800000136057504

0x00000000

/ # devmem 0x9800000136057504 32 0x400

 

第二步: 修改分区表块设备节点属性

 

每个分区都对应一个块设备节点。考虑到涉及的数据结构比较繁琐,

而判断函数 bdev_read_only 逻辑处理简单

 

int bdev_read_only(struct block_device *bdev)

{

         if (!bdev)

                  return 0;

         return bdev->bd_part->policy;

}

 

 

准备直接短接函数 bdev_read_only, 让其直接返回为零。

找到对应的内核文件vmlinux

mips64el-linux-objdump -D vmlinux > 1.txt  查看bdev_read_only 对应的函数地址和汇编

 

修改判断条件

devmem 0x90000000803cd3a8 32 0x0        //mips 汇编指令 0 是nop空操作

devmem 0x90000000803cd3ac 32 0x0       

 

 

此时再mount 查询文件系统挂接点的属性为可读写

 

 

 

这篇关于一种只读文件系统的破解方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114051

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Apache Tomcat服务器版本号隐藏的几种方法

《ApacheTomcat服务器版本号隐藏的几种方法》本文主要介绍了ApacheTomcat服务器版本号隐藏的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1. 隐藏HTTP响应头中的Server信息编辑 server.XML 文件2. 修China编程改错误

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

SpringBoot3集成swagger文档的使用方法

《SpringBoot3集成swagger文档的使用方法》本文介绍了Swagger的诞生背景、主要功能以及如何在SpringBoot3中集成Swagger文档,Swagger可以帮助自动生成API文档... 目录一、前言1. API 文档自动生成2. 交互式 API 测试3. API 设计和开发协作二、使用