幻女free性zozo交孩交/亚洲成人直播/日本视频免费/国产国语videosex另类

硬盤固件程序嵌入代碼,泄密是遲早的事情

2014-02-26 21:49:50 來源:華軍數據恢復 作者:網站管理員 閱讀:

        硬盤固件程序嵌入代碼,泄密是遲早的事情,為什么?數據恢復專家告訴你,原理是利用硬盤的一些智能機制,在某個位置嵌入一些信息(比如:登錄信息),然后操作系統驗證用戶登陸時,會不自主地讀取黑客預留下的用戶名和密碼。

        簡介

        硬盤:如果你在看這篇文章,我肯定你起碼用過一兩個硬盤。硬盤很簡單,基本就是一些512字節的扇區,由遞增的數字標明地址,稱之為 LBA,也就是“邏輯塊尋址”。電腦可以向連接的硬盤的扇區中讀寫數據。通常會有個文件系統把這些扇區抽象成文件或文件夾。

        如果你從這個幼稚的角度看硬盤,你會認為硬件應該也很簡單:你需要的就是個能連接SATA接口的東西,然后可以定位讀寫頭,從盤片上讀寫數據。但是可能不止這么簡單:硬盤不是還有處理壞塊、S.M.A.R.T.屬性的功能么?不是還有什么緩存需要管理的么?

        以上這些意味著硬盤中有些智能的東西,有智能就意味著可以黑掉它。我就喜歡可以黑的東西,于是我決定要看看硬盤是如何在非機械層面上工作的。這種研究以前在很多硬件上做過:從筆記本的PCI擴展模塊到嵌入式控制器,甚至是蘋果的鍵盤。通常這些研究都是為了證明這些硬盤可以被破解,導致其受到軟件的影響,于是我決定達到同樣的目標:我要在這次破解中讓硬盤繞過軟件安全機構。

    PCB上的部件

        要想知道硬盤是否可以被破解,我需要更了解它們。如你們大多數一樣,我也有一摞或壞或舊的硬盤來一看究竟:

        當然了,我們都知道硬盤的機械結構應該是好用的,我對那些部分也不感興趣。我的興趣在于大多數硬盤背面都有的那一小塊PCB板子,上面有SATA接口和電源接口。這種PCB看起來是這樣的:

        可以看見PCB上有四塊芯片。接下來說說這些芯片:

        這是一塊DRAM(動態隨機存儲器)。這塊很好處理,芯片手冊很好找。這些芯片的容量一般在8MB到64MB之間,對應的就是硬盤標稱的緩存容量。

        這個是電機控制器。這不是個標準器件,數據手冊不好找,但是這些控制器一般都有容易找的差不多的同系列產品。ST Smooth控制器大概是最常用的一種了;除了驅動電機,它還能進行電源整流,還帶一些A/D變換通道。

        這是一塊串行閃存。這個也好處理,容量一般在64KB到256KB之間。看起來這個是用來存儲硬盤控制器的啟動程序。有些硬盤沒有這個芯片,而是在控制器芯片內部有閃存來存儲程序。

        這些小東西不是芯片,而是壓電震動傳感器。當硬盤受到撞擊時,它們可以把磁頭移到安全的地方,但是更有可能它在某個地方標記一個值,表示你的保修無效,因為是你自己摔的硬盤。

        這里才是奇跡將要發生的地方:硬盤控制器。多是由Marvell、ST或者其他的LSI公司制造。有些硬盤廠商自己做控制器:我見過三星和西數就有自己的控制芯片。因為其他的部分都很好處理,這一塊才是我的興趣所在。

        不幸的是,這些芯片都沒有文檔。話說這些制造控制器的廠商不公開文檔有些不厚道真是說輕了:他們甚至在自己的網站上都不提這些芯片!更不幸的是,整個互聯網也幫不了我:搜這些芯片手冊只能找到沒有手冊的手冊網站,和賣芯片的中國廠商……

        那么,沒有最重要的芯片手冊,就意味著我們的計劃擱淺了么?

        連接JTAG

        幸運的是,總有些辦法找到除了芯片手冊以外的有用信息。我就搜到這么一個。

        我找的是HDDGuru論壇上一個叫Dejan的人做的連接線。Dejan不知怎么把他硬盤控制器的內部閃存廢掉了,然后想知道有沒有辦法,要么從外部閃存啟動控制器,要么重寫一下內部閃存。過了五天,沒人回應他,但是這哥們很有創造力:他又發了個帖子說他找到了JTAG口的管腳。這真是個重大發現:JTAG接口可以用來控制控制器。你可以用它啟動控制器、重啟、修改內存、設置斷點等等。然后Dejan發現了如何關掉控制器的啟動ROM,找到了硬盤一個串口,然后試圖恢復他的閃存ROM。后來他又提了一些關于更新閃存的過程,最后消失在茫茫人海中了。

        這些都是有用的信息:至少我知道了西部數據的控制器是ARM內核的,有JTAG接口。這些硬盤通常有串口,雖然沒有使用但是可以用來調試程序。有了這些,我應該有足夠的信息可以開始破解了。

        嗯,這些是我的準備工作:

        那個紅色的是一塊FT2232H的小板,大概30歐元,很便宜,可以用來進行JTAG調試,串口,還有SPI通信。把它連到硬盤的JTAG口,還有串口上。硬盤直接連到我電腦主板的SATA口上,還有外部ATX電源。我用OpenOCD來驅動JTAG接口。

        現在的問題是:這玩意真能工作么?Dejan用的是88i6745控制器的2.5” 250G硬盤,他檢測到的是ARM9內核。我找的是88i6745控制器的3.5” 2TB硬盤,有不同的格式因素,而且有點新。幸運的是,OpenOCD可以自動檢測JTAG連接的設備。如下所示:

        這我就有點搞不懂了……我本來估計會有一個tap,就是單獨的ARM內核……可這里竟然有三個tap……難道這個片子有三個ARM內核?

        一番研究后,我發現這個芯片真的是有三個內核。兩個是Feroceon的內核,是比較牛逼的類似ARM9的內核,還有一個是Crotex-M3內核,比較小,相比更像微控制器的核心。鼓搗了一陣(以及后來的研究)發現這些控制器各自有不同的功能:

  1. Feroceon 1 處理對磁盤的物理讀寫操作
  2. Feroceon 2 處理SATA接口
  3. Feroceon 2 同時處理緩存以及將邏輯塊尋址翻譯成柱面/磁頭/扇區
  4. Cortex-M3 貌似啥都不管?我給他關掉硬盤也沒啥問題。

        現在從哪個核心開始破解呢?我的目標是通過使用修改的硬盤固件來影響系統的安全。最簡單的方法,同時也可能是最難檢測的方法就是直接修改數據。這種方法不需要修改磁盤上的數據,固件可以使自己隱身不可見。為此,我需要找到一個合適的核心來進行監聽:我需要一個能在從硬盤到SATA線的傳輸過程中接觸到數據的核心,同時可以被操縱在磁盤和SATA線纜之間修改數據。

        現在,數據是如何從硬盤盤片上送到SATA借口上的呢?憑黑客的直覺我推測:

        如果處理器工作在150MHz,使用標準的內存復制,它們就只能達到150*23/2=2.4Gbp的速率,而實際情況要比這個少很多。硬盤的速度是6Gbps,所以肯定有些加速硬件參與其中。最可能的加速硬件應該就是使用DMA(直接訪問內存)。那就意味著數據直接從磁頭讀回來放進內存,沒有處理器的參與。SATA口也是一樣:處理器只指明數據在哪里,DMA會直接從內存中讀數據。

        如果是這樣的話,DMA引擎指向的內存會在哪呢?硬盤的緩存是個好地方:數據從磁盤讀出來總是要放進緩存的,所以當讀取磁盤的時候馬上去那里復制也就說的通了。我之前發現第二個Feroceon負責管理緩存;于是它就成了我的首選目標。

        就這樣,我推斷數據通過DMA來讀寫,不需要任何CPU動作。現在的問題是:既然CPU不會在正常操作中接觸數據,那么CPU能不能(非正常地)接觸到數據呢?為了解答這個問題,我首先使用JTAG連接,用了一些反匯編,來看看Feroceon2號的內存。

        如你所見,內存圖有些零碎。RAM中有一些小塊散落著,還有一些IO空間和IRQ空間,以及一塊內部啟動的ROM。還有一塊64MB的數據段,我猜這個是用作緩存的DRAM。一起來看看是不是這樣。首先,我把硬盤加載到我的電腦上,在硬盤上的一個文件里寫入「Hello world」。現在看看我是否能從64MB的內存中找到這個字符串。

        沒錯,找到了!看起來Feroceon2號可以讀取緩存,并對這塊64MB的DRAM進行了地址映射。

        注入代碼

        當然了,如果我想要在緩存里修改數據,我可不能每次都完全掃描整個64MB的緩存:我需要知道緩存是如何工作的。為此,我需要進行反匯編并理解硬盤的固件,至少要明白緩存的函數。

        對固件進行反匯編,可不是個簡單的活。首先,代碼混合了ARM和Thumb指令,如果你沒有自動切換兩種指令的反匯編器就很令人抓狂了。而且,沒有那些能使反匯編更簡單的信息了:一般程序都被寫好了,當有東西出錯總會彈出類似「Couldn’t open logfile!」的信息。這些信息對于了解代碼功能有很大幫助。而這個固件,一條信息都沒有:你得自己看代碼來知道代碼在做什么。代碼庫好像有點老,而且有些時候反匯編的感覺就像給代碼加了很多特性,把所有事情都搞得更復雜。

        當然,也有幾件事使得反匯編相對簡單些。首先呢,西部數據沒有故意混淆代碼:沒有在指令中間用些跳轉的招數。還有,因為JTAG接口的存在,你可以干預代碼的執行,設置斷點,或者直接修改,讓你非常容易地知道程序在做什么。

        我看了很久代碼,試著去理解,有時候用調試器驗證我猜的對不對,最后我找到了緩存系統的核心代碼:在RAM中的一個表,我稱之為「緩存描述符表」。

        緩存描述表的每一項描述了緩存中的一個塊。它包含了可能在緩存中的磁盤扇區的起始LBA、緩存中存有多少硬盤數據、一些標明了緩存項的狀態標志符,還有一個標明了緩存數據在內存中未知的數。

        現在,緩存描述符表的秘密還沒有被揭開,我能否在數據送出SATA口之前截斷磁盤讀取碼?為此,我需要在磁盤控制器上執行我自己的代碼。不僅如此,我還需要確定代碼能否在正確的時間運行:如果它修改緩存太早,數據還沒進去;如果太晚的話,數據已經送到PC了。

        我的方法是綁定在一個已存在的任務上。我破解的是Feroceon2號,這個CPU負責所有的SATA傳送,所以肯定有個服務是負責設置SATA硬件去緩存中讀取數據。如果我找到這個服務,我就可能在它之前運行我的代碼。

        在看了很多代碼,設置了很多斷點,修改了很多次之后,我最終找到了某個符合條件的服務。我通過連接讓這個服務在執行前先運行我的代碼。這是原來的代碼:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    000167BE ; r0 - slot in sata_req
    000167BE sub_0_167BE:
    000167BE                 PUSH    {R4-R7,LR}
    000167C0                 MOVS    R7, R0
    000167C2                 LSLS    R1, R0, #4
    000167C4                 LDR     R0, =sata_req
    000167C6                 SUB     SP, SP, #0x14
    000167C8                 ADDS    R6, R1, R0
    000167CA                 LDRB    R1, [R6,#0xD]
    000167CC                 LDR     R2, =stru_0_40028DC
    • 華軍行數據恢復 - 最新圖文資訊
    • 最新資訊導讀
    • 推薦內容
    • 熱點內容
    <li id="rmaxf"></li>
    <samp id="rmaxf"><listing id="rmaxf"><dl id="rmaxf"></dl></listing></samp><samp id="rmaxf"><listing id="rmaxf"><dl id="rmaxf"></dl></listing></samp>
      <rt id="rmaxf"><menuitem id="rmaxf"><nobr id="rmaxf"></nobr></menuitem></rt>
        • <strong id="rmaxf"><tbody id="rmaxf"><thead id="rmaxf"></thead></tbody></strong>
            <table id="rmaxf"><legend id="rmaxf"><ins id="rmaxf"></ins></legend></table>
            • <progress id="rmaxf"><menuitem id="rmaxf"><nobr id="rmaxf"></nobr></menuitem></progress>