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

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

相关文章

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Java 中编码与解码的具体实现方法

《Java中编码与解码的具体实现方法》在Java中,字符编码与解码是处理数据的重要组成部分,正确的编码和解码可以确保字符数据在存储、传输、读取时不会出现乱码,本文将详细介绍Java中字符编码与解码的... 目录Java 中编码与解码的实现详解1. 什么是字符编码与解码?1.1 字符编码(Encoding)1

Python Flask实现定时任务的不同方法详解

《PythonFlask实现定时任务的不同方法详解》在Flask中实现定时任务,最常用的方法是使用APScheduler库,本文将提供一个完整的解决方案,有需要的小伙伴可以跟随小编一起学习一下... 目录完js整实现方案代码解释1. 依赖安装2. 核心组件3. 任务类型4. 任务管理5. 持久化存储生产环境

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

java -jar example.jar 产生的日志输出到指定文件的方法

《java-jarexample.jar产生的日志输出到指定文件的方法》这篇文章给大家介绍java-jarexample.jar产生的日志输出到指定文件的方法,本文给大家介绍的非常详细,对大家的... 目录怎么让 Java -jar example.jar 产生的日志输出到指定文件一、方法1:使用重定向1、

Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法

《Java报错:org.springframework.beans.factory.BeanCreationException的五种解决方法》本文解析Spring框架中BeanCreationExce... 目录引言一、问题描述1.1 报错示例假设我们有一个简单的Java类,代表一个用户信息的实体类:然后,

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Java Stream流以及常用方法操作实例

《JavaStream流以及常用方法操作实例》Stream是对Java中集合的一种增强方式,使用它可以将集合的处理过程变得更加简洁、高效和易读,:本文主要介绍JavaStream流以及常用方法... 目录一、Stream流是什么?二、stream的操作2.1、stream流创建2.2、stream的使用2.