一个简单逆向stm32固件程序的实例分享

发布者:EtherealGlow最新更新时间:2023-08-09 来源: elecfans关键字:逆向  stm32  固件程序 手机看文章 扫描二维码
随时随地手机看文章

本文主要跟大家分享一个简单逆向stm32固件程序的实例,为了让大家在一款成熟的产品中去考虑加密这一块的技术,不然分分钟被别人copy!


1、情景再现

咬金,你们公司固件程序有加密处理吗 ?

额~,算了吧,我们公司的单片机程序炒鸡简单的,还加啥子密。

你这想法不对,假如产品卖得很好,如果没有任何加密措施,那岂不人家随便复制售卖。

没关系吧,反正他们没源码,应该也没那么容易复制吧

一点加密都没有,盗取还是比较简单的。

我才不信~~

那行,把你的板子给我,不用你的源码,跟你把波特率改了!

直接读取固件

这里以stm32单片机进行演示,如果MCU没有做flash读取或者熔断保护,则可以通过jlink等烧写工具直接读取其Flash上的固件,操作如下:

01

打开J-Flash软件并选择创建一个新的工程,并点击Start J-Flash : 

141a4494-b06d-11ed-bfe3-dac502259ad0.png

02

选择所对应的芯片类型,并点击连接芯片,并显示连接成功。

1434dbec-b06d-11ed-bfe3-dac502259ad0.png

1448ca8a-b06d-11ed-bfe3-dac502259ad0.png

03

通过下面的选项路径,即可读取所选Flash区域或者所有Flash区域(Entire Chip)。

145d89c0-b06d-11ed-bfe3-dac502259ad0.png

04

这样便获得了Flash上所有的固件数据,也就是我们的bin文件内容,当然这也就是逆向的最重要素材。

1485514e-b06d-11ed-bfe3-dac502259ad0.png

14995b58-b06d-11ed-bfe3-dac502259ad0.png

05

最后把数据保存为bin文件、hex文件等等即可,当然当你换一块芯片然后烧录该程序也是可以运行的。

14abf894-b06d-11ed-bfe3-dac502259ad0.png

14c1d0b0-b06d-11ed-bfe3-dac502259ad0.png

2

逆向固件程序

一谈到逆向,估计各位小伙伴会联想到各种黑客、破译、非法等等情景,然而并非如此,世间万事万物都是双刃的。

就像开一把锁,当你学习了各种破解锁的技巧,如果使用这些技巧来盗窃,当然属于违法行为;但是当用来帮助破解犯罪现场,收集证据等等那这就大有作为的,当然本文旨在学习。

目前嵌入式行业比较流行的逆向工程技术有PCB抄板和芯片解密

PCB抄板一般都会使用到相关的工具和电气测试等等,最终获得原电路板的原理图、BOM等等实现PCB的完整复制。

芯片解密一般是通过相应的技术把执行程序(一般为机器码)反汇编成汇编代码,还可以更进一步反编译成高级语言伪代码(比如C代码),便于逆向人员理解和修改。

1

前期准备

在上一小节中我们轻松获得了芯片中的bin文件等,当然如果芯片有加密处理过,可能就需要更加先进的技术获取芯片的内部数据,这里就暂时不展开了,可以参考下面两篇文章 :

【整理】一文带你了解"单片机解密"技术

【MCU】用stm32的UID给固件加密(重点在加密)

今天我们主要是把前面获取的bin文件逆向一下,并把原来的波特率9600修改为57600,原来9600效果如下:

14d53bf0-b06d-11ed-bfe3-dac502259ad0.png

2

逆向过程

逆向技术发展其实挺长一段时间了,当然为了方便各逆向爱好者的使用也诞生了非常多的开发工具,其中IDA Pro算是非常流行的逆向工具,所以这里就选用该工具进行逆向。

01

首先安装IDA Pro逆向工具,网上搜索一下会有各种资源,然后点击安装,一路next基本上可以安装好,安装好以后便出现如下两个头像。

14e6bf1a-b06d-11ed-bfe3-dac502259ad0.png

这里选择32bit版本,并创建工程:

1506235a-b06d-11ed-bfe3-dac502259ad0.png

02

这里选择上小节导出的bin文件,由于所使用的芯片为cortex-M3内核,这里选择ARM Little-endian模式:

1516da42-b06d-11ed-bfe3-dac502259ad0.png

03

设置内核架构,这里可以通过查阅对应的内核介绍进行选择。

15272834-b06d-11ed-bfe3-dac502259ad0.png

04

然后设置bin文件对应的地址映射,由于bin文件是通过整片全部读出,所以这里与该芯片的Flash起始地址和大小是一致的。

153d4466-b06d-11ed-bfe3-dac502259ad0.png

05

很轻松便进入了IDA的反汇编代码,这样就完成了从机器码到汇编码的逆向过程。

1550fba0-b06d-11ed-bfe3-dac502259ad0.png

同时你还可以通过IDA的图形调用试图来看到各种调用关系等。

155fdd46-b06d-11ed-bfe3-dac502259ad0.png

06

然后我们随便找一个函数并使用F5,生成C伪代码。

157193ce-b06d-11ed-bfe3-dac502259ad0.png

然后你再看看C源程序,惊人的相似!!

1588abb8-b06d-11ed-bfe3-dac502259ad0.png

07

假如闲9600的波特率太慢,却又苦于没有源代码修改烧录,于是便可以逆向修改bin文件进行烧录。

当然如果你对机器码和汇编非常的熟悉,只需要找到对应的机器码进行修改即可,然而找到对应的机器码还是通过IDA工具来得比较直接且方便。

同时可以在反汇编view中使用C和D来进行机器码和汇编的转化:

如下通过使用D可以把汇编转化为机器码:

159e28d0-b06d-11ed-bfe3-dac502259ad0.png

这里按下D,即可转化为如下机器码 :

15aab938-b06d-11ed-bfe3-dac502259ad0.png

同时切到Hex视图,也可找到对应的机器码:

15bb0ef0-b06d-11ed-bfe3-dac502259ad0.png

08

以上便找到了修改的位置,仅仅只需要把该机器码中的9600修改为57600即可,我们可以通过查找内核的指令集进行机器码的编写,并进行如下更改:

15cd20cc-b06d-11ed-bfe3-dac502259ad0.png

同样,其对应的汇编视图也发生了如下变化:

15df5b70-b06d-11ed-bfe3-dac502259ad0.png

然后点击如下图所示菜单选项,从而把相应的修改更新到对应的bin文件中。

15efe80a-b06d-11ed-bfe3-dac502259ad0.png

09

最后,当然是把修改以后的bin文件烧录到单片机中进行测试,测试结果如下图所示 :

16110dc8-b06d-11ed-bfe3-dac502259ad0.png

波特率成功被修改为57600,整个过程到此结束,enjoy!!

 

咬金,你看不加密,程序几乎是完全暴露的!

小鲁班,你怎么变这么优秀了?那以后我得好好考虑这块了!

 

 

2、结束语

本文主要跟大家介绍了如何逆向一个MCU程序,当然还有很多高级的技巧有待挖掘,特别是IDA工具更是一款神器!上面bug菌也只是抛砖引玉,有感兴趣的小伙伴可以多多交流!


关键字:逆向  stm32  固件程序 引用地址:一个简单逆向stm32固件程序的实例分享

上一篇:STM32F4的复位序列对比STM32F7的复位序列
下一篇:STM32入门学习笔记之基础定时器实验(上)

推荐阅读最新更新时间:2024-11-17 01:37

stm32驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
步进电机的简单使用 接线: TB6600驱动盒的详细说明: 程序设计: 工程文件: 做毕业设计要用到57步进电机,所以花了两天时间做了一下电机函数 从淘宝查的资料: 接线如图: 接线: DIR- && PUL- 接 单片机GND DIR+ 接 PA1 PUL+ 接 PA0 驱动盒TB6600 VCC 24V 驱动盒TB6600 GND 24V的GND 我测出来的 A组(绿+蓝- ) B组(黄+红-) 如何确定AB两组看这个: 关于42步进电机驱动——基于STM32 HAL库实现 接线方法 TB6600驱动盒的详细说明: 先冲英说明: Microstep Driver 微步驱动程序 Microstep 微步
[单片机]
<font color='red'>stm32</font>驱动TB6600控制42/57步进电机的案例(TIM中断和PWM实验)
STM32单片机-汇编指令2
目录: 11、STMFD和LDMFD指令 1)STMFD SP! ,{R0-R7,LR} 2)LDMFD SP! ,{R0-R7,LR} 99、伪指令 1)PROC伪指令 2)EXPORT伪指令 3)IMPORT伪指令 4)DCD与DCDU伪指令 5)ALIGN伪指令 6)AREA伪指令 7)SPACE和DCD伪指令的区别 8)ENTRY伪指令 ----------------------------------------- 说明: STM32单片机-汇编指令使用1 STM32单片机-汇编指令使用2 ------------------------------
[单片机]
<font color='red'>STM32</font>单片机-汇编指令2
STM32单片机-低功耗设置
STM32F103R8和RC的停机模式的休眠电流还不一样,R8停机模式实测为11uA,RC停机模式实测为30uA,还以为又是我的程序哪里没做好呢,仔细看了PDF,这两个芯片PDF上标的值的确有区别,和我测的值差不多,那我就没有再深究的意义了! 结合下文的高手经验,反复摸索, standby模式1.9uA,PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); stop模式:11uA, PWR_EnterSTANDBYMode(); 实验证明,将IO端口设成IPU/IPD/AIN/PPOUT=1/PPOUT=0/ODOUT=0,电流是基本
[单片机]
<font color='red'>STM32</font>单片机-低功耗设置
STM32一个定时器输出不同频率
1个定时器输出4路频率相同,占空比不同的PWM比较容易实现,只需要改变每个通道的比较值就可以了 要想输出频率不同,占空比相同,需要用到比较模式,当比较成功IO翻转。 同时还需要用到定时器中断去重新设置比较值。 稍微解释下面语句: Period是计数值 prescaler是对总线时钟的分频 这个函数是设置比较值 基本要点是理解上面这些。没接触过定时器的会比较抽象,不能理解。 下面直接上代码吧 定时器初始化: u16 capture = 0; vu16 CCR1_Val = 32768; vu16 CCR2_Val = 16384; vu16 CCR3_Val = 8192; vu16 CCR4
[单片机]
<font color='red'>STM32</font>一个定时器输出不同频率
快速推进电源解决方案开发过程,STM32数字电源生态系统问市
意法半导体推出了基于网站的数字电源开发生态系统,帮助设计人员用STM32微控制器(MCU)开发数字电源解决方案。 数字电源是能够优化能源效率并通过捕获丰富的数据来实现诊断和安全保护功能的新一类设备,设计人员可以通过数字控制提高功率密度,缩减产品尺寸,降低重量,这对于数据中心、5G基础设施、智能照明和移动设备至关重要。 STM32 D-Power网站 整合了开发数字电源所需的全部资源,包括STM32 Discovery Kit多合一数字电源开发套件、嵌入式软件组件、ST授权合作伙伴Biricha Digital开发的软件工具,演示各种设计和功率值的专用电源板,以及适合从初学者到专业电源设计人员的各种水平开发者的技术文档、视频
[单片机]
快速推进电源解决方案开发过程,<font color='red'>STM32</font>数字电源生态系统问市
Stm32的TFT LCD显示器控制学习笔记
学习stm32,TFT LCD显示屏控制是很重要的一章,本人在初步学习STM32遇到了很多困难,所以把学习中积累的部分感觉重要的知识点罗列出来。目前常用的TFT液晶内部驱动芯片是ILI9320,ILI9325系列,内部原理基本一致,我用的是ILI9320。用stm32驱动液晶,实际上就是驱动ILI9320芯片。点亮TFT LCD的具体步骤有: (1)stm32与ILI9320芯片管脚的初始化。 void LCD_Init(void); /*初始化LCD,也就是初始化LCD控制器ILI9320芯片与stm32控制器的管脚连接配置*/其中包括CS:TFTLCD片选信号,WR:向TFTLCD写入信号,RD:从TFTLCD读取信号,DB(
[单片机]
keil ,stm32 用ulink2 连接和查看变量的设置
打开一个例程,设置好芯片型号。 设置debug选项,点击setting,继续设置。详细设置可参考《ULINK2_用户指南_中文_使用说明.pdf》。 用Ulink2时,有时候keil提示 no Jlink found ,可以在utilities 里设置默认的flash下载器,并在setting里设置flash芯片型号。若仍旧连不上,重插Ulink2试试。 调试时,看到某变量值为'????' 尝试一下方法: 修改 debug里的setting中的download to Flash ,不要选中。如下图 看下编译器的优化等级,设置为0。等级较高会优化无用的中间变量。
[单片机]
keil ,<font color='red'>stm32</font> 用ulink2 连接和查看变量的设置
采用STM32的远程温控系统设计
   温度控制是工业控制的主要对象之一,常用的温控数学模型是一阶惯性加上纯滞后环节,但其随着加热对象和环境条件的不同,会存在着较大的差异。因为温控对象这种较为普遍的含有纯滞后环节的特点,容易引起系统超调和持续的振荡,温度控制对象的参数会发生幅度较大的变化。因此无法采用传统的控制方法(如常规的PID控制)对温度进行有效的控制,而智能控制不需要对象的精确数学模型就可以对系统实施控制 。温度控制多采用由单片机系统来实现温度控制,其缺点是远程控制系统复杂,可靠性差,特别是当控制点较多、距离较远时,采取总线方式的通讯出错概率较高,影响到温度的控制精度 。   目前,多家厂商(如日本导电、岛通)均推出精度可达0.1级的基于PID算法的智
[单片机]
采用<font color='red'>STM32</font>的远程温控系统设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved