|
注意: 本文涉及大量嵌入式linux知识, 大家凭自己的能力食用 b4 z$ V! a9 ^; F( f* A4 ?% r, ?( I& S5 _
6 h# U* _6 a( a9 z2 U `
中兴的F650A在新版固件(天翼网关3.0)中, 更改了内核分区, 虽然它实际是jffs2分区并且默认挂载成ro只读, 但我们可以remount成rw模式., N, J/ z, e4 T
但是, 往这个jffs2分区写入数据后, 会造成无法启动的问题, 原因在于uboot会校验jffs2分区的crc, 我们可以修改这个crc, 实现误改rootfs后的救砖操作. b6 G. ~& w: X( _4 t: m+ t
以下是解析:7 P* Y4 g+ m) j6 Z6 G' y( Q/ M. d8 s
7 K& M `6 y2 R
kernel分区文件结构2 O& p# o* W: p% e9 B4 F
这段是跳过坏块, 这个区块是可能有 也可能没有的, 不必在意& B! t* p$ A! O( p% Z* s) P
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|) a* U# ? z, X& q$ q- F
** V' [9 B8 y' \7 @0 e4 i
这段是分区的头结构体, 其中 前16字节的 99 44 55 aa 是magic head, 用来标识数据的开始, 只有识别到这个魔术码, 才会作为数据的开始2 m, g. W& y# o; U1 Z% z9 d* m
00020000 99 99 99 99 44 44 44 44 55 55 55 55 aa aa aa aa |....DDDDUUUU....|! d) W4 G) K. [& ~7 b) _5 n4 W- _
00020010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
/ h. D W$ k3 |$ M从24字节开始的这一串是版本号字符串 再后面的数据暂时不明3 A3 b" m2 {( }/ h" P7 b: \
00020020 00 00 00 00 56 32 2e 30 2e 33 50 31 54 37 00 00 |....V2.0.3P1T7..|4 p$ m) ^3 O- k6 P+ }
00020030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|+ w, l. m) F/ V r1 d5 k) h5 X' }
00020040 01 00 00 00 00 00 1e 01 c0 fe 1d 01 40 01 00 00 |............@...|
b! `/ L$ \8 m( i; m# T9 @2 S1 `3 N
- ?! N& w% U. L6 X7 o. y
这个3d 2d 17 cd是后面jffs2分区的crc, 修改jffs2分区要改此crc, uboot会给出计算出来的crc值, 按小端替换上去即可
/ ^& ^- d' h5 B+ U" |00020050 3d 2d 17 cd 00 00 00 00 00 00 1e 01 00 00 00 00 |=-..............|
: h, K+ R1 Z2 }& O00020060 00 00 d0 01 00 00 28 01 00 00 00 00 00 00 00 00 |......(.........|9 p, @" W+ k0 h$ k2 U
00020070 00 00 f8 02 00 00 28 01 00 00 00 00 00 00 00 00 |......(.........|4 e+ G! T. x: J# S% o9 g0 K. s
00020080 5a 58 48 4e 20 46 36 35 30 41 20 55 4e 49 20 56 |ZXHN F650A UNI V|1 t3 N' ^8 z4 z0 b
00020090 32 2e 30 2e 33 50 31 54 37 00 00 00 00 00 00 00 |2.0.3P1T7.......|
) D5 [7 v6 D1 p000200a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
9 G: _ e: s! d如以下这段错误提示, 表示 jffs2 分区的真实crc是 0x9b9647af, 我们按小端序(af 47 96 9b)填入上述的位置即可' p! \) g/ V' }# h
vmlinuz crc error 0x9b9647af, S1 }, j! w# d3 s
no version available, pls downver!
! h: J4 a9 c* Q4 K" p- @9 j3 B5 u) Y& a2 h& w
5 k7 V9 y$ W$ X0 e*
1 [6 f1 q: P5 @# M+ }4 p' H& i& L) J- G' [$ L( S
1 l* F* C7 s& g+ ]1 V4 H7 ?这段的6e 8d 53 f2是这个头结构体的crc, 后面会跟这个分区的生成时间(估计是), uboot会给出计算出来的crc值, 按小端替换上去即可3 Q7 ]) P/ L. u8 P3 Q
000200d0 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |................|2 H3 n9 |. g$ [* p: `) r
000200e0 6e 8d 53 f2 32 30 31 39 30 31 30 32 31 34 34 38 |n.S.201901021448|2 e7 \! D% T0 O8 T( \
000200f0 35 31 00 00 00 00 00 00 ff ff ff ff ff ff ff ff |51..............|
) E# C9 N0 m3 o' p+ {9 F00020100 00 00 00 08 ff ff 01 00 00 00 00 00 00 00 00 00 |................|* A. [5 x1 w' r \
00020110 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
, K8 T+ k' }, G1 @. Q O- v00020120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|3 U: P1 K, B- [. Z* g9 K
如下错误提示, 代表这个头结构体的实际计算crc是0x55cf6dbd, 而实际读取到的是0x040e018a, 这里同样我们按小端序(bd 6d cf 55)填上即可. W6 M t$ M6 e# \! ~* S" F
header crc error 0x55cf6dbd,add=0x02f80000
3 ^, r) K8 X& r$ v0 T: ^,binheadercrc=0x040e018a; f; ~: T! ^1 J0 n r0 L
( x+ H& j7 J8 W/ S2 K& h4 G' T
5 H" d, B9 D; V8 N! w0 S
*0 r' J6 O, O2 v- B v* d3 h6 m* }
5 k8 R+ K ?/ `. p9 r6 e2 y5 T
* d, z/ J" _4 w% w这段是jffs2分区, 小端序, uboot检查crc后, 会读取下面的0uImage内核文件, 载入内存并启动% X- c _+ H9 \! A5 [* [& J
00040000 85 19 01 e0 2f 00 00 00 b1 f9 44 f2 01 00 00 00 |..../.....D.....|
) h4 g$ A' O6 [* `9 w00040010 00 00 00 00 02 00 00 00 c9 5e 2c 5c 07 08 00 00 |.........^,\....|+ h4 K, a( `5 ~9 ]& j
00040020 a9 e5 16 81 66 e5 52 31 30 75 49 6d 61 67 65 ff |....f.R10uImage.|5 }8 N- Q$ o6 c+ k1 J8 {
00040030 85 19 02 e0 b8 0a 00 00 d4 d7 d0 59 02 00 00 00 |...........Y....|( X* t; x$ Z! N8 _
00040040 01 00 00 00 a4 81 00 00 00 00 00 00 94 08 3f 00 |..............?.|
) W) K; v/ D" f6 L00040050 c9 5e 2c 5c c9 5e 2c 5c c9 5e 2c 5c 00 00 00 00 |.^,\.^,\.^,\....|& u, R6 |1 B6 i( Z( p$ i0 k! s
00040060 74 0a 00 00 00 10 00 00 06 00 00 00 c5 a4 53 c6 |t.............S.|
9 X( a' }7 z0 J- N( H3 P0 F% s$ d9 m00040070 e8 6a 61 20 78 5e 74 57 0d 6c 1c d5 11 9e dd fb |.ja x^tW.l......|
' N4 @! f1 g5 E6 a' O! b$ e00040080 b3 0f db fb fc 93 38 b9 b8 f6 9a 80 ea 24 0e 2c |......8......$.,|
4 R- e8 L% A) M" I; e* h00040090 38 4d 43 1b e2 0b 46 50 28 90 4b 6c 0c 04 0b 8e |8MC...FP(.Kl....|
1 W8 A) s" C& k. _5 v000400a0 92 d0 44 a5 b1 cb 4f 85 5a 54 ce b1 9d c6 89 2f |..D...O.ZT...../|
1 _2 |) y+ z% d3 N4 Y000400b0 be 24 0e b8 6e 5c 2f 50 d4 82 5a 61 5c 15 21 da |.$..n\/P..Za\.!.|
0 a8 x/ `( T% h. N4 ?+ w% O( a4 H; M% I' E4 I/ ]7 L: U
......' ?* s1 x6 R8 X/ f
5 k/ Z) w3 [# d: j: @% H% @如果大家只是想跳过uboot的crc检查, 立刻进入系统救砖, 有办法吗? 答案是肯定的4 t! Y' M1 i' u9 @1 I5 o; D
我们等待uboot提示crc错误之后, 可以输入命令:
, g7 b) Q2 i: H% i) ]6 G' yfsload 0uImage" E2 v8 J9 X2 x3 }! ^
意思是载入jffs2分区的内核文件, uboot会加载到内存0x42000000上
! D2 ~9 C7 b& [ X- w4 u, F然后, 我们可以输入
% `8 ~0 W$ S. Z5 I% mbootm 0x42000000" I7 Z2 t; g% K+ _
即可应急启动到系统了
1 k% c/ k, B! u9 W! {: q$ R5 [这个方法的缺点是, 光猫的内核分区有两个, 即mtd9和mtd10, 我们并不能选择实际要启动到的内核分区, l, M8 G4 ]" r4 a9 ]0 q
楼主暂时也没找到载入特定分区的办法, 以上.! z- T8 O; v7 |$ M
- `, `3 G; Q. b- r p# G扩展:
) I& O9 k2 j9 H+ p; ], ] L那么, 我们能不能自己做内核分区呢? 楼主还没尝试, 理论上是可行的, 希望本文能给大家带来帮助( e8 H( c$ C R$ B2 d
|
|