|
知己知彼百战不殆,了解下敌人都是什么套路,有助于更好的保护自己的程序。
* ~' X" L8 H6 d, j7 y& K0 H3 b, J) y" \3 F& q3 H) A$ ^
闲着没事调试下老毛子孔雀石SDR的固件,由于我没硬件只能用QEMU
& f: S4 K. a( C1 }0 ^$ O
4 j6 C3 {& }% W- ^安装支持STM32的 xPack QEMU Arm
6 r3 e9 n+ n6 f/ r0 w a( E" w1 r8 W: Q3 h
打开IDA 的debugger菜单设置一下调试 % b9 P, g; K# i; |2 V6 R$ y! z

0 p' j/ z$ q3 u" d* H0 S- L: R$ d0 E6 z! c" I1 t8 U

, L6 `% ]) x# p7 D% h. u: z* Y0 v c" m
qemu 运行参数
* g& o5 h9 z2 d7 J7 h# D) A5 ?1 S9 v. w7 \4 O$ Y
"qemu-system-gnuarmeclipse" -machine STM32F429I-Discovery -s -S -kernel C:\311.bin0 q7 v9 F; F2 n
J$ f: T$ c% \( y# i7 k' C- y- \
! h$ f. E( D1 P% P' ` n! {
设置本机IP5 P3 U6 B1 Q5 i7 P/ u: a% Z5 H" I
2 n; Z. K4 W$ h5 ~2 x# r& G ! a" p% _; p0 j
7 x6 r+ \: }5 v7 B( }$ _6 F
运行可以连接了 , N! s! H3 k- c9 y" s
% o- Z h- G" h6 v! ?+ e
1 B3 d3 R9 ]( y1 f, y6 r
通过比较新版和旧版固件很容易就找到了密码表地址0x80392d8! Q9 A1 {( B9 _
! I! U3 w% d* ~+ g' v# Y+ a

+ W8 Z$ ~* d; t( r' c5 u; \0 z7 K5 T
找哪个程序调用了这个表,发现是一个校验程序
6 x/ H, f m% o! o" l! o" |4 _2 @' ^) i1 f0 h1 F

; X: s3 P0 O& s1 y/ }
" o0 ~3 J3 S/ @9 z# ], z* D向上找哪里调用的+ \9 O2 V, ~9 F( r
1 Q& H" l' r; T R

2 @" H3 M! T0 _. z% e, M* l
# D# B7 P+ u I$ }8 ~: \6 {+ f, m& w9 J% @( a
我们又找到了读STM32ID的程序,通过分析上面两个是生成校验数组的。 9 T: d. K! p- }: Y
: J# m/ }% W$ @, R- F
往下看sub_800DB54是原来的ID号生成密码的程序
; u4 H h- ]* E: i7 c( @
8 b7 k! g+ \1 C$ S y4 u6 D ( E- f5 b; I% i" `
2 w% c9 N& s0 O' U" {, v( U下面一些是对生成密码简单移位的程序,但是有上百行,人工看比较麻烦,所以运行动态调试4 Z" k- z- s. h' I r+ N
. X) O" c, p: ~6 a# I6 d& {: V5 F
5 I0 o4 W3 w- A r) o C2 Q在0x800e270设个断点2 J; s+ d' Y2 u; O1 F
+ y$ V u: s6 O$ C+ d
, Y( _5 O8 R D8 \# J7 W6 v4 `# E& i( E9 `$ r+ Y+ I
运行以前的算号器生成本机密码 }" o! Z3 {2 {, a

; H8 i& b/ }8 O" i0 D: k& O" v# v' O5 q( o( L% {7 W* A* Z
把IDA动态调试寄存器R6和R7改成 0XA52FF277和0XBC8FB975" Z; m: S8 j: Z
0X800E3CC设个断点,运行看结果2 c* G b( D f2 I+ R

, K# L( L& ~ Z0 U2 q- J# J, X1 f5 S# e6 n
运行& q& H& B6 x* r% P0 v

9 K- s- b* u3 v; k& g$ E' m# g7 h$ R9 c
结果R0和R1 0x75b98fbc 0x77f22fa5
; {3 N. y9 R1 k7 _, S7 f在下面函数里面设置个断点接着运行
( a; J& w9 n2 T0 y6 a
9 ]( U' K% a$ N! ?8 l9 v
6 `1 x2 B! J; ^5 b! n5 ]
1 c. G6 C, ` p6 X这个不用调试肉眼就可以看出来,通过和密码表比较,密码表里面有就向R6+0x814地址写0XFA,没有就写0X58。
/ t' g3 F0 w! g5 O8 W
) u- M3 d2 p# G, q到这里已经知道怎么和密码表比较了
% s* w2 X& P, K+ B5 B# m+ B' ?- k( L2 u5 P$ r; O! ]
看固件BIN文件时候看到结尾有数据,这很不正常,看哪里调用看到两个对整个FLASH的校验程序

0 N9 y% U) P/ J/ P: _" }, T+ P
& B+ C. E4 M. Z# H# S& P/ m0 ~. ] . ]. f! C' K$ p. k% K: R. e. S6 s
2 H/ ^/ h" X5 x& p& V8 d! f
3 s. p* w; P7 f; B; |/ N& R' H8 h; z" L! C
2 C& G2 o _ {) t6 V- R
由于QEMU不支持STM32H7所以没办法运行整个程序,要是有硬件插上JILINK很容易就能知道哪个程序校验整个固件,静态不容易看到哪里进行校验。
- ?4 l; p- D1 Z$ p$ l/ q9 I# F+ P) T( _, W' i
由于我没硬件没办法验证和调试,随便改改不知道能不能去掉保护。
% w- V; n5 O& m6 Z$ s% S, c) [$ y0800DED4 由原来7 N% @3 ?: y/ `5 B' W6 @" c7 x) i! G
str r4, [r6, # 0x814]; B# {8 ?& Q* q& _0 n6 H# H
改成
9 q& Q3 q' o2 a- h6 T1 Y$ pstr r7, [r6, # 0x814]
6 q& V/ Y, U+ J/ B% |, ^0800DD66由原来, j3 f" Y3 a6 t0 R) N) z
str r0, [r3]
2 w) J" T/ H& E5 O' y改成5 ^ l7 R! U9 {% h5 B! w6 _ z
str r2, [r3]8 |" c6 |# f- _- d7 [/ i4 X6 n
0800DC90和0800DC92由原来
' i! X1 Q [ \+ J6 l* @ldr r2, [r4]# C! P& `7 V E& m% R$ D; \
cmp r2, r3
V! f6 h1 H M改成' [/ ?3 ]( r6 A3 H) e/ d
str r3, [r4]+ }" e4 p2 H5 x8 r5 D. z
cmp r3, r3
4 W6 t4 e! V/ c! n7 s---------------------
# i7 E V% I3 K作者:yjmwxwx 6 K5 k l& M# M
|