【Emuelec】emmc刷写工具ceemmc原理分析

news/2024/11/9 0:54:29/

ceemmc是emuelec官方闭源的刷入emmc的工具,但在4.3以后就官方不提供了,好在旧版本的ceemmc是二进制程序,放到新系统上也能用,于是乎分析其工作原理,自己折腾,自己将4.5游戏系统刷入emmc的一点经验总结(单系统模式)

1.根据emmc中现有的分区表分析现有分区状态和可用空间,并且迁移cache、data、code等分区,并计算出创建CE_FLASH、CE_STORAGE分区所需的偏移量(4.3版本的ceemmc下,bootloader占用4M、 env占用8M、 misc占用8M、  logo占用8M、dtbo占用8M、 reserved占用64MB、CE_FLASH占用2GB,CE_STORAGE占用剩余的所有空间

2.在emmc中创建包含CE_FLASH、CE_STORAGE的新的分区表

因为ceemmc是不开源的,看不到源码,所以以上2步是通过二进制逆向分析了解的(可能理解不全面)

这里的关键是创建一张新的分区表以替换/dev/reserved中旧的分区表信息(可能还有别的辅助步骤,比如修改dtb信息),使设备开机时就会在/dev目录虚拟出CE_FLASH、CE_STORAGE两个disk设备,然后在开机配置选项文件(cfg_load)中指定启动disk设备为CE_FLASH、CE_STORAGE就可以实现emmc开机了,参考代码如下:

 v6 = fopen(a2, "rb+");if ( v6 ){v5 = calloc(1LL, 0x40000LL);if ( v5 ){for ( i = 0; i <= 1; ++i ){if ( (unsigned int)fseek(v6, (i + 16LL) << 18, 0LL) ){puts("Error seek file!");free(v5);fclose();return 0xFFFFFFFFLL;}if ( fread(v5, 0x40000LL, 1LL, v6) != 1 ){puts("Error reading file!");free(v5);fclose();return 0xFFFFFFFFLL;}if ( (signed int)sub_402520(v5, (__int64)"/partitions") < 0 ){printf("Could not remove node '%s' from dtb%d!\n", "/partitions", i);free(v5);fclose();return 0xFFFFFFFFLL;}if ( (unsigned int)fseek(v6, (i + 16LL) << 18, 0LL) ){puts("Error seek file!");free(v5);fclose();return 0xFFFFFFFFLL;}if ( fwrite(v5, 0x40000LL, 1LL, v6) != 1 ){puts("Error writing file!");free(v5);fclose();return 0xFFFFFFFFLL;}}
 v15 = *(_DWORD *)a1;if ( (unsigned int)strcmp((const char *)(a1 + 262128), "A~D") ){printf("Error dtb magic: %s!\n", v4 + 262128);return 0xFFFFFFFFLL;}if ( (unsigned __int16)v15 == 35615 ){v17 = (int *)calloc(1LL, 5242880LL);if ( !v17 ){puts("malloc failed for gzip_buf!");return 0xFFFFFFFFLL;}v11 = sub_4097A8(v17, 5242880LL, v16, &v5);if ( (v11 & 0x80000000) != 0 ){printf("Failed to decompress gzipped dtb: %d!\n", v11);free(v17);return 0xFFFFFFFFLL;}v16 = (__int64)v17;v15 = *v17;}if ( v15 == -302117424 ){sub_401DE0(v16, v3);sub_40B95C(v16);*(_DWORD *)(v4 + 262140) = sub_401E48(v4);}else if ( v15 == 1598836033 ){v13 = 0;v10 = *(_DWORD *)(v16 + 4);if ( v10 == 1 ){v13 = 4;}else if ( v10 == 2 ){v13 = 16;}v9 = 3 * v13;v8 = 3 * v13 + 8;v12 = *(_DWORD *)(v16 + 8);for ( i = 0; v12 > i; ++i ){v7 = *(_DWORD *)(v16 + i * v8 + (unsigned __int64)v9 + 12);if ( *(_DWORD *)(v16 + v7) == -302117424 ){sub_401DE0(v16 + v7, v3);sub_40B95C(v16 + v7);}}*(_DWORD *)(v4 + 262140) = sub_401E48(v4);}if ( v17 ){v11 = sub_40976C(v4, (__int64)&v6, (__int64)v17, v5);if ( (v11 & 0x80000000) != 0 ){printf("Failed to compress data to dtb: %d!\n", v11);

3.挂载CE_FLASH、CE_STORAGE分区,并复制相应的数据:

以下以创建挂载CE_FLASH为例子

losetup --find 找出可用loop设备,比如loop1

将分区挂载成loop设备:

 losetup /dev/loop1 /dev/mmcblk0 --offset <偏移量>

格式化分区

mkfs.vfat -n "CE_FLASH" /dev/loop1; sync

 参考代码

 memset(&v11, 0LL, 10240LL);printf("\nStarting to format the new '%s' partition...\n", v10);if ( v7 && v6 )snprintf(&v11,10240LL,"mke2fs -F -L \"%s\" -t ext4 -m 0 \"%s\" -O %s -E offset=%lld %lldm; sync",v10,v9,v8,v7,v6 >> 20);elsesnprintf(&v11, 10240LL, "mke2fs -F -L \"%s\" -t ext4 -m 0 \"%s\" -O %s; sync", v10, v9, v8);if ( (signed int)sub_402C3C(&v11, 0LL, stdout) >= 0 )return 0LL;printf("Error executing cmd '%s'\n", &v11);return 0xFFFFFFFFLL;
}

创建挂载目标目录 

mkdir -p /media/CE_FLASH

 挂载

mount -o rw,loop /dev/loop1 /media/CE_FLASH

拷贝数据

rsync -ah --info=progress2 /flash/ /media/CE_FLASH

这样就完成了从外置设备/flash中拷贝数据到emmc中的CE_FLASH的工程


http://www.ppmy.cn/news/40512.html

相关文章

Python json详解

一、抓取文本数据 结构化数据&#xff1a;json&#xff0c;xml(极其的稀少) 。直接转化为python类型 非结构化数据&#xff1a;HTML&#xff0c;字符串。正则表达式、xpath 二、JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff0c; 它使得人们…

C++模板类精讲:探索通用编程的魅力与实战应用

C模板类精讲&#xff1a;探索通用编程的魅力与实战应用1.引言1.1 C模板的概念与作用1.2 模板类在现代C编程中的重要性1.3 模板类在各领域的应用案例2.模板类基础2.1 模板类的定义与语法2.2 模板类的实例化2.3 模板类的特化与偏特化3.模板类与构造函数3.1 模板类中的构造函数3.2…

企业内部即时通讯工具支持内网私有化部署

即时通讯可以说是与我们生活相关最为密切的工具了&#xff0c;即时通讯可以帮助我们与亲朋好友进行交流通讯、文件传输、视频通话等&#xff0c;而企业即时通讯正是个人即时通讯的应用延伸&#xff0c;它可以为互联网时代的企业员工交流&#xff0c;企业信息互通创造良好的条件…

全球十大正规黄金期货交易APP平台排名(2023版榜单)

在如今的这个信息大爆炸的时代还有许多人以为黄金投资只是购买金条、金币等升值这种实物黄金&#xff0c;其实现在在黄金市场中以网上电子交易平台为基础的现货黄金理财方式也是主流之一&#xff0c;现货黄金主要依托于黄金市场的理财优势和互联网投资特点&#xff0c;因此吸引…

Linux proc文件系统介绍

Linux proc文件系统 /proc/cmdline Arguments passed to the Linux kernel at boot time. Often done via a boot manager such as lilo(8) or grub(8) proc/[pid]/coredump_filter Since kernel 2.6.23, the Linux-specific /proc/PID/coredump_filter file can be used …

Loblaws Inc EDI需求详解

Loblaws Inc是成立于1919年的加拿大连锁超市公司&#xff0c;经营范围涵盖食品、健康、美容、金融服务和服装等多个领域。 Loblaws Inc在加拿大拥有超过2200家门店和200000名员工&#xff0c;是加拿大最大的私营雇主之一。虽然Loblaws Inc在中国没有直接的业务&#xff0c;但是…

Python安装模块总失败?一次教你学会镜像安装

人生苦短&#xff0c;我用python 安装模块总是不成功&#xff1f; 这次一次性讲清楚~ 还是安装报错指路:点击此处跳转文末名片获取 为什么会出现安装模块失败? 首先我们要知道 其实大部分我们在用的模块, 都是歪果仁开发的, 然而我们在输入 “pip install 模块名” 的时候,…

自己动手写CPU——第二篇

1 ori指令说明 ori是进行逻辑 或 运算的指令&#xff0c;其指令格式如下所示 从以上的指令格式&#xff0c;我们可以直到&#xff0c;这是一个I类型指令&#xff0c;ori指令的指令码是 6‘b001101&#xff0c;所以当处理器发现正在处理的指令的高6bit 是 001101 的时候&#x…