首页
社区
课程
招聘
[原创]华为HG8245H救砖番外篇之利用JTAG完成硬件初始化
发表于: 2017-3-6 18:46 19453

[原创]华为HG8245H救砖番外篇之利用JTAG完成硬件初始化

bxc 活跃值
6
2017-3-6 18:46
19453

原文发在我的blog:http://blog.csersoft.net/archives/196

前言

前几天使用UBoot恢复mtd分区时,因为误操作,导致flash全部被擦除。这下设备上电时连StartCode都跑不了。写内存跑StartCode都不行(外部设备没有初始化,无法访问DRAM):

> mdw 0x82000000
data abort at 0x82000000, dfsr = 0x00001008

可以看到,原本是放置StartCode的地址,现在都无法访问。折腾了几天,大致成功的利用JTAG完成硬件初步初始化,并且可以加载StartCode到内存并成功运行了。

问题解决思路

想要写内存来运行代码,就必须对内存进行初始化操作。但这个初始化操作应该都是StartCode里做的。现在StartCode都跑不起,更别说写内存了。

如果用JTAG来模拟StartCode的初始操作的话,也不太现实,毕竟100多KB的代码分析起来就够累人了,别说模拟了。但是如果能找到一个平衡点,模拟少量的操作,让硬件环境刚好够我利用来跑StartCode,这样实现还是比较容易的。

在网上查了很多关于ARM处理器复位时的流程和低级bootloader做的工作相关的资料。大致感觉有路可走:

一般对于采用非可直接寻址的存储设备(Nand Flash)来引导的话,CPU内部会有一个bootrom,bootrom在上电时会从非可直接寻址的存储设备的固定位置装载固定大小的内容到片内SRAM(比如从Nand Flash的0地址读取2KB内容到片内SRAM),然后设置pc过去并运行。这很小的一部分bootloader就会做简单的初始化操作,然后读取完整的bootloader到内存中的指定位置并运行。

逆向分析StartCode

StartCode的一开始就是ARM经典的中断向量表:

 

第一个中断向量就是偏移0的复位中断向量。CPU在复位时会从这里开始执行,复位中断向量直接跳到0x5C处(处理reset中断的实际代码位置)。

在StartCode的0x5C处,IDA Pro就可以直接F5了,以下为还原的伪代码(部分地方还原的有问题,手工修改过):

可以看出,在

v9 = sub_0;
v10 = sub_82000000;

之后就开始代码的自搬移了。其中v9是程序装载的位置,v10是StartCode应该被放置的地址。

也就是说,只要通过JTAG完成这两句代码之前StartCode所做的操作,就可以使用JTAG访问外部RAM了(起始地址大约在0x80000000)。

使用TCL脚本模拟实现初始化操作

好在OpenOCD支持tcl脚本,大概熟悉了一下tcl的语法,并结合逆向的数据,写了个模拟初始化操作的脚本:

使用JTAG完成基本硬件初始化

为了确保初始化准确无误,需要保证CPU上电时完全无法找到可以引导的代码。

因为我之前清空flash时,也曾尝试立刻刷回StartCode,可惜不知什么原因,只写入了2KB的StartCode,这样仍然无法完成基本的初始化。但不清楚这2KB的代码完成了哪些操作,所以一个办法就是先将flash的CE#(CE#这种后面带#字的引脚,都是低电平有效)与3.3V短接(最好是能与输出3.3V的GPIO短接,与3.3V的VCC短接电流可能较大,不知是否有不良影响),再给板子上电。HG8245H的CE#引脚在板子背面电源led附近有个上拉电阻R1542,可以在这里短接。

CPU上电后,在OpenOCD的telnet里执行上面脚本提供的sd5115_hwinit函数,等看到输出

Hardware initialization is complete!

字样的提示后,把之前dump出来的StartCode写入内存并运行:

这时应该可以看见UART里输出了久违的StartCode信息:

HuaWei StartCode 2012.02 (R13C10 Apr 22 2014 – 18:06:02)

NAND: Nand(Hardware): 128 MiB
startcode select the uboot to load
the high RAM is :8080103c
startcode uboot boot count:-1
Slave struct initializtion success!!
Use the UbootA to load first
Start from UbootA ERROR, Change to UbootB
Both UbootA and UbootB are wrong, load it by JTAG!

补充:

新版本的OpenOCD配置文件见:https://github.com/csersoft/hi_sd5115_openocd_config


最新sd5115 openocd 配置文件见:https://github.com/csersoft/hi_sd5115_openocd_config


[课程]FART 脱壳王!加量不加价!FART作者讲授!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (12)
雪    币: 6790
活跃值: (4436)
能力值: (RANK:600 )
在线值:
发帖
回帖
粉丝
2
感谢经验分享,分析得很精彩。
2017-3-7 10:42
0
雪    币: 43
活跃值: (388)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
3
这么玩好复杂的样子,拆flash上编程器好过。
2017-3-7 19:31
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
您好!可以OpenBTS的幫助? 給你的電子郵件))
2017-3-28 23:47
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
5
movsarisaev 您好!可以OpenBTS的幫助? 給你的電子郵件))
抱歉,没研究过这个
2017-3-29 11:01
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
楼主出一个固件提取教程吧
2017-5-25 12:42
0
雪    币: 7068
活跃值: (3517)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
7
lmwdz 楼主出一个固件提取教程吧
很长一段时间都不会有时间了
2017-5-25 20:18
0
雪    币: 203
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢楼主的分享,非常精彩。
2017-6-1 08:55
0
雪    币: 26
活跃值: (79)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
感谢楼主的分享,非常精彩。
2017-6-1 12:39
0
雪    币: 2
活跃值: (60)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
bxc 很长一段时间都不会有时间了
同求楼主出个DUPM教程。希望楼主得闲的时候搞一搞
2017-7-14 09:43
0
雪    币: 256
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
自己改hw_boardinfo 变砖了。一直卡在
Chip Type is SD5117L
safetycode boot type: spi nand flash
Safetycode build: (V500R019C20 Jun  4 2019 - 14:17:45)
Select startcodeA
startcode start at 0x1c020088
Chip Type is SD5117L
safetycode boot type: spi nand flash
Safetycode build: (V500R019C20 Jun  4 2019 - 14:17:45)
Select startcodeA
startcode start at 0x1c020088

反复重启。
2022-11-12 17:32
0
雪    币: 639
活跃值: (1187)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
12
vbgood
2023-1-14 09:55
0
雪    币: 639
活跃值: (1187)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
13
我一直有一个问题,做了读保护还能提取吗?
2023-1-14 09:56
0
游客
登录 | 注册 方可回帖
返回
//