找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25759|回复: 38

中兴 F650A v2.0.3版本 内核分区(mtd9, mtd10) 解析

[复制链接]
发表于 2020-11-25 21:19:22 | 显示全部楼层 |阅读模式
注意: 本文涉及大量嵌入式linux知识, 大家凭自己的能力食用
9 V" c. T2 V& P& G! M  ?: g7 f( c, o. x: y" B4 O7 J
中兴的F650A在新版固件(天翼网关3.0)中, 更改了内核分区, 虽然它实际是jffs2分区并且默认挂载成ro只读, 但我们可以remount成rw模式.* w5 ?& x- z8 u( {, x6 S
但是, 往这个jffs2分区写入数据后, 会造成无法启动的问题, 原因在于uboot会校验jffs2分区的crc, 我们可以修改这个crc, 实现误改rootfs后的救砖操作.
3 _+ q6 l* n5 ^# U* L# B以下是解析:
& D6 E1 V1 Q3 n, c/ t
& t% _* S0 N; H1 ^' F6 Y0 hkernel分区文件结构
9 Y8 ]6 {% p0 ^! R' s/ H8 K这段是跳过坏块, 这个区块是可能有 也可能没有的, 不必在意" o5 u0 O0 o! s: w. V
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|1 j5 V3 l0 @: N
*
" V6 k, h3 {: i0 ~+ t  k( T9 [这段是分区的头结构体, 其中 前16字节的 99 44 55 aa 是magic head, 用来标识数据的开始, 只有识别到这个魔术码, 才会作为数据的开始8 x/ ?2 P! {7 Q+ Z: w
00020000  99 99 99 99 44 44 44 44  55 55 55 55 aa aa aa aa  |....DDDDUUUU....|3 ?. ~5 J; a' [5 _
00020010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
: I0 G9 @( G( K$ ?5 Z. H从24字节开始的这一串是版本号字符串 再后面的数据暂时不明  y0 Q2 d: K9 R2 X
00020020  00 00 00 00 56 32 2e 30  2e 33 50 31 54 37 00 00  |....V2.0.3P1T7..|! o- B7 m5 E( `  d0 ]0 W
00020030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
& G2 Y1 G! Q) v00020040  01 00 00 00 00 00 1e 01  c0 fe 1d 01 40 01 00 00  |............@...|
0 @/ y. Z. H! j  [  z$ ?+ x. }7 `. e+ F! G

8 K/ s) C( X) `这个3d 2d 17 cd是后面jffs2分区的crc, 修改jffs2分区要改此crc, uboot会给出计算出来的crc值, 按小端替换上去即可
8 F2 b' q6 I: d# S7 o5 u  G00020050  3d 2d 17 cd 00 00 00 00  00 00 1e 01 00 00 00 00  |=-..............|
: @4 {8 v3 N( Y7 G4 w) ~00020060  00 00 d0 01 00 00 28 01  00 00 00 00 00 00 00 00  |......(.........|& O2 Q+ M( L7 I( y% O1 W
00020070  00 00 f8 02 00 00 28 01  00 00 00 00 00 00 00 00  |......(.........|
) G+ n0 Z7 `, B! A9 O: K00020080  5a 58 48 4e 20 46 36 35  30 41 20 55 4e 49 20 56  |ZXHN F650A UNI V|& A1 Q" F- @3 }8 i2 _
00020090  32 2e 30 2e 33 50 31 54  37 00 00 00 00 00 00 00  |2.0.3P1T7.......|
5 {( {7 Z6 b+ z000200a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
) J, T! A) C% C  M# H/ v6 ~如以下这段错误提示, 表示 jffs2 分区的真实crc是 0x9b9647af, 我们按小端序(af 47 96 9b)填入上述的位置即可
. m/ _9 T0 Y( C; y$ Cvmlinuz crc error 0x9b9647af& h' Q: A* N5 G
no version available, pls downver!
" ?9 x2 w. c  }) r: P: t1 p+ J  B4 o' }& C" [3 d

" W* H/ t2 N1 h+ }/ R8 u*
) a; [; W2 q# k' T. ~8 _3 R  x0 B: h3 B2 [3 C

+ e( }5 ?- Q8 A: W" ~# a, M6 a8 ^这段的6e 8d 53 f2是这个头结构体的crc, 后面会跟这个分区的生成时间(估计是), uboot会给出计算出来的crc值, 按小端替换上去即可6 k2 m2 c. y. x3 M3 b4 e, W
000200d0  00 00 00 00 00 00 00 00  00 00 00 00 01 00 00 00  |................|/ ]) \" ^  [) y1 x
000200e0  6e 8d 53 f2 32 30 31 39  30 31 30 32 31 34 34 38  |n.S.201901021448|
. g4 |% |; P7 G8 o) l# @9 E+ d000200f0  35 31 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |51..............|' I7 ~/ h) w7 e# j
00020100  00 00 00 08 ff ff 01 00  00 00 00 00 00 00 00 00  |................|+ e9 r# R# S4 O$ w& j( t" v
00020110  08 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
1 ~0 s! m. S- o' \3 d8 Z3 p0 f" o00020120  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|: B, D2 y9 F6 K+ p1 T9 }( a) r$ b7 I
如下错误提示, 代表这个头结构体的实际计算crc是0x55cf6dbd, 而实际读取到的是0x040e018a, 这里同样我们按小端序(bd 6d cf 55)填上即可
; r0 s/ {4 X, `/ b: E6 q/ A$ j0 n! theader crc error 0x55cf6dbd,add=0x02f80000
2 h# n' u" c0 @( V7 L6 G,binheadercrc=0x040e018a& X8 `) V; b% i

& @1 v( g0 L* g
. X' Y, \' n. W$ q*
7 ^& j6 S* G3 U8 k- ^) f; k
' n: x0 n9 v; d6 e- ~; \0 H8 P" Q+ S" W, h6 _7 L
这段是jffs2分区, 小端序, uboot检查crc后, 会读取下面的0uImage内核文件, 载入内存并启动
5 O' H' y9 Q' g& d9 o00040000  85 19 01 e0 2f 00 00 00  b1 f9 44 f2 01 00 00 00  |..../.....D.....|
- w9 g' a0 Q' v; i  R# d00040010  00 00 00 00 02 00 00 00  c9 5e 2c 5c 07 08 00 00  |.........^,\....|
! S' }$ W( Q" E) d: P  Z4 e00040020  a9 e5 16 81 66 e5 52 31  30 75 49 6d 61 67 65 ff  |....f.R10uImage.|
# A  {! x5 L2 l- l1 [/ @! H. x6 q00040030  85 19 02 e0 b8 0a 00 00  d4 d7 d0 59 02 00 00 00  |...........Y....|: {( O9 |$ ~" y. s
00040040  01 00 00 00 a4 81 00 00  00 00 00 00 94 08 3f 00  |..............?.|
0 V8 e( }% t; b2 h& S; m00040050  c9 5e 2c 5c c9 5e 2c 5c  c9 5e 2c 5c 00 00 00 00  |.^,\.^,\.^,\....|
- V, m& q. [' Q, u00040060  74 0a 00 00 00 10 00 00  06 00 00 00 c5 a4 53 c6  |t.............S.|' f' P! ^4 L+ x# w+ ]6 x; l
00040070  e8 6a 61 20 78 5e 74 57  0d 6c 1c d5 11 9e dd fb  |.ja x^tW.l......|
, w  _; j" \0 G( P0 t00040080  b3 0f db fb fc 93 38 b9  b8 f6 9a 80 ea 24 0e 2c  |......8......$.,|( O- s8 d* k( Q; y" g8 f- V
00040090  38 4d 43 1b e2 0b 46 50  28 90 4b 6c 0c 04 0b 8e  |8MC...FP(.Kl....|
2 q2 Z( Z% z0 n0 J000400a0  92 d0 44 a5 b1 cb 4f 85  5a 54 ce b1 9d c6 89 2f  |..D...O.ZT...../|* q7 w. h- u6 z9 `6 _
000400b0  be 24 0e b8 6e 5c 2f 50  d4 82 5a 61 5c 15 21 da  |.$..n\/P..Za\.!.|% F+ z/ m( ^  @6 U/ I5 Z; \& y* ]2 H
4 g0 G4 _9 N9 o! i. @" \, v
......  l5 h- o3 j9 R9 _* s. {
! d& k; d) n! q* @; ~
如果大家只是想跳过uboot的crc检查, 立刻进入系统救砖, 有办法吗? 答案是肯定的8 q5 m* A) r7 j9 m4 d
我们等待uboot提示crc错误之后, 可以输入命令: 3 C& h5 W  d* @8 l) ?
fsload 0uImage
! n  `1 w5 J2 ^3 S意思是载入jffs2分区的内核文件, uboot会加载到内存0x42000000上# J) q9 f, Z  E1 G* K
然后, 我们可以输入! x; h3 d. a: k& J+ {* t
bootm 0x420000002 Z) i; Z/ U% K% g4 _* t2 B
即可应急启动到系统了, M2 o) K. W0 f% _
这个方法的缺点是, 光猫的内核分区有两个, 即mtd9和mtd10, 我们并不能选择实际要启动到的内核分区
% V7 J; `) S! ?7 f* |7 m楼主暂时也没找到载入特定分区的办法, 以上.
. U9 t! ^7 i$ A6 c; A, y9 E  [( V, x
扩展: : O7 t- }: ^5 s3 O& ^
那么, 我们能不能自己做内核分区呢? 楼主还没尝试, 理论上是可行的, 希望本文能给大家带来帮助% a3 }0 D. s3 p9 j/ F3 I+ v
发表于 2022-5-9 17:15:13 | 显示全部楼层
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,之后就可以正常启动了。$ B) n( \. ]( ], k# E
关于crc,小端在前,也就是说如果uboot提示的crc error是0x12345678,那么在位置0x40050或0x400E0处,应该填入78563412.

点评

感谢提醒  详情 回复 发表于 2022-5-10 16:46
发表于 2020-11-26 11:46:07 | 显示全部楼层
知道uboot是怎么计算出来的crc值的吗?
9 \( d' z  L# p# J这些CRC值分别是计算哪一段数据呢?

点评

很抱歉, 并没有分析使用的是哪种crc计算方式 计算的数据区已经说明了, 分别是jffs2分区和header结构体  详情 回复 发表于 2020-11-26 21:59
 楼主| 发表于 2020-11-26 21:59:10 | 显示全部楼层
本帖最后由 To.mato 于 2020-11-26 22:02 编辑
( u1 M* i# o; M/ Q4 u* @
haoboss 发表于 2020-11-26 11:468 d5 M1 s+ M) ^# k* H- t
知道uboot是怎么计算出来的crc值的吗?
. ?$ l# x% }$ p5 @" b" q4 m这些CRC值分别是计算哪一段数据呢?

+ `0 D/ x$ N2 |+ F8 w# k很抱歉, 并没有分析使用的是哪种crc计算方式, 可以直接把kernel这个mtd分区写入flash,直接在uboot上看它计算好的结果, flash是slc的, 不用担心写坏 :)
, b4 E: ^3 L: c0 c( k
" i4 @' I  m2 q计算的数据区已经说明了, 分别是jffs2分区和header结构体7 N* D2 _' V" A; I! q9 P0 O
发表于 2020-11-26 22:23:43 | 显示全部楼层
高手,看不懂
发表于 2020-11-27 09:23:50 | 显示全部楼层
楼主微信是多少??交流一下
发表于 2020-11-27 10:20:00 | 显示全部楼层
你能破解吗?
发表于 2020-11-27 10:31:54 | 显示全部楼层
分析的很好 顶一个
发表于 2020-11-28 17:18:30 | 显示全部楼层
这技术贴,支持
发表于 2020-11-30 14:13:34 | 显示全部楼层
难得技术贴,支持楼主
发表于 2020-12-1 09:03:25 | 显示全部楼层
分析的很透彻,高手!还不计较报酬,什么猫粮要多少,大洋要多少,这种共享精神值得大家学习!: n$ j' t) |: X+ i& o
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|宽带技术网 |网站地图

粤公网安备 44152102000001号

GMT+8, 2024-4-29 15:57 , Processed in 0.027438 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表