本文主要是介绍一种只读文件系统的破解方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文基于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 查询文件系统挂接点的属性为可读写
这篇关于一种只读文件系统的破解方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!