IT学习网 - 爱学习 - 最具影响力综合资讯网站 -- 中国IT界的领航者!
热门关键字:      88888  as  xxx
站外
广告
站外
广告

如何对西数硬盘固件进行逆向分析(下)

发布时间:2016-04-29 21:25文章来源:网络整理文章作者: 学习网点击次数:
这篇文章其实是有很多个小部分,为了大家阅读方便,我将其整合成了上下两个部分(第一部分),其中有一些地方翻译起来较为困难(老外废话真的很多),望各位嘴下留情。启动代码貌似只是分布在不同的内存地址,但…

这篇文章其实是有很多个小部分,为了大家阅读方便,我将其整合成了上下两个部分(第一部分),其中有一些地方翻译起来较为困难(老外废话真的很多),望各位嘴下留情。

启动代码貌似只是分布在不同的内存地址,但没有什么简单的办法能够将它们全部导出,所以我决定从内存的0×00000000开始导出区块然后所有的都来引用这个区块的外部地址(建立一个基本的代码地图)。

虽然硬盘模型之间的确其地址不同,但是我的布局可以给你一个好的思路。

图片1.png 

在附近看了一会之后,我发现它会从一些地方读取代码到内存中,所以我猜这里是闪存。

图片2.png

闪存是从一个跨越0到0×120的表开始(起始的第一个块),每个表项32字节并且使用相同的格式(参考镜像)。每个区块都有1到n的id,第一个块是个例外值总为0x5A。

0x5A处的区块是引导程序,它从剩下的闪存中读取并解压代码,我不确定,但是却反证了一个问题。 我想在入口点断下引导程序,听起来很容易,但并非如此。

1.在引导进程的一些点上我的硬件断点没有生效,有可能是处理器重写了寄存器,或者禁用了它们;但我还是没有找到问题。这意味着我无法在引导程序入口点处下断点(0×19000)。

2.复杂加载和执行引导程序的代码在ROM中,所以我没有办法下软件断点。

3.观测点好像也没有生效,甚至在断点停止工作之前我没有办法让代码段在任何内存上。

4.大部分不在ROM中的代码都是用分页技术,当他们需要的时候,会在内存中读取特定区域的代码,然后在他们没有时进行替换,防止使用软件断点。

总之情况比我想象的困难的多所以我决定买一个扩展到EEPROM芯片驱动,来替代在MCU中重新构建。 通过这种方法我可以用EEPROM程序往闪存芯片里面写入软件断点。

图片3.png

硬件和固件使得这个磁盘相当统一,除了固件现在存储在一个256k的SPI闪存芯片中,来替代存在MCU内存中。我做的第一件事是用万用表来查看PCB的顶端是否有地方连接到闪存芯片(所以我们有从磁盘里把PCB弄下来)。

WP#和HOLD#都存在VCC中,所以这不是什么问题,剩下需要的pin点需要提出到E11周围的测试点。 我尝试连接我的TUMPA的SPI接口到测试点上并使用通信软件,但是我没有办法检测到芯片。 我不确定是不是我的TUMPA没有电路编程的能力,或者数据线上有其他填充物。

如果其他方法都无效的话,我会试着找一个SOIC芯片,一个好的EEPROM编程器和焊台。同时我会尝试找到是什么原因使我的断点停止工作并修复它。

尝试才会有新的发现

这个周末我有了大的突破,这使我否定了我之前大部分的研究。我知道其实“不要重复造轮子”并不总是最好的选择,特别是涉及到信任其他人的研究结论时。

一个主要的目标是在能够物理访问的情况下,找到快速简单的方法对硬盘进行重新编程。在spritesmods博客上,他将闪存芯片从PCB上弄下来并将它附在一些veroboard上,所以他能够在硬盘和闪存编程器之间进行数据交换。显然这对我不是特别有用,因为我不得不一直断开和重连闪存芯片,对于快速感染磁盘特别不切实际。

我之前就知道,在有管理员或root账号的情况下从操作系统内部拷出WD硬盘固件是有可能的。硬盘必须运行以便能够接收SATA命令,并且必须重启来加载新的固件。如果新的固件有错误磁盘将无法启动,因此固件不能被修复(通常这样硬盘就变砖了)。事实上我是想破解固件,所以我只能用其他的方式来拷贝。

在线电路编程

当电路一直连接时,在电路中编程(ICP)方法能够在闪存芯片和其他组件中进行编程。在上一篇文章中我已经能够找到连接到闪存芯片的测试端口了,但没有办法进行编程。然而,在周末做了一些实验以后我已经能够使用ICP了。

问题

ICP最大的问题在于为了写入闪存芯片你需要打开它的电源,但是因为它与其他电路连接,所以最终会给其他芯片供电,这会在不同的总线上发送数据干扰你跟闪存之间的通信尝试。 

为了防止SPI总线上的干扰,通常只需要按住复位按钮或者将复位信号接地即可,这会导致系统被重置并且无法启动(让你能够不间断的访问闪存总线)。

下面是我做的尝试:

1.直接用3.3v的电源供电

2.按住系统重置按钮的时候直接用3.3v的电源供电

3.通过插入HD接口直接给整个系统供电

4.按住系统重置按钮的时候插入HD接口直接给整个系统供电

由于所有东西都没有工作,我几乎都快放弃了(我的SPI编程器甚至都没法检测到闪存芯片),但当我在周六决定做最后一次尝试时,它就马上工作了(某种程度上)。

图片5.png

SPI编程器能够检测到闪存芯片,但是读出来的大部分数据都是错的。检查之后我发现VCC(电源)线从测试点松开挂在桌子上了。所以如果VCC线都没有连接并且系统都没有接进来,怎么会读取到闪存芯片呢?

通过更多的实验我发现电路是以这样一种方式设置的,一些被发送到MISO引脚的电压(大概它的1.2v)以某种方式反馈到VCC轨道然后启动芯片。我不是电路专家,这让我非常困惑,但是这告诉我在电路里读取芯片是可行的,我只想需要学习一些诀窍。

解决方法


如何对西数硬盘固件进行逆向分析(下)
本文由 IT学习网 整理,转载请注明“转自IT学习网”,并附上链接。
原文链接:http://www.ourlove520.com/Article/diannao/wangluo/231690.html

标签分类:

如何 进行 分析 逆向 硬盘 固件 西数
上一篇:上一篇:极客DIY:利用树莓派制作一款口袋电脑
下一篇: 下一篇:技术分享:逆向海盗船k95机械键盘
无觅关联推荐,快速提升流量