|
注意: 本文涉及大量嵌入式linux知识, 大家凭自己的能力食用
中兴的F650A在新版固件(天翼网关3.0)中, 更改了内核分区, 虽然它实际是jffs2分区并且默认挂载成ro只读, 但我们可以remount成rw模式.
但是, 往这个jffs2分区写入数据后, 会造成无法启动的问题, 原因在于uboot会校验jffs2分区的crc, 我们可以修改这个crc, 实现误改rootfs后的救砖操作.
以下是解析:
kernel分区文件结构
这段是跳过坏块, 这个区块是可能有 也可能没有的, 不必在意
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
这段是分区的头结构体, 其中 前16字节的 99 44 55 aa 是magic head, 用来标识数据的开始, 只有识别到这个魔术码, 才会作为数据的开始
00020000 99 99 99 99 44 44 44 44 55 55 55 55 aa aa aa aa |....DDDDUUUU....|
00020010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
从24字节开始的这一串是版本号字符串 再后面的数据暂时不明
00020020 00 00 00 00 56 32 2e 30 2e 33 50 31 54 37 00 00 |....V2.0.3P1T7..|
00020030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00020040 01 00 00 00 00 00 1e 01 c0 fe 1d 01 40 01 00 00 |............@...|
这个3d 2d 17 cd是后面jffs2分区的crc, 修改jffs2分区要改此crc, uboot会给出计算出来的crc值, 按小端替换上去即可
00020050 3d 2d 17 cd 00 00 00 00 00 00 1e 01 00 00 00 00 |=-..............|
00020060 00 00 d0 01 00 00 28 01 00 00 00 00 00 00 00 00 |......(.........|
00020070 00 00 f8 02 00 00 28 01 00 00 00 00 00 00 00 00 |......(.........|
00020080 5a 58 48 4e 20 46 36 35 30 41 20 55 4e 49 20 56 |ZXHN F650A UNI V|
00020090 32 2e 30 2e 33 50 31 54 37 00 00 00 00 00 00 00 |2.0.3P1T7.......|
000200a0 00 00 00 00 00 00 00 00 00 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值, 按小端替换上去即可
000200d0 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |................|
000200e0 6e 8d 53 f2 32 30 31 39 30 31 30 32 31 34 34 38 |n.S.201901021448|
000200f0 35 31 00 00 00 00 00 00 ff ff ff ff ff ff ff ff |51..............|
00020100 00 00 00 08 ff ff 01 00 00 00 00 00 00 00 00 00 |................|
00020110 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00020120 00 00 00 00 00 00 00 00 00 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内核文件, 载入内存并启动
00040000 85 19 01 e0 2f 00 00 00 b1 f9 44 f2 01 00 00 00 |..../.....D.....|
00040010 00 00 00 00 02 00 00 00 c9 5e 2c 5c 07 08 00 00 |.........^,\....|
00040020 a9 e5 16 81 66 e5 52 31 30 75 49 6d 61 67 65 ff |....f.R10uImage.|
00040030 85 19 02 e0 b8 0a 00 00 d4 d7 d0 59 02 00 00 00 |...........Y....|
00040040 01 00 00 00 a4 81 00 00 00 00 00 00 94 08 3f 00 |..............?.|
00040050 c9 5e 2c 5c c9 5e 2c 5c c9 5e 2c 5c 00 00 00 00 |.^,\.^,\.^,\....|
00040060 74 0a 00 00 00 10 00 00 06 00 00 00 c5 a4 53 c6 |t.............S.|
00040070 e8 6a 61 20 78 5e 74 57 0d 6c 1c d5 11 9e dd fb |.ja x^tW.l......|
00040080 b3 0f db fb fc 93 38 b9 b8 f6 9a 80 ea 24 0e 2c |......8......$.,|
00040090 38 4d 43 1b e2 0b 46 50 28 90 4b 6c 0c 04 0b 8e |8MC...FP(.Kl....|
000400a0 92 d0 44 a5 b1 cb 4f 85 5a 54 ce b1 9d c6 89 2f |..D...O.ZT...../|
000400b0 be 24 0e b8 6e 5c 2f 50 d4 82 5a 61 5c 15 21 da |.$..n\/P..Za\.!.|
......
如果大家只是想跳过uboot的crc检查, 立刻进入系统救砖, 有办法吗? 答案是肯定的
我们等待uboot提示crc错误之后, 可以输入命令:
fsload 0uImage
意思是载入jffs2分区的内核文件, uboot会加载到内存0x42000000上
然后, 我们可以输入
bootm 0x42000000
即可应急启动到系统了
这个方法的缺点是, 光猫的内核分区有两个, 即mtd9和mtd10, 我们并不能选择实际要启动到的内核分区
楼主暂时也没找到载入特定分区的办法, 以上.
扩展:
那么, 我们能不能自己做内核分区呢? 楼主还没尝试, 理论上是可行的, 希望本文能给大家带来帮助
|
|