首页
社区
课程
招聘
[原创]IOT基础设备及固件提取分析
发表于: 2022-4-13 23:33 33513

[原创]IOT基础设备及固件提取分析

2022-4-13 23:33
33513

图片描述
47件套装,适配类型多,可拆多种类型的设备。


万用表用来主要用来分析电路结构,识别调试接口。
使用较多的功能是连通性测试,一般用来找 GND。GND 找到之后就可调到电压档,识别出 VCC。

图片描述
使用测试夹直接夹在芯片上进行测试,如提取固件、动态调试、监听通信内容。

CMSIS-DAP
图片描述
CMSIS DAP是ARM官方推出的开源仿真器,支持所有的Cortex-A/R/M器件,支持JTAG/SWD接口。


爱修 RT809H 是维修界应用最广的一款编程器。支持读取众多型号的 SPI/NOR/NAND/EMMC Flash,用于提取和烧录固件。

拿到一个固件设备,就不可避免的要对硬件进行侵入式的操作,比如取下flash芯片进行固件的读取,或者flash集成在MCU芯片中时需要进行剖片处理,或者利用其他漏洞来获取固件。那么最终能够拿到固件,其中的过程是怎么样的呢?以剖片完成后为例,下面就简单来介绍一下。

以意法半导体(ST)公司出品的一款芯片为例,做拆解介绍,为什么需要对此芯片进行拆解,因为剖片处理后需要更换新的芯片做测试,会把剖片后的程序进行提取,在新的芯片上进行烧录,测试判断是否抛片成功,型号为STM32F103RC,通过搜索引擎就可以找到网上公开的芯片手册。拆解方法分为两种,一种是直接使用焊络铁进行锡的去除,另一种就是使用热风枪,常规的都是使用热风枪,对着芯片周围进行加热,大概来回加热两分钟,等锡融掉后使用镊子夹起芯片,注意,热风枪针对普通板时,温度不宜过高,过高会导致芯片底盘脱落或者导致元器件损坏,300多度左右差不多,针对比较厚的板子,散热较快的,那么就可以调到400多度。
通过查看芯片手册,就会发现这块板子上的flash是集成在MCU中,另外要说明的是固件存放的位置一般分为两种,一种是集成在MCU中,另外一种是单独放在一块芯片上。
这块芯片的flash就是存在MCU中,如下图所示

络铁头上沾着锡,也在焊盘上稍微镀一些锡之后,顺着引脚的方向向外侧拉动烙铁,带出一些锡。将芯片合适的覆盖在焊盘上,对齐。用烙铁加热引脚,使得芯片与焊盘结合。用烙铁滑动每个引脚。对于引脚上多余的锡,可以使用助焊剂,助焊剂的密度是小于锡的密度的,它能均匀地在被焊金属表面铺展,呈薄膜状覆盖在锡和被焊金属表面,有效地隔绝空气,促进焊料对母材的润湿(注意,助焊剂会使用的很频繁),上锡的步骤是繁琐的,如果检查出虚焊或者引脚间有粘连,还得返工,所以焊接时得细心。
沿着引脚从上至下进行焊接,其他三个方向为同样的操作。

最后焊接好之后,使用放大镜查看是否存在虚焊或引脚之间是否存在黏连。
这里经费有限,无法用显微镜查看,但是也可以通过32倍放大镜查看,观察后没问题就可以通过串口进行调试了。

之前有提到flash存放的位置有两种,编程器就是针对单独存放固件的芯片
某一款存在外设flash的架构图

可以看到内部并没有flash部分,只有内存、内存数据、和一个boot启动程序。下面使用了连接外部 Flash的QSPI协议。

1、将被烧写的芯片按照正确的方向插入烧写卡座(芯片缺口对卡座的扳手)。
2、将配套的电缆分别插入计算机的串口与编程器的通信口。
3、打开编程器的电源(电源为12V),此时中间的电源发光管指示灯亮,表示电源正常。
4、运行编程器软件,这时程序会自动监测通信端口和芯片的类型,直接读取bin文件

观察PCB板可以看到存在留出的接口。
结合芯片手册可用万用表测出各个孔的作用。

检测后得出,分别是电源、接地、输入输出口、时钟,最后则是reset复位引脚

与CMSIS-DAP对应引脚相连接配合keil5进行动态调试

打开keil5 IDE 新建一个工程,选择对应的芯片型号,选择目标选项

选择output,在选择需要调试的目录和文件名(后缀也得加上)
图片描述
选择debug调试→CMSIS-DAP Debugger

最后ctrl+F5运行
图片描述

通过搜索STM32F103RC芯片手册,找到程序RAM区域和ROM区域地址,配合IDA静态分析工具分析。
芯片手册上的基址及大小

打开IDA处理器选择ARM小端

填充加载基址及大小

因为是使用的是ARM7 Cortex-M3处理器架构,那么指令集就存在32位ARM指令集和16位Thumb指令集。
需要在IDA中ROM开始的位置,快捷键alt+G更改设置,CODE32更改为CODE16,设置T值为0x1
更改前

更改后

选择Edit→select all

选中之后右键点击分析选择区域

IDA成功解析出所有函数

只要是基于STM32系列的芯片,就会存在中断向量表,在中断向量表中,Reset可以定位程序是从哪里开始执行的,代码从偏移为4的位置开始查看汇编。

一开始IDA只识别为数据

把未识别的这一块数据按U键变成二进制,在地址为0x8000004的位置按一下Q就显示出一个地址,双击跳转过去

通过一系列的B、BX,BL汇编指令跳转最终找到Reset函数入口位置

讲SVD文件之前,需要介绍一下CMSIS (微控制器软件接口标准的缩写),CMSIS 可实现与处理器和外设之间的一致且简单的软件接口,从而简化软件的重用,缩短微控制器开发人员新手的学习过程。
CMSIS 包含以下组件:
CMSIS-CORE:提供与 Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300 处理器与外围寄存器之间的接口
CMSIS-DSP:包含以定点(分数 q7、q15、q31)和单精度浮点(32 位)实现的 60 多种函数的 DSP 库
CMSIS-RTOS API:用于线程控制、资源和时间管理的实时操作系统的标准化编程接口
CMSIS-SVD:包含完整微控制器系统(包括外设)的程序员视图的系统视图描述 XML 文件

SVD 文件通常与设备参考手册中芯片供应商提供的信息相匹配。SVD相当于把传统的芯片手册(DATA SHEET)给“数字化”了, 手册是给人看的,而SVD采用XML文档结构化的方式,是给机器、开发环境、MDK/IAR等软件“看”的,SVD文件中定义了某个芯片的非常详细的信息,包含了哪些片内外设,每一个外设的硬件寄存器,每一个寄存器中每一个数据位的值,以及详细的说明信息。

简而言之,SVD文件在IDA中加载之后可以识别特殊寄存器,是定位关键代码位置方法之一。

SVD文件加载流程
Keil5 IDE自带CMSIS文件,就可以直接搜索到具体想要的型号,这里在默认安装路径下找到相应的位置

选择IDA插件→SVD文件管理或者使用快捷键也可以

选择完成之后就可以识别特殊寄存器了

快捷键shift+F7调出窗口查看所有识别出来的特殊寄存器


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2022-4-25 09:45 被APT_华生编辑 ,原因:
收藏
免费 18
支持
分享
最新回复 (18)
雪    币: 284
活跃值: (3599)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
2
很详细,感谢分享
2022-4-14 12:48
0
雪    币: 15187
活跃值: (16852)
能力值: (RANK:730 )
在线值:
发帖
回帖
粉丝
3
支持!
2022-4-14 14:41
0
雪    币: 1037
活跃值: (1780)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习 谢谢师傅
2022-4-14 18:04
0
雪    币: 8201
活跃值: (2701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
学习了,谢谢分享
2022-4-15 06:00
0
雪    币: 41
活跃值: (823)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
优秀!感谢分享!!
2022-4-15 10:43
0
雪    币: 14517
活跃值: (17538)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
7
大佬牛逼!!!
2022-4-16 15:58
0
雪    币: 1131
活跃值: (4202)
能力值: ( LV5,RANK:69 )
在线值:
发帖
回帖
粉丝
8
大佬牛逼,带带我
2022-4-17 09:24
0
雪    币: 73
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很详细的流程了
2022-4-18 11:42
0
雪    币: 5
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
太厉害了,进来学习一下
2022-4-18 18:04
0
雪    币: 4934
活跃值: (4653)
能力值: ( LV10,RANK:171 )
在线值:
发帖
回帖
粉丝
11
感谢分享,非常详细
2022-4-21 08:31
0
雪    币: 259
活跃值: (3475)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
12
nb
2022-4-22 17:21
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
学习了,师傅好厉害。
不过,有一个想问题,请教一下,是”脱焊“还是”拖焊“?
2022-4-23 10:45
0
雪    币: 209
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
调用SVD文件,很多寄存器分析不出,比如USART1能找到USART2 USART3...找不到
2022-4-24 11:40
0
雪    币: 3906
活跃值: (3579)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
slsdz 调用SVD文件,很多寄存器分析不出,比如USART1能找到USART2 USART3...找不到
那有没有一种可能是源代码中并没有实现调用其他的串口
2022-4-24 11:50
0
雪    币: 209
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
APT_华生 那有没有一种可能是源代码中并没有实现调用其他的串口

不是
衍生出的外设添加不了

 

<peripheral derivedFrom="USART1">

      <name>USART2</name>

      <baseAddress>0x40004400</baseAddress>

      <interrupt>

   

另外库lib制作sigb不成功提示:

[Critical] pat执行结果:

F:\V3.5_LIB\Template.lib: skipped 31, total 31


[Critical] sigmake执行结果:

F:\idaSigMaker\tmp_out\Template.sig: NO LIBRARY MODULES ARE FOUND!!!


[Error] 发生错误 (请尝试将库文件编译改为'无全程序优化' 或 '去除符号链接'编译后再次尝试)


最后于 2022-4-24 18:28 被slsdz编辑 ,原因:
2022-4-24 17:55
0
雪    币: 1412
活跃值: (3249)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
17
slsdz APT_华生 那有没有一种可能是源代码中并没有实现调用其他的串口 不是衍生出的外设添加不了&nbsp;&lt;periphera ...
再对比原svd文件检查下格式,还有是否加在了你要的芯片标签下。制作lib库建议还是直接用官方的工具,不要用第三方
2022-4-24 19:27
0
雪    币: 3906
活跃值: (3579)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
18
slsdz APT_华生 那有没有一种可能是源代码中并没有实现调用其他的串口 不是衍生出的外设添加不了&nbsp;&lt;periphera ...
不同的编译器生成的汇编代码不同,得先确认是使用什么编译器编译的,如果是使用的是windows系统,那么相关路径,IDAsig\flair75\bin\win下,plb.exe:OMF库的解析器(Borland编译器常用),pcf.exe:COFF库的解析器(微软编译器常用),pelf.exe:ELF库的解析器(UNIX系统常用)。最重要的一点是不支持解析release版识别,由于被去除了符号,解析器将无法识别,并跳过相关函数,报错的缘由如此。
2022-4-24 20:10
0
雪    币: 10
活跃值: (1168)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
唐先生好厉害,我是你的迷妹
2022-6-18 21:42
0
游客
登录 | 注册 方可回帖
返回
//