知己知彼百战不殆,了解下敌人都是什么套路,有助于更好的保护自己的程序。/ Z% f v5 c: d
" Y9 }; z. R0 s" D( `闲着没事调试下老毛子孔雀石SDR的固件,由于我没硬件只能用QEMU4 G$ L) S+ M$ K6 B' V% g( g
6 V4 T2 k# W* n- Q3 B K! m; T2 S安装支持STM32的 xPack QEMU Arm, V9 U( U, i% K- G, h2 n
0 @% H- }$ E. D1 ~% i打开IDA 的debugger菜单设置一下调试
. ~) ?- b$ b: ]6 D8 D* \
. Y/ V" k5 H" X# u' q! f$ Z1 X
: D- Y8 h; l( ]8 x
% e- r* h: O: U* U9 `- r8 o, d1 u% @2 x6 ?; @4 L4 C
qemu 运行参数& W" k7 A t. C/ Z6 c; a
( O7 F* z s0 |% v' A, c"qemu-system-gnuarmeclipse" -machine STM32F429I-Discovery -s -S -kernel C:\311.bin
! j7 ]: N7 W) E* _8 Q) c0 d/ U
7 l2 ]3 ^0 u3 d! G2 F! S$ o& W- H* |% U# J1 r8 F4 q& J
设置本机IP7 A0 y- R5 D4 M4 C ^3 R* s: [4 r4 h
$ z4 ?$ A6 k2 x+ `0 Z3 L
" k) p: m, v- E# b
' ?9 p" ~) L9 P( \运行可以连接了
" d% \ E- U$ K
! T, N7 [" _/ m" o& o! y3 E
# u, h, v+ p& S0 q7 _6 ?* U通过比较新版和旧版固件很容易就找到了密码表地址0x80392d8; K: o: Y* c% ~7 U# \; f
7 t' P( L9 l: Z# j
2 U- G0 ^$ n# S* }( H
0 l- \6 P; g' h* X' f! k6 }& X
找哪个程序调用了这个表,发现是一个校验程序
: M' k6 l% Y. C5 P3 S( F( j$ }1 l2 h+ }6 ]( B# ~
5 T" N( }; k* _- l( ^/ o9 S/ a' Z8 G# }
向上找哪里调用的2 ~/ n- ], Q# k$ s" }
$ g! z0 v; `, F
; b6 v8 V* A) C3 M( @
; g* w# h$ S9 B& S. I* g1 T: g q( M$ J7 |' G
我们又找到了读STM32ID的程序,通过分析上面两个是生成校验数组的。 : y5 c: ^/ ]* e8 L
/ k" G* D4 @# |# t往下看sub_800DB54是原来的ID号生成密码的程序
8 T8 F" v: n2 z( Y
# W$ s8 R: w7 B) ` m: {8 b
4 O2 K9 f4 v& H' `
. U/ J! T( J$ R2 A, W下面一些是对生成密码简单移位的程序,但是有上百行,人工看比较麻烦,所以运行动态调试
4 a' v2 H1 Z7 Q1 k4 U! S9 x+ W: o# t) ^' ?* S, K+ ^: T
, `/ }# k9 _7 G' W t在0x800e270设个断点
" O. p3 W* M0 w+ f: w- ~
" `) \% d, T. k: e# K: P; h: P. V4 b0 O% c/ |# [. e% }- E# j) e* O
9 ~( t0 G4 i$ v3 R U4 q8 B
运行以前的算号器生成本机密码
! g. e8 u7 O3 a; D: r' C$ v. p7 A% F% G5 Q
^: _( o& V7 [- i0 B5 P- d4 r把IDA动态调试寄存器R6和R7改成 0XA52FF277和0XBC8FB975
, F; h1 t: I8 e1 F R# u0X800E3CC设个断点,运行看结果& _/ G/ j1 E. V6 T% B% L3 ~
% c8 [% ^) D) m" o5 W
8 d$ m2 H8 N! o2 t/ d8 c
运行6 | C1 E; O9 E4 W; v2 c
+ c8 R/ f& |! v5 Q/ B* |/ T; G1 S) C8 J% `8 K9 K. p# ]
结果R0和R1 0x75b98fbc 0x77f22fa5
( q5 l: j+ }2 Z/ V: g8 n5 P在下面函数里面设置个断点接着运行5 b* w( i3 [% A3 l9 S
! }$ l, y/ t1 E" W. f4 @, e
3 D5 o; J0 i; E4 l+ Q( e
: m0 L, ^5 [# h$ U0 s6 k: Y t这个不用调试肉眼就可以看出来,通过和密码表比较,密码表里面有就向R6+0x814地址写0XFA,没有就写0X58。% I9 W3 n1 u- |3 p) m' U5 L
1 R; h6 M `- W5 _) u! M
到这里已经知道怎么和密码表比较了" u; R1 M6 x+ Y
6 H+ e$ P0 R$ \. r4 y9 S
看固件BIN文件时候看到结尾有数据,这很不正常,看哪里调用看到两个对整个FLASH的校验程序 " z6 G3 g" y) ^3 L4 U. b+ e& k
2 f; m/ S9 {9 T, C) |8 z
- Q+ l2 D# m( y3 E* }
- S+ o5 u+ x: V
# k) m2 o/ Z5 x
( {/ m* `7 ]/ ~. W# t
9 ^; x; P, K9 {' N5 B由于QEMU不支持STM32H7所以没办法运行整个程序,要是有硬件插上JILINK很容易就能知道哪个程序校验整个固件,静态不容易看到哪里进行校验。9 C9 s8 Y# s& ~, N
$ @# t I' b% D5 ?' M6 z* b8 A2 w
由于我没硬件没办法验证和调试,随便改改不知道能不能去掉保护。
0 T- K4 J; J6 Y4 G* I& w7 h0800DED4 由原来! Y5 F s. c% E5 ^% U7 J6 i J4 Y
str r4, [r6, # 0x814]
2 L$ p& a/ _2 o- _9 b! y. c# _改成
! H7 V: g* U) I, a C$ h9 b% cstr r7, [r6, # 0x814]) V2 M6 }4 d5 n5 I5 q3 _, \
0800DD66由原来
& L) Q9 f/ A" T; ostr r0, [r3]
5 [1 g$ b: ^) M+ A改成9 l3 P/ s5 r+ m7 S h3 P6 w7 ?! S$ j
str r2, [r3]
" R+ U+ c, b" G6 A7 P( D0800DC90和0800DC92由原来 m# \& u2 Q) Y4 |, y! k f& _
ldr r2, [r4]$ x. \7 s' ]0 f# q
cmp r2, r3
+ z) w' b: _+ N; @, r" Z改成
, _/ b2 J1 G1 Y9 S Tstr r3, [r4]
" y7 ~! |) @6 X6 [cmp r3, r3
7 c% |' k4 W: x, }+ ~+ a$ Z---------------------
* _6 G+ P& G2 ^9 U作者:yjmwxwx
& s$ f( X( ^+ } n/ o- G0 K1 p9 F$ O |