如何對西數硬碟韌體進行逆向分析

2021-09-22 17:27:47 字數 3794 閱讀 1742

幾年前我就開始做bios rootkits方面的東西(在uefi成為主流之前)。我知道在初始化啟動過程的後期階段,大多數硬體都有乙個bios型別設定 ,我的主要關注gpu和硬碟。本文我所做的是我曾經 在 spritesmods 上看到的一些東西。

硬碟破解

我發現乙個老版本的西部數碼硬碟驅動器很適合現在的研究,所以我把控制器卸下來。

spritesmods上的那個傢伙把韌體的快閃儲存器晶元弄下來然後把裡面的內容全部拷貝出來了,這裡唯一的問題是紅圈中快閃儲存器晶元這個地方。

紅圈中是marvell 88i8846-tfj2 arm處理器,有內部的快閃儲存器。我不想為了訪問記憶體而手工把整個cpu弄下來,所以我決定使用jtag方法。

jtag的頭是很知名的,雖然可以被顛倒(在我的案例中頭部的第乙個pin點用』1』標識)。pins 6到11是我們需要的jtag金屬圈。

正如你可以看到的,我們決定不焊接pins點。主要原因是其有點生鏽並且離得太近,所以很容易把單板弄壞掉。作為替代我決定使用測試點,這可以用萬用表的「連續」模式實現。

通過設定萬用表的這個模式能夠得到兩點之間的電阻,『1』代表完全絕緣(這意味著這兩點是不通電的),『0.01』代表互通性很好。當電阻很低的時候,儀表會發出聲音(難以忍受的噪音),所以我們只需要通過聲音來判斷兩點之間是否連線即可。

將硬碟驅動器斷開,只要把你要測的兩點用萬用表測一下即可。然後移動其中一段到其他點上,直到聽到蜂鳴聲為止。在我的單板上你會發現從頭部的pin點到測試點有可見的資料行,這給了你很好的入口(前提是你的視力很好)。

我不想將硬碟插入到我的電腦電源上以免出現一些錯誤,並且我的電腦在房間的對面,所以我也不想搞個10公尺長的sata資料線。下面是我的解決方案:

我使用5美元的sata來連線usb,這是乙個很好的方法。右邊的紅色單板使用了乙個30美元的tiao usb多協議介面卡,基於ft2232h同時以可以用spi和jtag。

在這裡我有乙個愚蠢複雜的設定,由於我的windows機器放在房間的另一邊,imac為jtag軟體執行了乙個linux虛擬機器(ftdi驅動和openocd)因為這在windows和osx上安裝很麻煩。 windows系統執行ida來逆向和除錯(當我開始動態除錯時我打算在本地網路上用ida連到openocd的gdb伺服器上去)。

現在所有要連線的東西都已經準備好了,給硬碟插上電源然後輸入下面的命令:

openocd -f inte***ce/inte***ce here>.cfg -f target/test.cfg
需要先為你的硬碟控制cpu配置test.cfg檔案,對於大部分marvell的cpu這個配置都有效。我不知道khz介面卡行不行,所以我將mine設定成100(由於這個值低於它正常的工作值)。

如果一切正常,你會看到這些資訊。現在你可以telnet到4444埠然後傳送命令了。

如果你們沒有辦法焊下快閃儲存器並匯出資訊要得到韌體並不容易,所以我們將會在boot程序下工作。 大部分arm cpu的起始執行位址是0xffff0000,這是復位向量。如果我們從這個位址匯出65536位元組,我們將會找到啟動**,這是乙個很好的入口點。

為了匯出記憶體,我們首先要停止cpu,可以使用命令」reset halt」(這是必要的因為我們沒有辦法在任何乙個階段都能停下來)。如果這個命令沒有效果可能是jtag的rst pin點沒有連線,你需要斷開並重連硬碟的電源然後快速的修復這個jtag問題。記憶體匯出用以下命令

當我們將匯出的映象檔案反彙編時,它是乙個很小的只有4kb的啟動**,這段**能夠引導剩下的韌體。

我發現jtag的重置點不是真的系統重置(srst)只是乙個tap重置(trst),這對除錯不是很有用。這裡是對系統重置訊號的新增(這樣允許重置停止命令在重置向量上中斷下來,在任何指令執行之前)。

在我的例子中沒有srst行的測試點,但是在序列標籤下面有暴露出非常小的鍍銅位,這個可以用來連線cpu的srst pin點。

紅迪網上的ceriand指出jtag頭跟mictor聯結器很像(通常是38或40個pin點)。所以如果你不想做任何焊接工作你可以找乙個mictor聯結器和資料線。

同時我發現老版本的psu硬體無法在低電壓下使用(內部的元件可能會**),所以我推薦為molex電源介面卡買乙個好的ac(不要買便宜的,一天就壞掉了)。

最後,由於jtag頭有乙個rtck聯結器,你需要將opencd的adapter_khz配置為0. 這樣jtag能夠使用自適應時鐘,這樣你能夠防止所有超時錯誤。

引導和引導程式

通過一些逆向我確定第二部分的引導**無法在正常的啟動中使用。執行的時候在乙個埠上等待一些資料(最有可能是串列埠),然後採取相關的行動。如果沒有資料到來,這段**將進入乙個死迴圈驅動將永遠不會啟動。

pcb周圍的埠和測試點對映到cpu的0x1c00a000-0x1c00afff範圍上。現在,由於我沒有錢買示波器或者像樣的邏輯分析儀。我不得不通過這些埠對映,這樣會使事情變得更容易。

所有的這些**都是為了基於一些值讀取進入系統特殊模式的開關:

4-不確定,當它為了一些埠的值進行無限迴圈。我猜這些值是允許開發者讀取/寫入/ 擦除處理器內部的快閃儲存器。

3-跳轉到r4的位址(我的例子中這個值為0,但可能是設計的原因)

6-串列埠的序列控制台可以用ascii位元組(r,w,j,h),可以讓開發者傳送讀取, 寫入,跳轉和停止命令。

我對埠如何對映到記憶體不太熟悉,0x1c00a030總是為0,0x1c00a03a總是為0xffff(我認為這乙個是低電壓常數乙個是高電壓常數)。

有趣的是在「cmp r1,#r3」上設定斷點將r3設定成3,**會跳到位址0然後正常啟動(這就是我認為為什麼0不代表未初始化)。讓我們看看位址0有什麼。

位址0通常是ram,但已經有一些有效的**了,所以很可能是在啟動過程中cpu臨時對映位址0到一些內部唯讀儲存器。這是標準的arm ivt,你可以在任何arm裝置的啟動位址看到;使我想到cpu檢測到jtag附加進來時0xffff0000上的啟動只是被執行了。在我買到邏輯分析儀並找到哪個埠允許我控制啟動模式跳轉之前,唯一通過jtag正常啟動硬體的辦法是在校驗之前執行「重置」然後將r1設定成3.

在這個例子中啟動**是節與節之間差距最大的地方,後續有機會我會將它進行對映,匯出,並逆向。

*參考**:malwaretech.com

如何使用x86彙編對硬碟進行讀寫

硬碟讀寫的基本單位是扇區。就是說,要讀就至少讀乙個扇區,要寫就至少寫乙個扇區,不可能僅讀寫乙個扇區中的幾個位元組。這樣一來,就使得主機和硬碟之間的資料交換是成塊的,所以硬碟是典型的塊裝置。從硬碟讀寫資料,最經典的方式是向硬碟控制器分別傳送磁頭號 柱面號和扇區號 扇區在某個柱面上的編號 這稱為 chs...

大資料如何對海關資訊進行市場分析

海關資料是大資料時代下外貿企業發展成長中不可缺少的分析型資料,通過大資料分析轉變了外貿人對的海關資料傳統理念,幫助外貿人學會了去挖掘 去分析資料。網舟科技為大家分享 大資料如何對海關資訊進行市場分析。那麼什麼是海關資料?海關資料是指從世界各國海關的 關單,提單,商檢 中提取的真實的單證記錄。企業通過...

乙個資料分析小白,要如何對產品進行分析?

在我看來資料本身並沒有任何價值,正是由於分析方法的存在使得原本毫無價值的資料大放異彩。什麼是資料分析?資料分析是指用適當的統計分析方法,對收集來的大量資料進行分析,提取有用資訊和形成結論,而對資料加以詳細研究和概括總結的過程。在實際應用中,資料分析可幫助人們作出判斷,以便採取適當行動。當然,在我看來...