|
注意: 本文涉及大量嵌入式linux知识, 大家凭自己的能力食用
. w4 B& }% U5 C- D4 y7 Y
% l& n/ z' n7 E. }( z" }3 X中兴的F650A在新版固件(天翼网关3.0)中, 更改了内核分区, 虽然它实际是jffs2分区并且默认挂载成ro只读, 但我们可以remount成rw模式.
0 e9 c+ i3 N! m' W" `+ d但是, 往这个jffs2分区写入数据后, 会造成无法启动的问题, 原因在于uboot会校验jffs2分区的crc, 我们可以修改这个crc, 实现误改rootfs后的救砖操作.+ E4 ]3 t! q" X+ ]: m0 k( s9 L4 N
以下是解析:
8 q8 ]! F3 c2 H9 W h# r/ H2 ]8 q1 F* ^) N" Q. ?( n0 ]& R: {. x- ~* O1 c
kernel分区文件结构2 Z0 S; }+ y7 G0 t! x- R! C
这段是跳过坏块, 这个区块是可能有 也可能没有的, 不必在意& @. b) X9 }1 V5 v6 c+ D7 g
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
2 ?* t! U! n# \( @1 |$ T N*
' b9 t+ ?1 k2 i1 ^这段是分区的头结构体, 其中 前16字节的 99 44 55 aa 是magic head, 用来标识数据的开始, 只有识别到这个魔术码, 才会作为数据的开始
/ W; ^3 x" }" X$ z4 s( n' \00020000 99 99 99 99 44 44 44 44 55 55 55 55 aa aa aa aa |....DDDDUUUU....|0 @7 y3 V7 C. h! h( p
00020010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|8 v3 c, S% a: ~: X
从24字节开始的这一串是版本号字符串 再后面的数据暂时不明/ T. X# u8 n$ z" j: U( [
00020020 00 00 00 00 56 32 2e 30 2e 33 50 31 54 37 00 00 |....V2.0.3P1T7..|/ Y0 P- b2 h* P: `- T
00020030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0 y5 \. j' ?8 {% V' Z00020040 01 00 00 00 00 00 1e 01 c0 fe 1d 01 40 01 00 00 |............@...|
" ^& |; V) N' P0 ] r, p- Q/ w, d- H
# i4 K0 k0 C; f8 S# t1 }9 ^$ J0 Y$ n" @ k1 ~% v( B" w
这个3d 2d 17 cd是后面jffs2分区的crc, 修改jffs2分区要改此crc, uboot会给出计算出来的crc值, 按小端替换上去即可
& a! v9 R9 M7 D1 B i00020050 3d 2d 17 cd 00 00 00 00 00 00 1e 01 00 00 00 00 |=-..............|
6 N. L0 p4 M7 x" Q' |' S0 c00020060 00 00 d0 01 00 00 28 01 00 00 00 00 00 00 00 00 |......(.........|3 R. G6 W, f/ J0 B' h$ ?
00020070 00 00 f8 02 00 00 28 01 00 00 00 00 00 00 00 00 |......(.........|7 {$ R8 v' m8 v6 h+ R0 f
00020080 5a 58 48 4e 20 46 36 35 30 41 20 55 4e 49 20 56 |ZXHN F650A UNI V|7 r* s- ?; E2 O# j6 X! N! Y. i2 [% Q0 s
00020090 32 2e 30 2e 33 50 31 54 37 00 00 00 00 00 00 00 |2.0.3P1T7.......|
- e N8 n3 E& q; \1 K000200a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
8 _8 a- S' u8 [4 d8 c如以下这段错误提示, 表示 jffs2 分区的真实crc是 0x9b9647af, 我们按小端序(af 47 96 9b)填入上述的位置即可3 b* j$ l+ f) T7 p
vmlinuz crc error 0x9b9647af; [+ a; z; {4 R' Y
no version available, pls downver!
% S$ U y* W# x7 P5 ?
" Y" |4 N% [: _& d; L/ y/ r1 m0 ?+ T5 R! [2 w+ b: L8 l% N* f4 A
*
9 h. q% E+ |5 i# S% i4 S+ C+ ^) G" C6 {3 y. k0 o7 H
0 |$ f* }% Z' U# c$ Y6 s- x这段的6e 8d 53 f2是这个头结构体的crc, 后面会跟这个分区的生成时间(估计是), uboot会给出计算出来的crc值, 按小端替换上去即可
) O+ R6 g% h3 m* G7 @1 V1 W- | E000200d0 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 |................|
5 K* y; A2 ~9 y- q3 U9 ~000200e0 6e 8d 53 f2 32 30 31 39 30 31 30 32 31 34 34 38 |n.S.201901021448|
$ @1 n# h3 e( s000200f0 35 31 00 00 00 00 00 00 ff ff ff ff ff ff ff ff |51..............|; L1 f. m/ |1 E
00020100 00 00 00 08 ff ff 01 00 00 00 00 00 00 00 00 00 |................|
! s5 f$ }% b3 f00020110 08 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
8 n' `+ P2 i8 \; h4 V! N; f0 R: q' x00020120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
1 Q5 C) Q) g, B7 \$ ^; P- p4 t: X X如下错误提示, 代表这个头结构体的实际计算crc是0x55cf6dbd, 而实际读取到的是0x040e018a, 这里同样我们按小端序(bd 6d cf 55)填上即可
- E) x- ?3 U) Z( f' d; uheader crc error 0x55cf6dbd,add=0x02f80000
( x0 r$ e$ u1 m,binheadercrc=0x040e018a" b( z( p8 H+ D
% ^( q: A6 c: N+ a/ o
6 s3 e% x+ m8 e# h1 ^. \+ n; x
* w I2 x# w$ D9 J9 W: i
! }3 E4 Y( j5 E8 U% n2 v2 S% h' E, T' h6 j. q1 H
这段是jffs2分区, 小端序, uboot检查crc后, 会读取下面的0uImage内核文件, 载入内存并启动& _* k' J8 O& ]: V9 k6 p
00040000 85 19 01 e0 2f 00 00 00 b1 f9 44 f2 01 00 00 00 |..../.....D.....|
, `3 w. V5 M- G( ]# C00040010 00 00 00 00 02 00 00 00 c9 5e 2c 5c 07 08 00 00 |.........^,\....|1 b( f3 j: b7 \' |+ t9 A$ Y2 |$ x
00040020 a9 e5 16 81 66 e5 52 31 30 75 49 6d 61 67 65 ff |....f.R10uImage.|
( U7 m! _5 K1 y# o8 X3 M+ D00040030 85 19 02 e0 b8 0a 00 00 d4 d7 d0 59 02 00 00 00 |...........Y....|) U f' z% ?& P7 Y0 s
00040040 01 00 00 00 a4 81 00 00 00 00 00 00 94 08 3f 00 |..............?.|
7 b7 o4 n* v y2 s6 o! d& b! A00040050 c9 5e 2c 5c c9 5e 2c 5c c9 5e 2c 5c 00 00 00 00 |.^,\.^,\.^,\....|
0 C2 E# J- B: x+ d00040060 74 0a 00 00 00 10 00 00 06 00 00 00 c5 a4 53 c6 |t.............S.|
) C- ~" A# v9 J7 [" L$ U% f% J; B00040070 e8 6a 61 20 78 5e 74 57 0d 6c 1c d5 11 9e dd fb |.ja x^tW.l......|
; s2 s7 n0 J9 ~2 o00040080 b3 0f db fb fc 93 38 b9 b8 f6 9a 80 ea 24 0e 2c |......8......$.,| v: p' y& m8 t% i/ z. G* D: O
00040090 38 4d 43 1b e2 0b 46 50 28 90 4b 6c 0c 04 0b 8e |8MC...FP(.Kl....|" v, ^( Q" c7 u
000400a0 92 d0 44 a5 b1 cb 4f 85 5a 54 ce b1 9d c6 89 2f |..D...O.ZT...../|
- x8 U. q( D, F( ~7 E, o8 _# I000400b0 be 24 0e b8 6e 5c 2f 50 d4 82 5a 61 5c 15 21 da |.$..n\/P..Za\.!.|3 v. o: [: F% F D
) h% j' y; F( l* s2 a( H; }......
M; E/ i3 N6 V$ U) B7 l8 c& T& O0 [5 X& Q- Y5 F3 V0 h# f; y
如果大家只是想跳过uboot的crc检查, 立刻进入系统救砖, 有办法吗? 答案是肯定的
/ G+ |6 S L( b8 V9 O b7 I我们等待uboot提示crc错误之后, 可以输入命令: " L0 D: C/ e* u, o. |0 G
fsload 0uImage
' ]! p2 J8 b9 m8 A' |意思是载入jffs2分区的内核文件, uboot会加载到内存0x42000000上
2 o2 j5 r- _' i; m( O3 F- L然后, 我们可以输入" T% v V1 E% e7 S
bootm 0x42000000# ?) s/ ~$ f" e2 L6 W
即可应急启动到系统了
# z1 P, \: ]* W: U4 \( U这个方法的缺点是, 光猫的内核分区有两个, 即mtd9和mtd10, 我们并不能选择实际要启动到的内核分区
# B9 d9 t1 r X# B p/ \) l楼主暂时也没找到载入特定分区的办法, 以上.
) e. J- p" s5 e9 h
8 n2 j, K$ B4 d% U6 ]& _% d扩展:
) K5 Q" E# M% E那么, 我们能不能自己做内核分区呢? 楼主还没尝试, 理论上是可行的, 希望本文能给大家带来帮助
+ u% v* s! t# W- E |
|