[其他ST产品] 【经验之谈】基于用STM32固件IDA PRO + QEMU动态调试的经验分享

[复制链接]
1521|12
 楼主| duo点 发表于 2022-12-12 10:29 | 显示全部楼层 |阅读模式

知己知彼百战不殆,了解下敌人都是什么套路,有助于更好的保护自己的程序。

闲着没事调试下老毛子孔雀石SDR的固件,由于我没硬件只能用QEMU

安装支持STM32的 xPack QEMU Arm

打开IDA 的debugger菜单设置一下调试


511d36481f814c42aa8f28386760687f.png

9a3e3ac9bd26405792512e7378018d69.png


 楼主| duo点 发表于 2022-12-12 10:30 | 显示全部楼层

qemu 运行参数

"qemu-system-gnuarmeclipse" -machine STM32F429I-Discovery -s -S -kernel C:\311.bin


设置本机IP

7b6d8694cc36473eb8d55e6e331cdb8a.png

运行可以连接了


3317ecb8bf2e4b609a07607b22e35994.png


 楼主| duo点 发表于 2022-12-12 10:31 | 显示全部楼层
通过比较新版和旧版固件很容易就找到了密码表地址0x80392d8

55c9b4c1db0841deb6912a26bcab43e5.png

找哪个程序调用了这个表,发现是一个校验程序

fb87406f831b410daa486789d77a0d0e.png

向上找哪里调用的

de4caabce4e140c185cdde7c7d68d202.png
 楼主| duo点 发表于 2022-12-12 10:33 | 显示全部楼层

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

6237b605bb924b0db1f9ca19bc85aad7.png

往下看sub_800DB54是原来的ID号生成密码的程序

57ec6e23dc524087854be48a9b3a7fe7.png

下面一些是对生成密码简单移位的程序,但是有上百行,人工看比较麻烦,所以运行动态调试
760e2211b1c34c79b7ded9a913b71530.png

在0x800e270设个断点

0ee1247e7c274249920ba006ebf6522d.png


 楼主| duo点 发表于 2022-12-12 10:36 | 显示全部楼层
运行以前的算号器生成本机密码
cb4f4779792a4137bab441b9b05c8d03.png

把IDA动态调试寄存器R6和R7改成 0XA52FF277和0XBC8FB975
0X800E3CC设个断点,运行看结果
f58b164ab0a4493a923d9f534ba85144.png

运行
ed7d22fca84443ef93b3d48c672b110a.png

结果R0和R1  0x75b98fbc 0x77f22fa5
在下面函数里面设置个断点接着运行

a21571e4b0ad491d89e44fdbcf8b8d8e.png

这个不用调试肉眼就可以看出来,通过和密码表比较,密码表里面有就向R6+0x814地址写0XFA,没有就写0X58。

到这里已经知道怎么和密码表比较了
 楼主| duo点 发表于 2022-12-12 10:37 | 显示全部楼层

看固件BIN文件时候看到结尾有数据,这很不正常,看哪里调用看到两个对整个FLASH的校验程序

431e53cbd20d44a0ac3d6a1d90878bda.png

ce74bb8876524669a881aac6b12dc442.png

e406030313724e03938d555b080be7c1.png


由于QEMU不支持STM32H7所以没办法运行整个程序,要是有硬件插上JILINK很容易就能知道哪个程序校验整个固件,静态不容易看到哪里进行校验。

由于我没硬件没办法验证和调试,随便改改不知道能不能去掉保护。


0800DED4 由原来
str r4, [r6, # 0x814]
改成
str r7, [r6, # 0x814]
0800DD66由原来
str r0, [r3]
改成
str r2, [r3]
0800DC90和0800DC92由原来
ldr r2, [r4]
cmp r2, r3
改成
str r3, [r4]
cmp r3, r3




Pretext 发表于 2022-12-12 13:58 | 显示全部楼层
QEMU能反映出硬件真实的状态?
家有两宝呀 发表于 2024-7-31 23:58 | 显示全部楼层
需要输入 qemu-system-arm --version 来确认 QEMU 是否安装成功吗?
家有两宝呀 发表于 2024-7-31 23:58 | 显示全部楼层
可以使用设置断点、单步执行、查看寄存器等进行动态调试。
为你转身 发表于 2024-8-31 13:21 | 显示全部楼层
使用 QEMU 和 IDA 进行 STM32 固件的调试是一个有效的方式,特别是在没有实际硬件的情况下。
为你转身 发表于 2024-8-31 13:21 | 显示全部楼层
从可用的调试器列表中选择 Remote GDB Debugger 或 Custom Debugger 进行配置。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

548

主题

2406

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部