找回密码
 注册

QQ登录

只需一步,快速开始

查看: 25338|回复: 38

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

[复制链接]
发表于 2020-11-25 21:19:22 | 显示全部楼层 |阅读模式
注意: 本文涉及大量嵌入式linux知识, 大家凭自己的能力食用
; c" w- R: T: n$ D6 T
- t2 x0 l: H* t. N3 J- D中兴的F650A在新版固件(天翼网关3.0)中, 更改了内核分区, 虽然它实际是jffs2分区并且默认挂载成ro只读, 但我们可以remount成rw模式.+ X2 y  G& X* s
但是, 往这个jffs2分区写入数据后, 会造成无法启动的问题, 原因在于uboot会校验jffs2分区的crc, 我们可以修改这个crc, 实现误改rootfs后的救砖操作.. c9 d5 C: P& h  \$ N- m
以下是解析:- o+ j2 n$ Y& d# s3 q4 X3 y2 ?# Y  T
4 }8 s- Z# B# O# q; ~6 ~$ j
kernel分区文件结构
: u& z. i) G) R( H8 e9 X这段是跳过坏块, 这个区块是可能有 也可能没有的, 不必在意1 f# u! M5 _! s  a: i3 W  K4 W
00000000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|# I- R3 l& S  }+ L6 S& G$ f
*, `: m4 v8 I) u
这段是分区的头结构体, 其中 前16字节的 99 44 55 aa 是magic head, 用来标识数据的开始, 只有识别到这个魔术码, 才会作为数据的开始$ m% x1 G2 t6 m. a4 A$ e
00020000  99 99 99 99 44 44 44 44  55 55 55 55 aa aa aa aa  |....DDDDUUUU....|
1 E; l0 r, e; W4 a- S8 ?00020010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|' f2 L: |0 ^3 P1 `) Z
从24字节开始的这一串是版本号字符串 再后面的数据暂时不明( L5 t4 d# I$ ^( z5 c
00020020  00 00 00 00 56 32 2e 30  2e 33 50 31 54 37 00 00  |....V2.0.3P1T7..|
+ S8 i* l, G7 ~+ F+ Q. l00020030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
' e; x4 I2 ~8 k00020040  01 00 00 00 00 00 1e 01  c0 fe 1d 01 40 01 00 00  |............@...|5 l* s& |2 a  q0 [# j6 u

4 B/ i- W% `8 q0 U0 X! ^. O2 G) ?# z% a& i% q$ q
这个3d 2d 17 cd是后面jffs2分区的crc, 修改jffs2分区要改此crc, uboot会给出计算出来的crc值, 按小端替换上去即可- A4 m! I: h( A1 H
00020050  3d 2d 17 cd 00 00 00 00  00 00 1e 01 00 00 00 00  |=-..............|
. {( `4 ~1 ]9 `$ ~( e1 D. m) v00020060  00 00 d0 01 00 00 28 01  00 00 00 00 00 00 00 00  |......(.........|
* H9 e  Y. Q0 u' `, u00020070  00 00 f8 02 00 00 28 01  00 00 00 00 00 00 00 00  |......(.........|
8 V1 g3 H5 T" i+ [$ R  S00020080  5a 58 48 4e 20 46 36 35  30 41 20 55 4e 49 20 56  |ZXHN F650A UNI V|5 I  L; S$ j6 ~: C1 y9 O) q, y" v
00020090  32 2e 30 2e 33 50 31 54  37 00 00 00 00 00 00 00  |2.0.3P1T7.......|& x# k+ \# M6 J/ j4 z3 U. F6 |
000200a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|' Y1 |; h3 v7 G8 _. K
如以下这段错误提示, 表示 jffs2 分区的真实crc是 0x9b9647af, 我们按小端序(af 47 96 9b)填入上述的位置即可# l- H" W* B& @2 g6 j
vmlinuz crc error 0x9b9647af& _5 C3 z$ {  J/ }( q% }% ~/ a
no version available, pls downver!
, F$ }) i5 _" k2 j, L1 n) c, F: w& `% w. @5 w" U
% \7 d, T4 C' v  }+ C
*
7 b: Q8 r  v  O# \6 L) t$ I! {1 @' A7 Z
( p- D7 I& R- Z9 |' Z. b
这段的6e 8d 53 f2是这个头结构体的crc, 后面会跟这个分区的生成时间(估计是), uboot会给出计算出来的crc值, 按小端替换上去即可9 P9 g* j: N- Y1 Y: B6 m
000200d0  00 00 00 00 00 00 00 00  00 00 00 00 01 00 00 00  |................|8 E  I* T' ~8 d3 h, V5 T
000200e0  6e 8d 53 f2 32 30 31 39  30 31 30 32 31 34 34 38  |n.S.201901021448|
3 q0 f7 Q% z* Y# N, K# h7 B000200f0  35 31 00 00 00 00 00 00  ff ff ff ff ff ff ff ff  |51..............|
# J; Z$ a  O8 U6 d8 s8 h5 W+ v00020100  00 00 00 08 ff ff 01 00  00 00 00 00 00 00 00 00  |................|
" `' E4 n& L1 G' I/ G& u00020110  08 01 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|6 A" K- {# J! X$ C' f
00020120  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|3 R+ Y+ I& D! V
如下错误提示, 代表这个头结构体的实际计算crc是0x55cf6dbd, 而实际读取到的是0x040e018a, 这里同样我们按小端序(bd 6d cf 55)填上即可
3 G! i8 D# k7 W$ ]" \header crc error 0x55cf6dbd,add=0x02f800007 m# x, G0 @" S; J5 w
,binheadercrc=0x040e018a- s& F5 N, _" r9 [8 ]
6 U  i- R' ^: J
3 k, `- s1 P& b0 c( N" g" O2 p) ~
*: F, o1 s3 N4 @! @# S, y

5 h( F& D( ~# L& }9 ~! x4 H* C5 \* r* `" I0 q- q( W: r3 K
这段是jffs2分区, 小端序, uboot检查crc后, 会读取下面的0uImage内核文件, 载入内存并启动
( K5 Y8 {3 ]% j- C/ ~00040000  85 19 01 e0 2f 00 00 00  b1 f9 44 f2 01 00 00 00  |..../.....D.....|
) j, D- Y/ `4 P, Z( M4 f+ m. W+ Q8 O  N00040010  00 00 00 00 02 00 00 00  c9 5e 2c 5c 07 08 00 00  |.........^,\....|% S3 m$ F4 N" h- G
00040020  a9 e5 16 81 66 e5 52 31  30 75 49 6d 61 67 65 ff  |....f.R10uImage.|" K' j% m2 o  k+ ~5 p
00040030  85 19 02 e0 b8 0a 00 00  d4 d7 d0 59 02 00 00 00  |...........Y....|! a5 A- o8 Q$ a, @
00040040  01 00 00 00 a4 81 00 00  00 00 00 00 94 08 3f 00  |..............?.|
+ K( L. H: Y; o# r1 ?; n00040050  c9 5e 2c 5c c9 5e 2c 5c  c9 5e 2c 5c 00 00 00 00  |.^,\.^,\.^,\....|
! i1 i2 ?. _6 ^2 O7 l4 H% ^00040060  74 0a 00 00 00 10 00 00  06 00 00 00 c5 a4 53 c6  |t.............S.|1 K6 F! y! [: Y$ X5 u
00040070  e8 6a 61 20 78 5e 74 57  0d 6c 1c d5 11 9e dd fb  |.ja x^tW.l......|
! X+ W  \- c) W! x0 l' H00040080  b3 0f db fb fc 93 38 b9  b8 f6 9a 80 ea 24 0e 2c  |......8......$.,|
0 W# h# D' g/ ^0 \00040090  38 4d 43 1b e2 0b 46 50  28 90 4b 6c 0c 04 0b 8e  |8MC...FP(.Kl....|( u# g+ b1 C0 @
000400a0  92 d0 44 a5 b1 cb 4f 85  5a 54 ce b1 9d c6 89 2f  |..D...O.ZT...../|
  l+ Z. ~. \9 D& E" U000400b0  be 24 0e b8 6e 5c 2f 50  d4 82 5a 61 5c 15 21 da  |.$..n\/P..Za\.!.|0 v1 z$ P8 L% k
9 D0 X  r# |& K+ ^) U
......2 }- A! U/ o7 R! R
2 o* h& ~& u/ C) s  u4 c6 _6 p3 _
如果大家只是想跳过uboot的crc检查, 立刻进入系统救砖, 有办法吗? 答案是肯定的
, }; l- I  z4 v& p9 y. x我们等待uboot提示crc错误之后, 可以输入命令:
: l! d7 p" C$ l. X% `* C: D% Bfsload 0uImage
7 E  X! w( Y" H! U9 m+ P$ N' b" j意思是载入jffs2分区的内核文件, uboot会加载到内存0x42000000上* d; D1 a! J: t  Q
然后, 我们可以输入
& d' c8 @% x2 D' ^% tbootm 0x42000000" j) O- r) b2 b: @) M8 M
即可应急启动到系统了
2 q4 ?& E- C0 |* A' p$ b这个方法的缺点是, 光猫的内核分区有两个, 即mtd9和mtd10, 我们并不能选择实际要启动到的内核分区
2 [$ D2 h! ?6 c5 ~, J楼主暂时也没找到载入特定分区的办法, 以上.2 O9 A4 j6 l- a% F  Z4 O+ {, c

* [7 W, p( |0 U( Y' V1 X% V! u! S扩展: ) K6 ~* \1 B& F0 U
那么, 我们能不能自己做内核分区呢? 楼主还没尝试, 理论上是可行的, 希望本文能给大家带来帮助
2 G& ^, I! l# u/ x$ Z9 C
发表于 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,之后就可以正常启动了。# A: ~* _/ l( j% F" ]9 G* Z
关于crc,小端在前,也就是说如果uboot提示的crc error是0x12345678,那么在位置0x40050或0x400E0处,应该填入78563412.

点评

感谢提醒  详情 回复 发表于 2022-5-10 16:46
发表于 2020-11-26 11:46:07 | 显示全部楼层
知道uboot是怎么计算出来的crc值的吗?
9 _7 ]& x9 K0 U( s* E这些CRC值分别是计算哪一段数据呢?

点评

很抱歉, 并没有分析使用的是哪种crc计算方式 计算的数据区已经说明了, 分别是jffs2分区和header结构体  详情 回复 发表于 2020-11-26 21:59
 楼主| 发表于 2020-11-26 21:59:10 | 显示全部楼层
本帖最后由 To.mato 于 2020-11-26 22:02 编辑 % v1 T( e* S0 R' k# M
haoboss 发表于 2020-11-26 11:46
8 _5 o" d+ k; n7 C知道uboot是怎么计算出来的crc值的吗?4 Z, X& g$ r8 F$ c& {/ m
这些CRC值分别是计算哪一段数据呢?
. d$ |# n+ P: l2 P5 ]  X8 n$ T- F
很抱歉, 并没有分析使用的是哪种crc计算方式, 可以直接把kernel这个mtd分区写入flash,直接在uboot上看它计算好的结果, flash是slc的, 不用担心写坏 :)
5 r) e6 u* S2 l, C6 Y8 G. R8 I$ m
3 {0 D7 q' z* k, d8 J$ K计算的数据区已经说明了, 分别是jffs2分区和header结构体
  n' e1 W4 ~7 E' x
发表于 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 | 显示全部楼层
分析的很透彻,高手!还不计较报酬,什么猫粮要多少,大洋要多少,这种共享精神值得大家学习!# w# p7 y- i/ ~3 q
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

粤公网安备 44152102000001号

GMT+8, 2024-4-26 19:38 , Processed in 0.028055 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

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