你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验之谈】基于用STM32固件IDA PRO + QEMU动态调试的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-11 15:29

知己知彼百战不殆,了解下敌人都是什么套路,有助于更好的保护自己的程序。
9 R, [4 t  ?" J  I/ q$ |, \3 g, L" o' m. y/ @6 c, r! x1 z( ^% Z
闲着没事调试下老毛子孔雀石SDR的固件,由于我没硬件只能用QEMU
& Z0 t$ c7 e$ N/ W8 k
( B1 p) F- V& U安装支持STM32的 xPack QEMU Arm2 ~3 y( \- R. @: Y  @6 V2 z
  x) I) u4 s, B4 s, x/ F8 }7 Q% o
打开IDA 的debugger菜单设置一下调试


0 r* ^# D% ~; M6 G& P. [0 v
2 J+ D5 k5 t/ f/ I* M
9 u' g( x0 }6 v/ ~: W+ s7 w' }3 n5 ^% m4 o
$ {9 z9 E# k! y, S" P

qemu 运行参数
9 m6 A' z1 @& n" `. w' w4 T. a& B$ K1 p, w. z5 ]: Z- B( U; k. y
"qemu-system-gnuarmeclipse" -machine STM32F429I-Discovery -s -S -kernel C:\311.bin
% |, @9 }% ]9 k8 I& R2 v0 k. c$ k# ]* [" y/ x2 R
: Y) f, x5 F. K, L% e7 o
设置本机IP; ]3 x! B4 m  t0 H, O# D/ F/ I
, x1 F8 `7 b$ `

) i2 @# }) N1 U8 s: g5 t5 w: |9 V9 x% i& B$ a! F$ [2 \2 H
运行可以连接了


" e) X9 O8 k7 k/ ?4 u$ o% ?
( {) i/ X) A$ c# p2 S" p
( ^5 a( H- O' L' v. \$ W& }& \通过比较新版和旧版固件很容易就找到了密码表地址0x80392d8: l! B9 g$ r- a; h; P- g- ~: e
0 c- g+ S, K' a1 E4 ?) q+ |

  g! H% B( e- t' `' z' [4 r- V+ }* V) q, K
找哪个程序调用了这个表,发现是一个校验程序
; |# R: }7 c4 g* [- p/ B1 u# \" v, l# M% N, I) Q1 F9 }. I
& b. d9 h0 q- |. o' W% a

* e+ d1 @/ ^$ \& ]5 R$ h向上找哪里调用的
" S4 i6 Z5 ~) Y& j2 @% X5 R3 x& s) d& }& ~$ _- b( _' N

9 c; `& ^$ r: L
' [+ x7 B3 m! F* j8 p( m- z1 ~: O: P  R  T

我们又找到了读STM32ID的程序,通过分析上面两个是生成校验数组的。


3 O  S- X3 h! b# G, s& F
  ~- ?- F0 U+ T: p3 d, K7 B2 F往下看sub_800DB54是原来的ID号生成密码的程序, g3 N' @- I1 O9 @' C; {; W
! r7 o( I, q3 h0 o# u' J' e
' A. N5 z" y: V( I! P

, \% R# ~! q! E7 E  s9 a下面一些是对生成密码简单移位的程序,但是有上百行,人工看比较麻烦,所以运行动态调试1 S1 m. v/ q; Y, S* h  O; u
/ y, f6 L3 j) }" W( ]+ f
5 i( [5 @. k8 u+ I9 R8 u
在0x800e270设个断点
% a. D0 ]- ~/ s) C0 _) J# |2 X( v/ Z+ v' m2 ^8 q+ Y; y: B
2 f7 O+ ?$ s6 d! P

1 r' x$ ^1 e1 m运行以前的算号器生成本机密码
. M) m! c& P1 ?4 g  n* r8 V3 {! T9 i
, C# U, f% M9 w, e: g( A7 b4 b" L7 M8 {2 m  I0 I. X
把IDA动态调试寄存器R6和R7改成 0XA52FF277和0XBC8FB9756 ^; c. i+ ~2 q
0X800E3CC设个断点,运行看结果
  h0 `, u; X' w7 K% |% P0 a% O# P- B& d$ O8 p5 c# z
' f# p8 A, k* |! Z, |# ^( b
运行
" l' q+ R2 R5 n
- x$ f5 U& P2 r. L' e. Z2 t
4 ?( `/ b. Y! B0 g! i9 [8 _; V结果R0和R1  0x75b98fbc 0x77f22fa5
1 ^- f$ s, J, y) p在下面函数里面设置个断点接着运行* H+ r( N& V0 s8 L$ A! P. }

, w- [$ f7 O- {' ~1 c, C# G/ Y- c' e, a9 n' ?" e% y
! j# m8 J/ s1 F- y2 s
这个不用调试肉眼就可以看出来,通过和密码表比较,密码表里面有就向R6+0x814地址写0XFA,没有就写0X58。
$ q' D, p/ E6 m1 C& V# b6 \5 W. b; g8 c7 Y; I  j* d$ M
到这里已经知道怎么和密码表比较了
* S* y) l8 h9 {- X" a+ F  s5 y
看固件BIN文件时候看到结尾有数据,这很不正常,看哪里调用看到两个对整个FLASH的校验程序


- ~% A  O4 y4 S6 P  l- |
* k, l" B. u4 l. E
# ~; L1 u3 U# F. T+ f5 F: ~  U; x6 r; U; S1 o; @( a6 w( y
% d7 `' h2 d; e$ E/ P
# T9 D" m. [8 k$ }

& i! z5 w/ B5 I4 m0 d由于QEMU不支持STM32H7所以没办法运行整个程序,要是有硬件插上JILINK很容易就能知道哪个程序校验整个固件,静态不容易看到哪里进行校验。& M' O7 s. E" f  c1 s0 L4 |
5 k8 p, x7 `- {
由于我没硬件没办法验证和调试,随便改改不知道能不能去掉保护。


7 v0 W! A: ~, n

0800DED4 由原来$ l( n/ U! A; s% u" \$ \
str r4, [r6, # 0x814]
" y0 M$ ^  ^& D- {( j- P改成; X+ k( h5 c' B
str r7, [r6, # 0x814]4 h$ Y; i. Z7 n+ O# A
0800DD66由原来  y% t/ \+ d2 z- g
str r0, [r3]  @7 ~, A% t$ Z$ F
改成
2 J* i8 T6 S" I4 s; @str r2, [r3]
: ^* R9 N( ?, h0800DC90和0800DC92由原来6 Y6 y" k$ {2 N
ldr r2, [r4]. L) l7 S5 l) I! R- Y/ I
cmp r2, r31 C7 p6 `) ]& i
改成
4 U1 {) e/ I! D* s+ ^str r3, [r4]
0 W: v+ s8 Z1 Rcmp r3, r3


+ u4 w# y$ u4 d" x7 i  c---------------------
  y' F) K& z# }/ k+ B% Z1 D9 U) M! ~+ P作者:yjmwxwx

8 Y* [- T- |% T! y. Q! l
收藏 评论0 发布时间:2022-12-11 15:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版