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

本文基于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 查询文件系统挂接点的属性为可读写

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值