Jump to content

這篇文章將以Arcade 1UP Marvel 街機為目標,重點介紹UART、UBoot 和USB。 Arcade1UP系列街機自從推出以來,已經有很多玩家在研究如何更換機櫃的內部組件來運行通用MAME 軟件。這篇文章將著眼於現有的硬件,並討論如何提取固件。

1.png

在這篇文章,我們將介紹以下內容:

1.拆卸現有嵌入式系統的支撐硬件;

2.通過IC 標記識別組件;

3.用萬用表測量連接器電壓;

4.邏輯分析儀的使用和設置;

5.UBoot分析和審查;

6.使用depthcharge 編寫UBoot 交互腳本;

這篇文章旨在介紹在目標系統上定位活動的UART、如何接近UBoot 控制台以及最終如何利用這兩個組件從我們的目標中提取閃存。閱讀本文後,你將熟悉屏幕實用程序depthcharge python3庫。

硬件概述在查看新目標時,首要任務之一是檢查可用的接口。在這個街機櫃的例子中,可用的接口乍一看是相對較小的。用戶通過操縱桿/按鈕和機櫃側面的USB接口與該設備進行交互。在機櫃的一側似乎很少有關於USB端口的信息。請注意,即使在網站上的圖片,也沒有USB端口。但是,在機櫃的一側有一個USB設備端口,用於提供外部控制器支持。在另一邊,我們有一個標準的耳機插孔。這兩個外設的行為與預期的一樣,USB端口可以用於連接外部控制器。

在一些老式的手機上,可以配置音頻插孔以在啟動時顯示串行終端。關於這方面的更多信息可以在這裡找到。不幸的是,在這個平台上沒有這樣的修改。

2.jpg

第一次查看這樣的PCB 時,我們首先要記下任何零件編號,看看是否能找到任何數據表。第一個讓我印象深刻的組件用藍色突出顯示。

3.jpg

它是RockchipRK3128,如果我們在網上搜索這個部件編號,我們會發現大量的相關信息。

中央處理器四核ARM Cortex-A7MP Core 處理器,一種高性能、低功耗和緩存的應用處理器;

完全實現ARM架構v7-A指令集,ARM Neon Advanced SIMD(單指令,多數據)支持加速媒體和信號處理計算;

圖形處理器ARM Mali400 MP2;

高性能OpenGL ES1.1 和2.0、OpenVG1.1 等;

內存8 kb的內部存儲器;

動態內存接口(DDR3/DDR3L/LPDDR2):兼容JEDEC標準DDR3-1066/DDR3L-1066/LPDDR2-800 SDRAM。支持32位數據寬度,2級(芯片選擇),總共2GB(最大)地址空間。

Nand Flash接口:支持8位async/toggle/syncnandflash,最多4個bank。 16位、24位、40位、60位硬件ECC;

eMMC接口:兼容標準eMMC接口,支持MMC4.5協議;

視頻MPEG-1, MPEG-2, MPEG-4,H.263, H.264, H.265, VC-1, VP8, MVC的實時視頻解碼器

音頻具有8 個通道的I2S/PCM:最多8 個通道(8xTX、2xRX),從16 位到32 位的音頻分辨率,採樣率高達192KHz。

具有2個通道的I2S/PCM:最多2 個通道(2xTX、2xRX),從16 位到32 位的音頻分辨率,採樣率高達192KHz。

連接SPI控制器:一個集成SPI控制器;

UART控制器:3個集成UART控制器;

I2C控制器:4個集成I2C控制器;

USB Host2.0:嵌入式1 USB Host 2.0接口;

USB OTG2.0:兼容USB OTG2.0規範,支持高速(480Mbps)、全速(12Mbps)和低速(1.5Mbps)模式;

依據上述描述,我們就了解了很多關於目標處理器的信息。我們現在知道了架構和可用的外圍設備和接口,這些對我們是有用的,因為它們可能概述未來的攻擊向量。重要的是要記住,在逆向工程過程的這個階段沒有太多的信息。在嘗試與目標進行交互之前,我們希望盡可能多地了解目標。

在CPU附近,我們有另一個以橙色突出顯示的組件。

4.jpg

此組件標記為SEC931 K4B2G1646F-BYMA,我們很幸運,從三星在此網頁中搜索此部件編號結果。本頁上的信息告訴我們這是一個2GB DDR3 SDRAM芯片。一個數據表也可以從這個頁面獲得,收集可用的數據表總是值得的。該芯片負責將可用內存擴展到CPU,並提供一個易失性內存源(RAM)。

到目前為止,我們已經確定了哪些可能是主CPU和外部RAM。然而,我們仍然缺少一種非易失性存儲。所以,接下來,讓我們檢查一下下面用粉色突出顯示的組件。

5.jpg

此組件被標記為Winbond 25N01GVZEIG,搜索此部件編號將導致我們找到此數據表。這部分是一個1G-bit串行SLC NAND閃存芯片。根據數據表,該芯片採用串行外設接口,兼容的電壓範圍在2.6V到3.3V之間。該芯片可能包含機櫃使用的大部分數據,並將成為我們提取固件的主要目標。

最後一個組件靠近GPIO線,標記為MIX2018A。這個組件不像我們看到的其他組件,我無法找到那麼多的信息。然而,該IC 似乎是音頻放大器。

回顧一下到目前為止我們已經確定的組件,有:

瑞芯微RK3128 ARM CPU;

三星SRAM 芯片;

華邦1GBit NAND 閃存;

MIX2018A 音頻放大器;

現在我們已經回顧了這塊板上的集成電路,讓我們看看板上的連接器,看看我們能學到什麼。

連接器分析現在我們已經記錄了主板上的分立組件,我們將嘗試識別主板上的外部連接器。首先,我們有桶形連接器;此連接器在下圖中以藍色標出:

6.jpg

該連接器用於為機櫃供電

在桶形連接器的右側,我們有一個微型USB 端口。這應該立即引起人們的注意,原因有兩個:

這不是一個面向用戶的端口;

這不是一個USB 主機端口,這是一個微型端口,表示USB 設備或可能是OTG(移動)控制器;

繼續向右,我們有兩行頂針。這些是通過早期圖像中顯示的灰色帶狀電纜連接的。該連接器連接到一個單獨的控制板,用於處理操縱桿/按鈕。

在我們的控制面板連接器之後,還有另一個四針連接器。有了這個連接器,它的方向就不那麼明顯了。例如,這個接口可以連接USB接口或耳機接口。我們可以用萬用表的連續性測試來確定這一點。連續性測試將檢查電流是否可以在兩個探頭之間流動,通常用以下符號在萬用表上表示:

8.png

我們可以使用這個模型來測試兩個組件是否連接,我把一根耳機線插入耳機插孔,把探針放在一個金屬環上進行測試。用另一個探針,我觸摸了四針連接器的每一個點,在其中一條線上,萬用表發出了一聲響亮的嗶嗶聲,讓我們知道這兩點之間存在連接。三個引腳中的每一個都與音頻連接器上的一個環相吻合,這是我們的音頻接口!

接下來,我們有用於顯示的連接器。

在顯示屏附近,我們有兩個兩針連接器,一個在右下角,用於為字幕的背光供電,另一個用於金屬外殼外部的開關。

11.jpg

下面的連接器看起來類似於音頻連接器,它是一個四針連接器,其線纜可以連接到控制面板。只有一個接口我們還沒有考慮,那就是在機櫃的一側的USB連接器。如果我們將萬用表設置為連續模式,並將這個連接器的插腳與機櫃側面的USB連接器進行測試,我們發現它們確實是連接的,這是我們的外接USB接口。

我們已經確定了所有必須斷開的連接,以便更好地查看電路板。因此,我們只剩下幾件事情要檢查。當檢查PCB時,要尋找的一件事是任何未使用的測試焊盤或通孔。

如上圖所示,我們可以看到我們有三組不同的未填充的標頭或焊盤。在PCB的頂部,我們有三個通孔,通孔用於在PCB的多層之間進行連接。在檢查嵌入式系統時,此類通孔通常是一個很好的起點,因為它們可能代表開發期間使用的調試頭。

另一個未填充的是由16個焊盤組成,由一個白色矩形和一個小圓圈表示。這組焊盤可能是用於該板上不需要的另一個集成電路。

最後,最後一組焊盤看起來非常類似於用於USB和音頻的連接器。當查看未使用的焊盤時,像這樣的四腳連接通常是通過UART調試控制台的候選者,我們將在下一節中檢查這些標頭文件並討論UART。

檢查調試標頭在查看上一節中指出的未知標頭時,我通常從測量電壓開始。我們可以使用萬用表來做到這一點。為了計算這些焊盤上的電壓,我們將萬用表設置為直流測量模式,並在將黑色探頭放在接地點上的同時探測感興趣的位置。引腳測量如下:

19.png

這些線路上沒有電壓,雖然這令人失望,但並不意外。如果這是一個有源UART 或另一個正在傳輸的數字信號,我們會期望看到電壓波動形式的一些活動。讓我們繼續討論另一個三針接頭。

20.png

當測量這個連接器時,我們的第二個引腳在啟動時波動很大,然後穩定在3.3V。

注意:在搜索串行端口時,你可能並不總是看到這種幅度的電壓波動。波動與信號的活躍程度直接相關,這意味著如果流量很少,你將幾乎看不到波動。如果你懷疑你有UART 接頭或某種數字接口,最好使用邏輯分析儀進行檢查。

我們看到了可能看起來像信號活動的情況(基於電壓波動)。接下來,我們將使用邏輯分析器檢查此流量。邏輯分析儀幫助我們將這些電壓波動轉換為人類可讀的1 和0 序列。為此,我們將使用母母跳線(female-female jumper wire)將我們的邏輯分析儀連接到我們的兩個興趣點,如下圖所示:

22.jpg

分析儀連接後,我們將啟動Pulseview,從下拉菜單中選擇我們的分析儀,該設備在pulseview 中顯示為“Saleae Logic”設備。這個分析儀的最大捕獲速率是24MHz,我們將使用它來進行分析。我們還需要指定樣本數量,我已經將其設置為500G樣本。

23.png

我們將通過點擊運行啟動捕獲,然後使用這些設置啟動機櫃。

24.png

這樣,我們就捕獲了一些流量,在我們進一步討論pulseview 之前,讓我們先介紹一下UART如何在信號級別上工作。我們已經確認有某種流量通過這些線路傳輸;接下來,我們需要了解更多關於UART 流量以及如何分析它的知識。

UARTUART代表通用異步接收發送器,UART是一種允許兩個設備通信的二線製異步串行協議。每一方所需的兩條線路是傳輸(Tx)和接收(Rx)線路。 UART可以用於嵌入式系統中的許多事情,包括與其他處理器通信、傳感器通信和調試訪問。 UART是一種異步協議,意味著不需要時鐘信號。相反,通信雙方都預先配置為以一定的速度進行通信,稱為波特率。波特率以每秒位數為單位。

UART報文/傳輸由以下字段組成:

25.png

即使有了上面的數據包定義,我們也很難確定我們的邏輯捕獲的內容。幸運的是,Pulseview 有一個我們可以利用的UART 解碼器。

解碼UART通信使用pulseview ,我們可以嘗試解碼這個通信,看看它是否確實是一個活動的UART。要設置解碼器,請點擊下面的綠色和黃色符號。這將打開解碼器選擇窗口,在搜索欄中輸入uart,並選擇uart解碼器。

26.png

接下來,我們需要配置UART解碼器。我們需要選擇適當的頻道並設置此解碼器所需的任何協議特定參數。可配置參數如下:

27.png

首先,我們選擇我們的Rx 線路作為我們包含流量的通道;在我們的例子中,這將是D1。對於所有其他字段,我們將保留它們的默認值、8 位數據寬度、無奇偶校驗等。

有一件事我們需要自己調查和了解:波特率。請記住,雙方必須提前就波特率達成一致,沒有協商/啟動順序。我們需要自己確定波特率,否則,解碼器將不知道如何正確地解析這些信號。要確定波特率,我們可以執行以下操作。

1.放大看起來是最小的脈沖之一;

2.使用Pulseview中的數據標記選擇脈衝寬度,點擊下面的按鈕啟用它們;

3.選擇小脈衝範圍後,Pulseview會自動計算頻率並給出赫茲的測量值,如下圖所示。

29.png

赫茲的周期是每秒,我們的波特率是每秒位數的度量。因此,如果我們突出顯示了通過導線發送的一個位,以及這個脈衝的頻率,我們也得到了波特率。

根據Pulseview,我們計算的頻率是115.384 kHz,換算成波特率為115385位/秒。熟悉調試控制台的人可能會注意到,這非常接近常用的波特率115200。我們把這個值代入解碼器,看看會發生什麼。

如果我們查看下面的屏幕截圖,可以看到擁有看似有效的調試日誌。

30.png

我們有一個活躍的UART並且知道它的波特率,但是現在我們需要找到一種與它接口的方法。為此,我們將使用樹莓派。更新後的機櫃管腳如下:

31.jpg

配置樹莓派樹莓派有多個UARTS可用,我們將使用的UART在下圖中突出顯示:

32.png

我們需要確保啟用了適當的設備樹blob來啟用這個UART。設備樹blob的目的是為內核提供一種方法來理解可用的硬件外圍設備。內核將在啟動時讀取這些二進制信息,並枚舉指定的外設。在對嵌入式Linux系統進行逆向工程時,提取這些信息是有益的,因為可以對這些信息進行反編譯,並勾勒出各種外設在內存中的位置。

樹莓派上所有相關的設備樹blob 都可以位於/boot/overlays/中。在這個文件夾中,你會發現用於多種硬件配置的設備樹二進制對象,一些用於特定的帽子(為Pi設計的定制pcb),可以連接到Pi,其他用於啟用各種IO外圍設備。我們可以使用raspi-config工具為UART外設啟用適當的DTB。

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...