• WAP手机版 加入收藏  设为首页
希捷硬盘数据恢复

希捷硬盘固件读取测试

时间:2018-7-7 12:38:36   作者:成都数据恢复中心   来源:本站原创   阅读:3227   评论:0
内容摘要:鉴于最近围绕恶意软件的宣传可以在硬盘固件中保持持久性,寻求更好地了解硬盘内部实际发生的事情似乎是合理的-特别是对固件的理解。标准硬盘驱动器的硬件组件众所周知且易于理解。一目了然,驱动器的“内脏”由圆形铁质盘片组成,数据被写入和读取。在盘片的中心是主轴,主轴由主轴电机驱动,主轴电机旋转读写臂下方的盘片。浮动在板上方,包含...

鉴于最近围绕恶意软件的宣传可以在硬盘固件中保持持久性,寻求更好地了解硬盘内部实际发生的事情似乎是合理的 - 特别是对固件的理解。

标准硬盘驱动器的硬件组件众所周知且易于理解。一目了然,驱动器的“内脏”由圆形铁质盘片组成,数据被写入和读取。在盘片的中心是主轴,主轴由主轴电机驱动,主轴电机旋转读写臂下方的盘片。浮动在板上方,包含微小读写头的读写臂由致动器控制,致动器将臂移动到盘片的表面上。从驱动器“读取”的数据从盘片,通过臂,通过柔性带状连接器传播到印刷电路板(PCB)。

PCB是驱动器主控制器的所在地,通常连接到HDD外壳的外壳,使其非常容易接近。主控制器实现计算机SATA总线和盘头之间的位置转换和传输协议。它还通过控制前面提到的驱动子系统来提供整体磁盘功能。上电时,主控制器从其内部非易失性存储器或外部存储器芯片执行固件。在磁盘初始化过程期间,控制器还可以从HDD的盘片上的服务位置读取附加代码 - 传统方法无法访问的位置。HDD所做的所有重要且有趣的,可能未记录的内容都被编程到主控制器固件中。

分散在Web上的大多数信息与修复或更换故障HDD的控制器板有关。很少提及固件重新刷新或检索。通过ATA接口排除专有更新文件格式和模糊的更新协议,该过程可归结为从外部存储器芯片读取固件或挂接JTAG接口并操纵主HDD控制器以通过JTAG端口移位其存储器数据(有用)如果固件位于微控制器内部的非易失性存储器中)。关于它的棘手问题在于,尽管大多数主控制器都是由着名的芯片制造商(如ST,LSI,三星和Marvell)制造,但要说HDD微控制器的数据表不容易采购将是轻描淡写的。

在任何情况下,缺少适当的文档都很难确定JTAG接口引脚。有许多技术可以让人们根据PCB的布局或标记来推断这些引脚的功能(即引脚排列),但这是一个艰苦的过程,可能导致电路板本身的破坏。看看建立HDD控制器低级接口的其他可能方法,似乎有些硬盘板有许多专用于某种服务串口的引脚。引脚数量及其确切功能取决于制造商,但是当我开始调查时,它似乎是在芯片内部进行对等的最简单方法。

作为一个实验,我决定连接硬盘串行链接,看看我是否可以从中获得任何有用的东西。我有一个相当古老的硬盘驱动器,可用于实验。从图1中可以看出,其控制器板上有许多熟悉的连接器,例如用于SATA电源和SATA数据的连接器,但也有一个跳线块。两个跳线块引脚用于配置驱动器的带宽。其中一个引脚接地(GND),另外两个很可能是我们正在寻找的 - 串行发送和接收(Tx和Rx)接口。

希捷硬盘固件读取测试

图1带控制器板的HDD磁盘模块

仔细观察PCB确认了我们的观察结果:标记为T1的迹线之一需要短接到相邻接地以实现不同的HDD带宽。到目前为止,剩下的最右边的针脚没有记录。

希捷硬盘固件读取测试

图2控制器板的组件侧

查看电路板的组件(图2)和底层(图3),确认引脚已连接并布线在主控制器芯片下的某处。

希捷硬盘固件读取测试

图3控制器板的底部

因此,我们假设Tx,Rx和接地(GND)引脚输出并将控制器连接到串行终端程序。为此,我们需要一个电压电平(3.3v)和协议转换器(RS232到USB)。有很多选择要做,所有这些都同样有效。我有一个基于FTDI FT232RL的电路板,所以我用它作为PC和HDD控制器板之间的桥梁。我还制作了一个简易连接器,用于将HDD串口连接到FTDI板; 最后的整个设置如图4所示。

希捷硬盘固件读取测试

图4简易连接器和连接到HDD控制器板的USB转COM接口板

将FTDI板连接到PC并安装FTDI驱动程序后,它将充当COM端口,并可通过任何串行终端程序以编程方式连接。我使用了Termite,因为它很简单并且可以在便携模式下运行(也就是说,它不必安装)。由于我对放在盘片上的信息不感兴趣,为了方便我将它们从硬盘盒中拆卸下来。

第一次尝试将所有接线连接起来并将电源连接到控制器板都没有产生任何结果。有很多事情可能会出错。这些可能包括损坏的控制器板本身,电源不足或串行连接错误......但大多数情况下问题是板上或控制器上的Tx和Rx线交换。FTDI板的Tx 必须连接到HDD控制器的Rx,反之亦然。有时即使引脚被标记,它们也会在预期另一个终点时被标记,因此标签并不总是反映标记线上信号的真实性质。在硬盘驱动器控制器板上电时,在终端上交换了这个:

希捷硬盘固件读取测试

图5以57600 bps连接的终端程序

传输似乎是乱码,虽然它在电源周期上足够重复,以假设它应该有一些意义。传输不可读的原因有多种。它可能是原始二进制数据,但也有许多事情我们可能会尝试确认为其他潜在问题。首先是RS232协议设置。我们进行操作时应该担心的最重要的参数是波特率,数据位数,停止位数,奇偶校验和流量控制,我已在图6中指出。

希捷硬盘固件读取测试 

图6终端程序连接设置

假设我们获得一致的信息,即使数据,停止,奇偶校验和流量控制按照它们应该的方式设置,也是有点安全的。但情况并非总是如此,如果使用波特率播放不会导致任何结果,我们需要重新审视这些参数。

所以我将波特率更改为115200.结果如图7所示。

希捷硬盘固件读取测试

图7以115200 bps连接的终端程序

我完全失去了信息。这意味着完全失去同步,并表明我们的操作方式超出了预期的协议波特率。看起来我需要以较慢的速度来看它是否有任何区别。实际上,最初将波特率降至38400,然后降至14400,逐渐增加了接收数据的复杂性,如图8所示。

希捷硬盘固件读取测试

图8以14400 bps连接的终端程序

最后,在9600 bps时有8位数据,1个停止位,没有奇偶校验,我收到了确认读取,如图9所示。

希捷硬盘固件读取测试

图9以9600 bps连接的终端程序

我得到了提示!我正在连接HDD控制器内的终端程序。当然没有手册或帮助打印的暗示,所以为了获得一系列可接受的命令,我开始采用传统的“试错法”方式。我很快就发现大多数时候命令都只包含一个字母和一些参数。例如,a被拒绝,而另一方面b将在没有给出任何结果的情况下解析:

希捷硬盘固件读取测试

图10 HDD终端的F级别 

它促使我认为它可能需要b的一些参数。当然b0和b1紧随其后:

希捷硬盘固件读取测试

图11 b1命令的输出

这表明b1产生了一些信息,而其他命令可能未实现或需要更多参数。看一下b1返回的数字列表,它们似乎非常熟悉。实际上,如果我们查看COM接口的标准速度值 - 9600,19200,38400,57600,115200等 - 值得注意的是,最高有效数字与b1给出的列表中的数字相似。是否有可能b命令以某种方式操纵HDD终端程序的串行通信速度?如何通过论证?它是由列表中的索引吗?我尝试了b2,它没有给我任何通信速度的变化。我试过b0115它放弃了连接。我将终端程序的速度更改为115200并尝试再次连接。连接成功,我能够以更高的速率与HDD终端程序通信,如图11(上图)所示。那很整洁!

继续以类似的方式,我设法发现了一些其他已接受的命令字符,我在下面的图12中列出了这些字符。

希捷硬盘固件读取测试

图12 F级可能的HDD终端命令列表

我在终端程序的F级找到的最有趣的命令是b,d,+, -和=。它们似乎与内存操作例程有关。例如,b和d列出了内存块。两个命令都接受参数; 例如,b按200h大小块列出内存,参数反映块编号,因此b2将给出0x400到0x600范围内的内存块。另一方面,命令d的形式为d <最高有效地址字节> <低地址字>。值得注意的是,这些命令指的是同一地址的不同存储块,如图13所示。

希捷硬盘固件读取测试

图13 b和d命令显示的内存块

+“, -和=似乎与字节和字地址操作有关。例如,以下命令显示指定位置的内存。

希捷硬盘固件读取测试

图14使用+, -和=命令进行内存操作

存储器也可能被改变。这需要更多的研究; 到目前为止,我还没有设法在命令字符串的参数部分找到一个分隔符,它允许我指定要写入的数据。快速浏览一下串行接口,可以看出有多种方法可以访问硬盘驱动器控制器的内存以及(很可能)更改它。界面也非常不方便和简陋; 它可以自动进行数据提取,例如使用Python及其串行接口库。该b命令呈现的格式如下信息:

希捷硬盘固件读取测试

图15 b命令的控制台输出

使用Python和PySerial我试图提取并将此内存表示转换为二进制文件。在这个过程中,有一些事情需要考虑。首先,我们需要通过COM接口初始化并与控制器板建立连接,如图16所示。

希捷硬盘固件读取测试

图16 Python中的串行端口初始化示例

请注意,端口变量需要设置为特定于电路板所连接系统的COM端口。就我而言,它是COM14。

建立连接后,我们需要发出b命令并从板的内存中提取格式化信息,如图17所示。

希捷硬盘固件读取测试

图17 Python中的串行端口通信示例

输入变量首先设置为b,然后后续读取只返回回车符\ r。在循环中处理数据的提取。一旦读数结束,'out'变量将填充来自电路板内存的格式化信息。为了使它有用,我们需要解析并将其转换为二进制文件。

希捷硬盘固件读取测试

图18终端程序的b命令输出的部分

看图18,这意味着摆脱'Addr'标题(区域'A')和实际地址(区域'B'),连接数据(区域'C'),将其从ASCII十六进制转换为原始二进制表示,并最终将其写入文件。这可以通过Python中的几行代码以及它的正则表达式库的帮助来实现。幸运的是,数据块的格式与地址和地址头不同,可以通过正则表达式进行过滤,例如[0-9A-F] {8}。正则表达式获取一个8位十六进制数字并忽略所有其余数字。图19中显示的Python代码枚举了数据块中8位十六进制数的所有实例,并将它们存储在raw_bytes_concat变量中。

希捷硬盘固件读取测试

图19 Python中固件十六进制代码的正则表达式过滤器

使用binascii库处理转换,如图20所示。

希捷硬盘固件读取测试

图20 Python中的ASCII十六进制到二进制转换

转换数据后,它将写入hexfile2.bin文件。一目了然,提取的文件包含一些有趣的字符串,例如:

“SFlash Unsupported”,“BootAdaptives”,“RsvTrackDefLst”,“AppCode”,“Chksum Err”,“无效地址”,“未知扇区”,“无效条目”,“SysSecErr代码”,“前置放大器ID”,“NIGHTHAWKPLUS” ,'旋转不稳定','旋转恢复','Parm Range Err','命令无效 - 未检测到有效证书代码','命令被拒绝'

使用ARMB处理器选择在IDA下加载二进制文件为我们提供了可读的代码块,如图21所示。

希捷硬盘固件读取测试

图21 IDA中反汇编的ARMB(Big Endian)代码(单击在新窗口中打开)

看起来我们可能已经触及了负责终端程序级别F的磁盘嵌入式代码部分。此代码还将其余固件从串行闪存复制到RAM并执行它。来自串行闪存ROM的初始固件代码继续从HDD上的预定义扇区加载固件。所有这些序列和位置都特定于串行闪存和磁盘本身的固件版本。

要更全面地了解HDD固件,必须在控制器和连接的盘片模块进行分析。 


标签:硬盘 固件 读取 测试 
上一篇:没有了
下一篇:希捷硬盘恢复案例:ST3200LT007硬盘恢复
相关评论
不良信息举报中心成都网警网警110报警服务AAA级互联网行业信用360网站安全检测

数据恢复QQ交流群:378664983    站长QQ:958754010


蜀ICP备14015947号-2