中兴 F650A v2.0.3版本 内核分区(mtd9, mtd10) 解析
注意: 本文涉及大量嵌入式linux知识, 大家凭自己的能力食用中兴的F650A在新版固件(天翼网关3.0)中, 更改了内核分区, 虽然它实际是jffs2分区并且默认挂载成ro只读, 但我们可以remount成rw模式.
但是, 往这个jffs2分区写入数据后, 会造成无法启动的问题, 原因在于uboot会校验jffs2分区的crc, 我们可以修改这个crc, 实现误改rootfs后的救砖操作.
以下是解析:
kernel分区文件结构
这段是跳过坏块, 这个区块是可能有 也可能没有的, 不必在意
00000000ff ff ff ff ff ff ff ffff ff ff ff ff ff ff ff|................|
*
这段是分区的头结构体, 其中 前16字节的 99 44 55 aa 是magic head, 用来标识数据的开始, 只有识别到这个魔术码, 才会作为数据的开始
0002000099 99 99 99 44 44 44 4455 55 55 55 aa aa aa aa|....DDDDUUUU....|
0002001000 00 00 00 00 00 00 0000 00 00 00 00 00 00 00|................|
从24字节开始的这一串是版本号字符串 再后面的数据暂时不明
0002002000 00 00 00 56 32 2e 302e 33 50 31 54 37 00 00|....V2.0.3P1T7..|
0002003000 00 00 00 00 00 00 0000 00 00 00 00 00 00 00|................|
0002004001 00 00 00 00 00 1e 01c0 fe 1d 01 40 01 00 00|............@...|
这个3d 2d 17 cd是后面jffs2分区的crc, 修改jffs2分区要改此crc, uboot会给出计算出来的crc值, 按小端替换上去即可
000200503d 2d 17 cd 00 00 00 0000 00 1e 01 00 00 00 00|=-..............|
0002006000 00 d0 01 00 00 28 0100 00 00 00 00 00 00 00|......(.........|
0002007000 00 f8 02 00 00 28 0100 00 00 00 00 00 00 00|......(.........|
000200805a 58 48 4e 20 46 36 3530 41 20 55 4e 49 20 56|ZXHN F650A UNI V|
0002009032 2e 30 2e 33 50 31 5437 00 00 00 00 00 00 00|2.0.3P1T7.......|
000200a000 00 00 00 00 00 00 0000 00 00 00 00 00 00 00|................|
如以下这段错误提示, 表示 jffs2 分区的真实crc是 0x9b9647af, 我们按小端序(af 47 96 9b)填入上述的位置即可
vmlinuz crc error 0x9b9647af
no version available, pls downver!
*
这段的6e 8d 53 f2是这个头结构体的crc, 后面会跟这个分区的生成时间(估计是), uboot会给出计算出来的crc值, 按小端替换上去即可
000200d000 00 00 00 00 00 00 0000 00 00 00 01 00 00 00|................|
000200e06e 8d 53 f2 32 30 31 3930 31 30 32 31 34 34 38|n.S.201901021448|
000200f035 31 00 00 00 00 00 00ff ff ff ff ff ff ff ff|51..............|
0002010000 00 00 08 ff ff 01 0000 00 00 00 00 00 00 00|................|
0002011008 01 00 00 00 00 00 0000 00 00 00 00 00 00 00|................|
0002012000 00 00 00 00 00 00 0000 00 00 00 00 00 00 00|................|
如下错误提示, 代表这个头结构体的实际计算crc是0x55cf6dbd, 而实际读取到的是0x040e018a, 这里同样我们按小端序(bd 6d cf 55)填上即可
header crc error 0x55cf6dbd,add=0x02f80000
,binheadercrc=0x040e018a
*
这段是jffs2分区, 小端序, uboot检查crc后, 会读取下面的0uImage内核文件, 载入内存并启动
0004000085 19 01 e0 2f 00 00 00b1 f9 44 f2 01 00 00 00|..../.....D.....|
0004001000 00 00 00 02 00 00 00c9 5e 2c 5c 07 08 00 00|.........^,\....|
00040020a9 e5 16 81 66 e5 52 3130 75 49 6d 61 67 65 ff|....f.R10uImage.|
0004003085 19 02 e0 b8 0a 00 00d4 d7 d0 59 02 00 00 00|...........Y....|
0004004001 00 00 00 a4 81 00 0000 00 00 00 94 08 3f 00|..............?.|
00040050c9 5e 2c 5c c9 5e 2c 5cc9 5e 2c 5c 00 00 00 00|.^,\.^,\.^,\....|
0004006074 0a 00 00 00 10 00 0006 00 00 00 c5 a4 53 c6|t.............S.|
00040070e8 6a 61 20 78 5e 74 570d 6c 1c d5 11 9e dd fb|.ja x^tW.l......|
00040080b3 0f db fb fc 93 38 b9b8 f6 9a 80 ea 24 0e 2c|......8......$.,|
0004009038 4d 43 1b e2 0b 46 5028 90 4b 6c 0c 04 0b 8e|8MC...FP(.Kl....|
000400a092 d0 44 a5 b1 cb 4f 855a 54 ce b1 9d c6 89 2f|..D...O.ZT...../|
000400b0be 24 0e b8 6e 5c 2f 50d4 82 5a 61 5c 15 21 da|.$..n\/P..Za\.!.|
......
如果大家只是想跳过uboot的crc检查, 立刻进入系统救砖, 有办法吗? 答案是肯定的
我们等待uboot提示crc错误之后, 可以输入命令:
fsload 0uImage
意思是载入jffs2分区的内核文件, uboot会加载到内存0x42000000上
然后, 我们可以输入
bootm 0x42000000
即可应急启动到系统了
这个方法的缺点是, 光猫的内核分区有两个, 即mtd9和mtd10, 我们并不能选择实际要启动到的内核分区
楼主暂时也没找到载入特定分区的办法, 以上.
扩展:
那么, 我们能不能自己做内核分区呢? 楼主还没尝试, 理论上是可行的, 希望本文能给大家带来帮助
mtd9和mtd10属于A/B分区,用binwalk可以看到它的结构,header+squashfs分区,如果要修改的话,可以把squashfs分区dd出来,unsquashfs解压,改完mksquashfs打包,与原header拼接,mtd写入相应分区,uboot会提示vmlinuz crc error,先根据error后的提示值修改header的vmlinuz crc,再次刷入,uboot再次提示header crc error,然后再改header crc,之后就可以正常启动了。
关于crc,小端在前,也就是说如果uboot提示的crc error是0x12345678,那么在位置0x40050或0x400E0处,应该填入78563412. 知道uboot是怎么计算出来的crc值的吗?
这些CRC值分别是计算哪一段数据呢? 本帖最后由 To.mato 于 2020-11-26 22:02 编辑
haoboss 发表于 2020-11-26 11:46
知道uboot是怎么计算出来的crc值的吗?
这些CRC值分别是计算哪一段数据呢?
很抱歉, 并没有分析使用的是哪种crc计算方式, 可以直接把kernel这个mtd分区写入flash,直接在uboot上看它计算好的结果, flash是slc的, 不用担心写坏 :)
计算的数据区已经说明了, 分别是jffs2分区和header结构体
高手,看不懂 楼主微信是多少??交流一下 你能破解吗? 分析的很好 顶一个 这技术贴,支持 难得技术贴,支持楼主 分析的很透彻,高手!还不计较报酬,什么猫粮要多少,大洋要多少,这种共享精神值得大家学习!