我正在我的公寓里尋找下一篇文章的潛在目標,并驚喜地發現以下 XBox One 控制器仍在包裝中:

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖1)

我不太喜歡玩我的 XBox,所以我認為拆解這個控制器并看看我們可以從中提取什么樣的信息可能會很有趣。

目標

在評估嵌入式平臺時,您可以做或嘗試完成許多事情,在這篇文章中,我想演示/測試以下內容:

  1. 是否可以從目標中提取固件?
  2. 是否可以以這樣一種方式調試或檢測目標,以便我們更多地了解其內部操作?
  3. 可以通過軟件利用或硬件修改來修改或更改固件嗎?

回答其中一些問題的第一步將是硬件拆解。

硬件拆解

打開外殼,可以看到以下PCB:

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖2)

請注意,這里真的沒有太多可看的,因為主芯片被環氧樹脂覆蓋。幸運的是,很多測試板都貼有標簽,但貼有標簽的似乎是各種按鈕按下的測試點,所以沒有什么令人興奮的。

在電路板的底部有一個標有AK4961的IC,但這是一個音頻編解碼器芯片。數據表可以在這里找到。該芯片是一款低功耗 24 位立體聲編解碼器,帶有麥克風、耳機和揚聲器放大器。

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖3)

然而,如果我們看一下它的右邊,有一小群帶有一些絲網印刷標簽的墊子:

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖4)

所以我們看到,,,在絲網印刷中貼上了標簽。這值得一看,如果您已經閱讀了我之前關于路由器拆解和發現 UART 的帖子,您可能已經對如何在這里進行有一些想法。我們首先用萬用表測量每個引腳的電壓:3V3A13A14RES

價值
0/無0 (GND)
RES3.3V
答140.1V
答133.3V
3V33.3V

RES、A14 或 A13 上沒有波動或調制,所以這些一定是別的東西,但是什么?鑒于其中一個標簽是(可能代表系統重置),則很有可能存在JTAG或SWD標頭。RES

我們可以通過用 10k 電阻器將引腳拉低來測試引腳是否真的復位了目標(請記住,我們在這里顛倒了事情,不想意外短路!如果您不熟悉這些類型的接頭或系統復位引腳的典型工作方式,它們通常處于低電平有效狀態,這意味著它們在高值處空閑,必須拉低才能激活。因此,如果我們監控該線路的輸出并使用 10k 電阻將該線路設置為低電平,我們會看到什么?RESdmesg -w


[ 2108.588884] usb 1-6.4: new full-speed USB device number 10 using xhci_hcd
[ 2108.691108] usb 1-6.4: New USB device found, idVendor=0e6f, idProduct=02a2, bcdDevice= 1.0f
[ 2108.691113] usb 1-6.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2108.691116] usb 1-6.4: Product: PDP Wired Controller for Xbox One - Crimson Red
[ 2108.691119] usb 1-6.4: Manufacturer: Performance Designed Products
[ 2108.691122] usb 1-6.4: SerialNumber: 0000AE38D7650465
[ 2108.698675] input: Generic X-Box pad as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6.4/1-6.4:1.0/input/input25
[ 2131.403862] usb 1-6.4: USB disconnect, device number 10
[ 2133.420350] usb 1-6.4: new full-speed USB device number 11 using xhci_hcd
[ 2133.522469] usb 1-6.4: New USB device found, idVendor=0e6f, idProduct=02a2, bcdDevice= 1.0f
[ 2133.522474] usb 1-6.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 2133.522478] usb 1-6.4: Product: PDP Wired Controller for Xbox One - Crimson Red
[ 2133.522480] usb 1-6.4: Manufacturer: Performance Designed Products
[ 2133.522483] usb 1-6.4: SerialNumber: 0000AE38D7650465
[ 2133.530103] input: Generic X-Box pad as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6.4/1-6.4:1.0/input/input26

啊太好了,這樣做導致控制器重置,這是一個引腳,還有 2 個。

當看到這樣的調試頭時,一個常見的假設是它用于JTAG或其他形式的硬件級調試。但是,JTAG規范要求至少有4個引腳,,和。我們的目標上只有兩個,所以這很有可能是一個單線調試 (SWD) 端口。TDOTDITMSTCK

了解社署

SWD 是用于 ARM Cortex 目標的常見調試接口。顧名思義,SWD只需要一條數據線和一條時鐘線,但是我們如何確定哪一條是哪一條呢?在我們走這條路之前,我們應該更多地了解 SWD 是如何運作的,以及可以使用哪些工具來與它進行交互。

首先 - SWD 與稱為“調試訪問端口”(DAP)的東西連接。DAP代理訪問各種“接入端口”(AP),這些端口提供的功能包括典型的硬件調試、傳統JTAG內核和其他高性能內存總線。下圖從本文檔中提取,直觀地展示了 DAP 和 AP 的架構方式。

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖5)

每個 AP 由 64 個 32 位寄存器組成,其中一個寄存器用于標識 AP 類型。AP 的功能和特性決定了如何訪問和利用這些寄存器。您可以在此處找到有關某些標準 AP 的這些事務的所有信息。默認情況下,ARM接口規范定義了兩個AP,分別是JTAG-AP和MEM-AP。MEM-AP 還包括連接到它的組件的發現機制。

SWD協議

正如我們之前提到的 - SWD 是作為 JTAG 的偽替代品而開發的。使用SWD,引腳數量從4個減少到2個,它提供了許多與JTAG相同的功能。然而,SWD的一個缺點是設備不能以菊花鏈方式連接在一起,而JTAG允許這樣做。SWD 中使用的兩個引腳如下:

目的
SWCLK向 CPU 發送時鐘信號,確定何時采樣和發送數據SWDIO
SWDIO雙向數據引腳,用于將數據傳輸到目標 CPU 或從目標 CPU 傳輸數據

SWD 利用基于數據包的協議來讀取和寫入 DAP/AP 中的寄存器,它們包括以下階段:

  1. 主機到目標數據包請求
  2. 巴士周轉
  3. 目標到主機確認響應
  4. 數據傳輸階段

數據包結構如下圖所示,我也分解了表中的各個字段。

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖6)

用法
開始起始位,值 1
APnDP的此位指示是使用調試端口訪問寄存器還是訪問端口訪問寄存器。
RnW(英語:RnW)讀/寫位
答[2:3]AP 或 DP 地址的地址字段
平價所有數據包請求的奇偶校驗位
停止位(始終為 0)
公園在周轉期間將推高的線路
ACK[0:2]從目標到主機的 Ack 位
數據[0:32]實際數據幀,根據 RnW 位從目標讀取或寫入目標
平價數據幀的最終奇偶校驗位

在停放位(從主機到目標)之后有一個周轉期,這基本上意味著目標現在將在同一條線上做出響應。

從極高的級別來看,SWD 端口使用這些數據包與 DAP 連接,這反過來又允許訪問 MEM-AP,從而提供對調試和內存讀/寫功能的訪問。出于本文的目的,我們將使用一個名為 OpenOCD 的工具來執行這些事務。接下來我們將回顧如何構建和使用 OpenOCD。

OpenOCD的

安裝依賴項:


sudo apt-get install build-essential libusb-1.0-0-dev automake libtool gdb-multiarch

克隆存儲庫、配置和構建!


wrongbaud@115201:~/blog$ git clone https://git.code.sf.net/p/openocd/code openocd-code
cd openocd-code
./bootstrap
./configure
make -j$(nproc)

構建 OpenOCD 后,我們可以嘗試通過 SWD 調試此控制器。為了做到這一點,我們至少需要告訴OpenOCD兩件事:

  • 我們用什么來調試(我們使用哪個調試適配器)
  • 我們調試的目標是什么

為了進行調試,我們將使用我們在上一篇文章中使用的FT2232H來轉儲 SPI 閃存。有了這個接口,我們可以使用 OpenOCD 通過 SWD 查詢有關目標的信息,這很重要,因為在反轉過程的這個階段,我們甚至不知道目標 CPU 是什么!

下表用于確定FT2232H上的哪些引腳需要連接到 SWD 目標:

FT2232H Pin社署目標
AD1社署
AD0SCLK公司
AD4SRST(系統重置)

最后,為了將FT2232H用作 SWD 適配器,您必須在FT2232H之間/上面放置一個 470 歐姆電阻器。AD1AD2

一旦我們將FT2232H上的引腳連接到目標,我們就可以使用以下腳本來查詢 DAP 控制器上的寄存器:DPIDR


# We are using an FT2232H so specify this here
interface ftdi
# Provide the VID/PID of the FT2232H
ftdi_vid_pid 0x0403 0x6010
# There are two channels, this is the default
ftdi_channel 0
# To the best of my knowledge, this is used to properly set and confiture the state of the lines we are using
ftdi_layout_init 0x0018 0x05fb
# Enable SWD for the lines that we are using, and the port
ftdi_layout_signal SWD_EN -data 0
# This is used to specify the sRST pin, in our case we're using 
ftdi_layout_signal nSRST -data 0x0010
# Here we are selecting SWD as opposed to another transport layer such as JTAG
transport select swd
# Set the speed of the adapter, this will vary based on what your hardware supports
adapter_khz 100
# Create a new dap, (TAP for JTAG terms) with name chip and role CPU, -enable let's OpenOCD to know to add it to the scan
swd newdap chip cpu -enable
# Create the DAP instance, this must be explicitly created according to the OpenOCD docs
dap create chip.dap -chain-position chip.cpu

我們可以用 openocd 運行這個腳本,如圖所示,輸出如下(注意,第一次運行時,沒有輸出,交換 / 行后打印出以下輸出)。有關從FT2232到控制器的連接,請參見下表SWDSCLK

FT2232H Pin控制器
AD1社署署 (A13)
AD0SCLK (A14)
AD4SRST (RES)

wrongbaud@wubuntu:~/blog/stm32-xbox$ sudo openocd -f openocd.cfg 
Open On-Chip Debugger 0.10.0+dev-01040-ge7e681ac (2020-01-27-18:55)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : FTDI SWD mode enabled
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 100 kHz
Info : SWD DPIDR 0x2ba01477
Warn : gdb services need one or more targets defined

非常好!我們發現了一個芯片 ID,如果我們用谷歌搜索這個 ID,我們會看到各種 Cortex M / STM32 設備的大量點擊——這是有道理的,因為這個處理器系列支持 SWD。現在我們可以與 DAP 進行通信,我們應該看看是否可以確定正在使用的確切處理器 - 如果這是一個為它編寫配置文件的處理器,我們將能夠轉儲閃存組并從目標處理器獲取其他輔助信息。有了這些額外的信息,我們可以告訴 OpenOCD 創建一個目標,使用具有 Cortex M 定義的芯片,這將有望讓我們更多地利用 DAP 并訪問一些更通用的功能,同時我們試圖準確地找出我們的目標 CPU:0x2ba01477


# Set up the GDB target for the CPU, cortex_m is the CPU type, 
target create chip.cpu cortex_m -dap chip.dap
# init reads out all of the necessary information from the DAP, kicks off the debugging session, etc
init
# Read out the information from the DAP, including the ROM table
dap info

當我們使用此配置文件運行 openocd 時,我們會看到以下結果:


wrongbaud@wubuntu:~/blog/stm32-xbox$ sudo openocd -f openocd.cfg 
Open On-Chip Debugger 0.10.0+dev-01040-ge7e681ac (2020-01-27-18:55)
Licensed under GNU GPL v2
For bug reports, read
        http://openocd.org/doc/doxygen/bugs.html
Info : FTDI SWD mode enabled
Info : clock speed 100 kHz
Info : SWD DPIDR 0x2ba01477
Info : chip.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : chip.cpu: external reset detected
Info : Listening on port 3333 for gdb connections
AP ID register 0x24770011
        Type is MEM-AP AHB3
MEM-AP BASE 0xe00ff003
        Valid ROM table present
                Component base address 0xe00ff000
                Peripheral ID 0x00000a0411
                Designer is 0x0a0, STMicroelectronics
                Part is 0x411, Unrecognized 
                Component class is 0x1, ROM table
                MEMTYPE system memory present on bus
        ROMTABLE[0x0] = 0xfff0f003
                Component base address 0xe000e000
                Peripheral ID 0x04000bb00c
                Designer is 0x4bb, ARM Ltd.
                Part is 0xc, Cortex-M4 SCS (System Control Space)
                Component class is 0xe, Generic IP component
        ROMTABLE[0x4] = 0xfff02003
                Component base address 0xe0001000
                Peripheral ID 0x04003bb002
                Designer is 0x4bb, ARM Ltd.
                Part is 0x2, Cortex-M3 DWT (Data Watchpoint and Trace)
                Component class is 0xe, Generic IP component
        ROMTABLE[0x8] = 0xfff03003
                Component base address 0xe0002000
                Peripheral ID 0x04002bb003
                Designer is 0x4bb, ARM Ltd.
                Part is 0x3, Cortex-M3 FPB (Flash Patch and Breakpoint)
                Component class is 0xe, Generic IP component
        ROMTABLE[0xc] = 0xfff01003
                Component base address 0xe0000000
                Peripheral ID 0x04003bb001
                Designer is 0x4bb, ARM Ltd.
                Part is 0x1, Cortex-M3 ITM (Instrumentation Trace Module)
                Component class is 0xe, Generic IP component
        ROMTABLE[0x10] = 0xfff41003
                Component base address 0xe0040000
                Peripheral ID 0x04000bb9a1
                Designer is 0x4bb, ARM Ltd.
                Part is 0x9a1, Cortex-M4 TPIU (Trace Port Interface Unit)
                Component class is 0x9, CoreSight component
                Type is 0x11, Trace Sink, Port
        ROMTABLE[0x14] = 0xfff42003
                Component base address 0xe0041000
                Peripheral ID 0x04000bb925
                Designer is 0x4bb, ARM Ltd.
                Part is 0x925, Cortex-M4 ETM (Embedded Trace)
                Component class is 0x9, CoreSight component
                Type is 0x13, Trace Source, Processor
        ROMTABLE[0x18] = 0x0
                End of ROM table

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections

通過這些新的變化,我們不僅可以與 DAP 和 MEM-AP 進行交互,還可以通過 GDB 調試目標。我們還可以確定目標 CPU 是 STM32F2X 系列,因為 MEM-AP 條目中的0x411部件號:


MEM-AP BASE 0xe00ff003
	Valid ROM table present
		Component base address 0xe00ff000
		Peripheral ID 0x00000a0411
		Designer is 0x0a0, STMicroelectronics
		Part is 0x411, Unrecognized 
		Component class is 0x1, ROM table

然而 - 只是為了好玩,如果我們無法訪問 DAP 并想通過內存讀取和寫入來弄清楚我們的目標是什么怎么辦?為了弄清楚這一點,STM32 CPU中有一些常見的內存區域,用于存儲ID和閃存信息。有了這些信息,我們可以修改 OpenOCD 腳本來讀取這些區域并查找相關的 ID 信息!下表包含 ID 信息的必要偏移量:

STM系列抵消
通用設備 ID 注冊0xE0042000
STM32F0/STM32F30x1FFFF7AC
STM32F10x1FFFF7E8
STM32F2/STM32F40x1FFF7A10
STM32F70x1FF0F420
STM32L00x1FF80050
STM32L0/ L1 Cat.1,Cat.20x1FF80050
L1 Cat.3,Cat.4,Cat.5,Cat.60x1FF800D0

mdw 0x1FFFF7AC 3
mdw 0x1FFFF7E8 3
mdw 0x1FFF7A10 3
mdw 0x1FF0F420 3
mdw 0x1FF80050 3
mdw 0x1FF800D0 3

當我們運行更新的 OpenOCd 腳本和上述命令時,我們會看到以下結果:


> mdw 0x1FFFF7AC 3
0x1ffff7ac: ffffffff ffffffff ffffffff 

> mdw 0x1FFFF7E8 3
0x1ffff7e8: ffffffff ffffffff ffffffff 

> mdw 0x1FFF7A10 3
0x1fff7a10: 006c0028 31385114 30373639 

> mdw 0x1FF0F420 3
SWD DPIDR 0x2ba01477
Failed to read memory at 0x1ff0f424

> mdw 0x1FF80050 3
SWD DPIDR 0x2ba01477
Failed to read memory at 0x1ff80054

> mdw 0x1FF800D0 3
SWD DPIDR 0x2ba01477
Failed to read memory at 0x1ff800d4

>

我們可以使用以下命令獲取閃存大小,使用該芯片數據表或上面鏈接的存儲庫中的閃存地址:


> mdh 0x1FFF7A22
0x1fff7a22: 0100

現在我們知道了確切的目標,我們可以從配置文件中刪除目標和行,并將它們替換為從命令行調用。這將正確枚舉目標 CPU。我們現在也知道,這款STM32F2系列芯片0x100 1kb 頁的閃存。swddaptarget-f /usr/local/share/openocd/scripts/target/stm32f2x.cfg


wrongbaud@wubuntu:~/blog/stm32-xbox$ sudo openocd -f openocd.cfg -f /usr/local/share/openocd/scripts/target/stm32f2x.cfg 
[sudo] password for wrongbaud: 
Open On-Chip Debugger 0.10.0+dev-01040-ge7e681ac (2020-01-27-18:55)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : FTDI SWD mode enabled
adapter speed: 100 kHz

Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 1000 kHz
Info : SWD DPIDR 0x2ba01477
Info : stm32f2x.cpu: hardware has 6 breakpoints, 4 watchpoints
Info : Listening on port 3333 for gdb connections

現在這已經起作用了,我們可以使用以下命令轉儲內部閃存:


> flash list
{name stm32f2x base 0 size 0 bus_width 0 chip_width 0} {name stm32f2x base 536836096 size 0 bus_width 0 chip_width 0}

> flash read_bank 0 bank0.bin
device id = 0x00016423
flash size = 256 kbytes
wrote 262144 bytes to file bank0.bin from flash bank 0 at offset 0x00000000 in 3.690861s (69.361 KiB/s)

> flash read_bank 1 bank1.bin
flash size = 512 bytes
wrote 512 bytes to file bank1.bin from flash bank 1 at offset 0x00000000 in 0.007852s (63.678 KiB/s)

我們還可以使用以下命令使用 gdb 調試控制器:


wrongbaud@wubuntu:~/blog/stm32-xbox$ gdb-multiarch 
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) set architecture arm
The target architecture is assumed to be arm
(gdb) target remote localhost:3333
Remote debugging using localhost:3333
warning: No executable has been specified and target does not support
determining executable automatically.  Try using the "file" command.
0x0800307e in ?? ()
(gdb) x/10x 0x1FFF7A10
0x1fff7a10:	0x006c0028	0x31385114	0x30373639	0xc000fcc0
0x1fff7a20:	0x0100c000	0x67ff47d2	0x05dcf000	0x04a803b3
0x1fff7a30:	0x451744b1	0xffffffff
(gdb)

所以在這一點上,我們已經轉儲了閃存,我們可以調試并單步完成固件,但是......我們可以重新刷新 MCU 嗎?

如果我們可以在固件映像中找到 USB 描述符字符串并修補它們,我們可以將其用作可見方法來確定我們是否可以修補固件。讓我們在GHIDRA中加載固件,看看是否能找到它們,固件映像可以在地址加載。我們知道固件是根據數據表加載的,但是如果我們沒有數據表,這可以通過發出命令和單步執行第一條指令從 OpenOCD 確定。幸運的是,這個固件映像相當小,Ghidra 可以快速處理它。可以在下面的屏幕截圖中看到輸出中看到的字符串:0x80000000x8000000reset haltdmesg

逆向工程師的硬件調試第 1 部分:SWD、OpenOCD 和 Xbox One 控制器(圖7)

讓我們對產品字符串做一個簡單的補丁,將其更改為“測試固件補丁”。可以在 OpenOCD telnet 控制臺中使用以下命令覆蓋閃存:


wrongbaud@wubuntu:~/blog/stm32-xbox$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
> flash read 0 bank0-orig.bin
> flash read_bank 1 bank1-orig.bin 
flash size = 512 bytes
wrote 512 bytes to file bank1-orig.bin from flash bank 1 at offset 0x00000000 in 0.007867s (63.557 KiB/s)
> stm32f2x unlock 0
Target not halted
stm32f2x failed to unlock device
> halt
target halted due to debug-request, current mode: Handler External Interrupt(67)
xPSR: 0x61000053 pc: 0x0800839c msp: 0x2000ff48
> stm32f2x unlock 0
stm32f2x unlocked.
INFO: a reset or power cycle is required for the new settings to take effect.
> reset halt       
target halted due to debug-request, current mode: Thread 
xPSR: 0x01000000 pc: 0x080002a4 msp: 0x20010000
> stm32f2x mass_erase 0
stm32x mass erase complete
> flash write_bank 0 bank0-patch.bin
wrote 262144 bytes from file bank0-patch.bin to flash bank 0 at offset 0x00000000 in 3.744948s (68.359 KiB/s)
> reset 
>

這里有幾個步驟可能沒有意義,所以我想解釋一下:

  1. 在嘗試重新刷新之前,始終始終備份任何閃存圖像。
  2. 見項目符號 1
  3. STM32閃存控制器有一個鎖定位,可防止不必要的寫入。這是在STM32的“選項字節”中設置的
    • 幸運的是,我們能夠解鎖閃光燈,這有時不是一種選擇!
  4. 對于 STM32 上的內部閃存,我們需要在寫入之前執行擦除操作
    • 我應該在這里補充一點,如果你的目標很昂貴或很重要,除非你 100% 確定你可以把它恢復到原來的狀態,否則你永遠不會想這樣做
  5. 我們寫入修補后的固件映像,然后重新啟動 CPU,提示以下內容顯示在dmesg

[54691.886194] usb 1-6.4: new full-speed USB device number 14 using xhci_hcd
[54691.992411] usb 1-6.4: New USB device found, idVendor=0e6f, idProduct=02a2, bcdDevice= 1.0f
[54691.992417] usb 1-6.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[54691.992420] usb 1-6.4: Product: Testing Firmware Patches
[54691.992423] usb 1-6.4: Manufacturer: Performance Designed Products
[54691.992426] usb 1-6.4: SerialNumber: 0000AE38D7650465
[54691.998102] input: Generic X-Box pad as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6.4/1-6.4:1.0/input/input28

太好了 - 所以我們現在已經完全提取了固件并加載到 ghidra 中,并且能夠根據我們認為合適的方式對其進行修改......現在是時候編寫一些宏了。但是已經很晚了,我差點錯過了一月份的每月發布截止日期,所以我想我要在這里結束它!

結論

在對嵌入式系統執行評估時,通常需要枚舉和瀏覽與目標交互的所有可能的接口和方法。無論您的最終目標是尋找錯誤、修改設備的正常操作,還是只是詳細了解其工作原理,硬件調試都非常有用。通過利用硬件調試,我們能夠從該目標中提取固件,設置實時調試器并修改固件。通過本練習,我們還介紹了單線調試的工作原理,以及如何使用硬件調試工具識別、枚舉和調試未知 CPU。OpenOCD 還與基于FT2232H的接口一起使用,以提取固件映像并將新固件重新刷新到目標上。感謝您的閱讀,如果您有任何問題或只是想更多地談論此類內容,請隨時在 twitter 上聯系我