# Nintendo 3DS Hacking: Why, how, and what happened?
###### tags: `資訊安全` `資訊安全期末書面報告` `3DS`
111-2 資訊安全 Team 12
- 范紀予 likemasster@gmail.com
- 陳昱亨 starcyh@gmail.com
- 洪軾凱 sky9109@gmail.com
<!--:::spoiler {state="open"} Table of Contents
:::-->
[ToC]
<!--
## 資安期末報告架構
1. 摘要/大綱
2. Introduction
是什麼/為什麼/相關文獻
3. 實驗架設/實驗步驟
不是列點,描述過程
4. 結果
截圖
5. 總結
6. 心得
自己的想法(個人)
7. Reference
==注意事項:==
==不用多/有什麼寫什麼/簡單的描述==
==老師注重結果==
-->
---
## 摘要
自2011年發布以來,任天堂3DS一直是一款受歡迎的遊戲主機。近年來,越來越多的玩家開始對他們的主機進行修改,以便遊玩自定義遊戲和運行自製應用程式。我們已經對他們的主機進行了修改,並且使用修改後的3DS一段時間了。然而,我們對3DS的破解機制還不夠瞭解,因此我們決定深入研究它的原理。
透過這份研究,我們希望能夠更全面地了解3DS的破解和自定義功能,並分享這些知識給其他對此感興趣的玩家。我們將探討3DS破解的方法和工具,以及可能出現的風險和限制。我們還將探索破解後的3DS所帶來的潛在優勢,例如玩家可以享受更廣泛的遊戲選擇和自定義功能。這項研究將為玩家提供有關 3DS 破解的基礎知識,並幫助他們做出明智的決策,以避免潛在的問題。我們期望這份研究對於對 3DS 破解感興趣的玩家有所幫助,同時也促進了對於遊戲主機修改和自定義領域的更深入了解和討論。
---
## Introduction
Nintendo 3DS 由日本公司任天堂開發並於 2011 年發行,[全球銷售超過 7594 萬台](https://zh.wikipedia.org/zh-hant/%E4%BB%BB%E5%A4%A9%E5%A0%823DS),也是距今最成功且最暢銷的掌機。因為 Nintendo 在 2023 年初停止 eshop 所有 3DS 遊戲的販售,導致玩家再也無法透過任何管道購買非實體販售的遊戲,只能透過二手市場或其他管道遊玩到這些遊戲開發歷史的結晶。
3DS 相較於其他主機最不相同的地方在於雙螢幕設計、3D 裸眼機能及主機間通信三大功能。相較於其他模擬器,3DS 難以透過其他方式達到這些只能實際拿到主機遊玩的體驗,也是為何要找到保存這些遊戲,並且能夠自由在原生系統上執行並遊玩的價值如此重要。
慶幸的是,自從 [2014 年 8 月的 Ninjhax 被發現可以用來啟動 ARM9 和 ARM11 的 Homebrew 後](https://wiki.gbatemp.net/wiki/Hacking_history_3DS#2014),接連有來自於各地的使用者以 3DS Hacking 打造了 Homebrew Community,讓 3DS 能夠完整的被活用,並讓 3DS 能狗做到非常多平常做不到的事情。
本次報告內容我們將 Cover 以下幾點:
- 介紹 3DS 最新版本的破解步驟,及最新版本和其他版本相比省略了哪些步驟,讓 Hacking 3DS 的門檻降到幾乎零知識就可以達到。
- 介紹 3DS 家族的硬體架構,除了原版以及 New 3DS 系列外,也會特別將在介紹破解原理時需要知道的硬體知識。
- 3DS 的破解原理。因為實際上的破解原理過多無法負荷,本次我們把重點放在 ARM11 的硬體輔助執行漏洞來作為我們的講解重點。
---
## 3DS 架構介紹
### 硬體規格
一台 3DS 無印、3DSLL 和 2DS 的大略規格如下:
- Released in 2011 ~ 2013
- Stereoscopic "3D" display
- CPU: 2x ARM11 MPCore (268MHz)
- GPU: DMP PICA
- RAM: 128MB FCRAM, 6MB VRAM
- 2nd CPU: ARM946
- Backwards compatible with DS games
而在 2014 年後發售的 New 3DS、New 3DSLL 和 New 2DS 則是有增加:
- "Super Stable" Stereoscopic "3D" display 可以讓前鏡頭偵測眼睛讓 3D 效果不會消失或變形
- CPU 雙核變四核,同時也出現只能在 New 3DS 上執行的遊戲(我沒有嗚嗚嗚)
- RAM 從 128MB 變成 256MB
![](https://hackmd.io/_uploads/S1QT7CNP2.png)
以下為 3DS 無印大致上的構造,和本次專題內容並無太大關聯:
![](https://hackmd.io/_uploads/BJTDr4sLn.png)
### 權限架構
3DS 基本上有三種使用者權限等級,各個等級都有給予不同權限以及不同 Scenario:ARM11 user mode(也被稱為 userland),ARM11 kernel mode 和 ARM9 kernel mode。
ARM11 user mode 有最少的權限,且大多數在這個權限的程式都能夠訪問,例如遊戲,瀏覽器和 menu 等等。當擁有 ARM11 kernel mode 訪問權的程式也會具有 ARM11 user mode 的訪問權,但無法訪問 ARM9 kernel mode。這些等級由使用的處理器(ARM9 還是 ARM11)以及運行模式(user mode 或 kernel mode)定義。每種處理器都可以訪問特定的資源,而每種模式決定了一個程序對處理器提供的資源的訪問等級。
![](https://hackmd.io/_uploads/r1oG7krD3.png)
User mode 是程式對該處理器的資源有限制的訪問權限的模式。而 Kernel mode 則為程式提供對該處理器系統資源的完全訪問權限,包括記憶體地址等等,因此 ARM11 Kernel mode 權限比 ARM11 User mode 高。
### 硬體架構
3DS 使用的處理器是 **A**dvanced **R**ISC **M**achines (ARM),而其中有 ARM9 和 ARM11 兩種 CPU。ARM11 是主要的處理器(有雙核有四核,看機型),負責處理大部分任務,包括操作系統。而 ARM9 只在 user mode 下運行 process9,並負責處理較低級別的任務和加密功能,如加密和檢查簽章等等。在 3DS 的架構中, ARM11 和 ARM9 可以訪問不同的資源,以確保 Access point 分離。ARM11 和 ARM9 共享對主記憶體資源(WRAM,VRAM和FCRAM)的 Access,而 ARM9 維護著一個含有其自身代碼和數據的 RAM,同時 ARM11 無法訪問。ARM9 也自己擁有訪問 key scrambler 和 AES 引擎的權限,這是 3DS 最主要的加密方式。
![](https://hackmd.io/_uploads/B159B4i8n.png)
在圖中 WRAM 用來儲存 ARM11 kernel code, data 等等,而 FC RAM 則是用來儲存 Application (包含 game/app)、System(包含 applets, menu, browser 等)、Base(包含 system modules, MMU tables and handles tables)等等,特別注意 WRAM、VRAM 和 FCRAM 和 ARM 9 是互相 Share 的,稱為 Shared Memory。雖然在本次報告只會大略提及,但要知道在進行 ARM9 Hack 時就是在這裡作為 Entrypoint 動手腳達成。
![](https://hackmd.io/_uploads/B11yL4sIh.png)
總之若要在 3DS 上執行 Custom Firmware,我們需要獲得 ARM9 kernel mode 的權限。以下介紹其中從 ARM11 User mode 進到 kernel mode 的破解原理。
---
## 破解原理
我們今天將會把重點著重在arm11 的破解上
### ASLR
ASLR
![](https://hackmd.io/_uploads/B13bLEoU3.png)
ASLR(Address Space Layout Randomization)是一種安全技術,用於保護計算機系統,尤其是操作系統和軟體應用程式,免受各種類型的攻擊,如緩衝區溢位利用。
ASLR透過隨機化系統元件和載入的可執行檔的記憶體位址來運作。透過引入這種隨機性,攻擊者難以預測記憶體佈局並利用其中的漏洞。
但是今天並沒有ASLR所以下方功能在3DS上皆無法達成這邊會用<font color = 'red'>紅色來表示</font>
以下是ASLR工作原理的簡單解釋:
---------------
- <font color='blue'>在系統引導或程式執行期間,ASLR會隨機化可執行模組、函式庫以及關鍵系統元件的基底位址。</font>
- <font color='red'>在系統引導或程式執行期間,不會隨機化可執行模組、函式庫以及關鍵系統元件的基底位址</font>
---------------
- <font color='blue'>當一個程式被載入到記憶體中時,其程式碼、資料和堆疊段的起始位址會被隨機決定。</font>
- <font color='red'>當一個程式被載入到記憶體中時,其程式碼、資料和堆疊段的起始位址是固定的。</font>
---------------
- <font color='blue'>每次執行程式時,位址會再次隨機化,使攻擊者難以得知關鍵資料或程式碼的確切位置。</font>
- <font color='red'>每次執行程式時,位址不是固定的,使攻擊者可以得知關鍵資料或程式碼的確切位置。</font>
---------------
- <font color='blue'>ASLR的目的是增加攻擊者利用記憶體相關漏洞的難度。透過引入隨機性,它增加了記憶體佈局的複雜性和不可預測性,降低了成功攻擊的可能性。</font>
- <font color='red'>因為3DS沒有使用ASLR,所以攻擊者利用記憶體相關漏洞。沒有隨機性,所以記憶體佈局是可以預測,攻擊者就可以達到成功攻擊。</font>
ASLR被認為是一種有效的緩解技術
因為沒有ASLR 所以攻擊者可以運用此處作為進入點
### EntryPoint
運用強制的方式來關閉`DEP`Data Execution PreventionData Execution Prevention(也可以稱為NX不可執行),使用任何應用程序或遊戲作為輔助入口點(Entrypoints)。
3DS 自製軟件社群發現了無數的入口點
入口點的名稱被命名為 :
- [name]-Hax,其中[name]是使用的媒體或應用程序。
- **NinjHax**:
- 這邊介紹一個一開始並且最經典的方法,
- 運用QRcode 來與其他玩家可以讀取你所設計的地圖,但是這個QR code 其實一個Entrypoints來讓玩家執行自製軟件
![](https://hackmd.io/_uploads/HkoY8xIv3.png)
- **SoundHax**:
- Soundhax是由Ned Williamson開發的,利用了3DS音訊應用程式中的漏洞來運行自製軟體。它於2016年發布,並適用於不同的固件版本。利用自製惡意的m4a檔,所進行的攻擊手段。
![](https://hackmd.io/_uploads/Syo7KzUP2.png)
### GSPWN
GSPwn(GSPwn)是一個針對Nintendo 3DS遊戲機的漏洞利用工具。它利用了3DS系統中GPU(GSP)模組的漏洞,該模組負責處理圖形和影像相關的任務。透過成功利用GSPwn,攻擊者可以實現系統特權提升,例如運行自製軟體、修改系統設定或執行未經授權的程式。
GSPwn的出現開啟了在3DS上進行自製軟體開發和修改系統的可能性。它為開發人員和研究人員提供了一個平台,可以進行系統深入探索和創造新的應用。然而,正如我之前提到的,我們應該意識到使用GSPwn或進行系統攻擊可能會違反法律或遊戲廠商的使用條款。在進行任何此類活動之前,請務必查閱當地的法律法規並遵守合法和倫理準則。
此外,請注意GSPwn的使用可能受到系統固件版本的限制。
![](https://hackmd.io/_uploads/B1djKzIwh.png)
### ROP
ROP (Return-Oriented Programming) 是一種攻擊技術,常被用於利用已存在的程式碼段(通常是稱為gadgets)來執行惡意操作。ROP 基於程式碼重用的概念,它可以繞過某些安全防護機制,如栈保護機制 (stack canaries) 或代碼執行權限。
ROP 攻擊的核心思想是使用已存在的程式碼段(gadgets),這些段可以是已加載的庫、執行檔或者程式本身的代碼片段。攻擊者通常利用栈溢出或其他漏洞控制程式執行的返回地址,將返回地址指向已存在的程式碼段。然後,攻擊者根據目標任務,將多個gadgets串聯在一起,以實現惡意操作,如執行特定指令、修改記憶體內容或執行特權操作等。
ROP 攻擊技術的關鍵在於找到合適的gadgets,這些gadgets必須遵循特定的組合和限制,以便連接起來實現攻擊者的目的。這種攻擊技術相對複雜且依賴於目標系統的特定狀態和環境。因此,防禦ROP攻擊需要適當的安全措施,如地址空間配置隨機化(ASLR)和執行權限控制等,以減少可用的gadgets數量和降低攻擊成功的可能性。
需要注意的是,ROP攻擊本身並非惡意的,它是一種概念和技術,可被用於安全測試和漏洞研究等領域。然而,惡意攻擊者也可以利用ROP技術來實施惡意行為。因此,保護系統免受ROP攻擊的重要性也不容忽視。
以下是3DS 中被植入的ROP
![](https://hackmd.io/_uploads/S1jCeQID3.png)
``` = c
.word ROP_POP_R0PC ; pop {r0, pc}
.word dst ; r0
.word ROP_POP_R1PC ; pop {r1, pc}
.word src ; r1
.word ROP_POP_R2R3R4R5R6PC ; pop {r2, r3, r4, r5, r6, pc}
.word size ; r2
.word 0xDEADBABE ; r3 (garbage)
.word 0xDEADBABE ; r4 (garbage)
.word 0xDEADBABE ; r5 (garbage)
.word 0xDEADBABE ; r6 (garbage)
.word MEMCPY
```
### SANDBOX ESCAPE
沙盒逃逸(Sandbox Escape)指的是突破沙盒環境的行為,沙盒是一種安全機制,旨在隔離和限制執行不受信任或潛在惡意程式碼。沙盒是一個受控環境,限制軟體的存取和操作,防止其與關鍵系統資源或其他應用程式進行交互。
在安全領域中,沙盒逃逸涉及尋找和利用沙盒實作中的漏洞或弱點,以獲取未授權存取或在沙盒環境之外執行惡意操作。它允許攻擊者繞過既定的安全邊界,獲得更高的權限或存取敏感資料。
沙盒逃逸技術通常涉及利用軟體漏洞,例如記憶體破壞漏洞或邏輯缺陷,以操縱沙盒的行為並執行任意程式碼。攻擊者可以利用這些漏洞來禁用或削弱沙盒的限制,從而使其能夠與底層作業系統或其他進程進行交互。
![](https://hackmd.io/_uploads/SJUI0M8w2.png)
今天我們就是要逃離3Ds的game mode沙盒想辦法想要進入核心區域脫離 user mode 進入kernel mode 還有沙盒的守門人menu選單,我們依舊使用ROP,這個方法繞過menu。
### Secondary EntryPoint:SNSHAX
![](https://hackmd.io/_uploads/rJlxGXLDh.png)
用於達到系統特權提升和執行自製軟體的目的。它是由Smilehax團隊在2016年開發的,利用了3DS的StreetPass功能中的漏洞。
SNShax的原理是利用StreetPass功能在遊戲機之間交換資料時的漏洞,通過傳遞特製的StreetPass數據包來執行自定義的程式碼。透過SNShax,用戶可以運行自製軟體、修改系統設定或進行其他高權限操作。
因為這個交換資料的漏洞,是會有對硬體的設定,進而就可以達到記憶體的入侵,重新去定義記憶體位置把某些位置point到 kernel 的位置,這樣我們就可以對Arm11 kernel 做出相關操作了。
![](https://hackmd.io/_uploads/SJkj77Uvh.png)
---
## 破解步驟
以下以陳昱亨的 3DSLL 作為破解示範。當將整個流程走過並將 3DS hack 完畢後,除了可以運行基本的 homebrew 外,還可以做到運行 arm9loaderhax/brahma homebrew、執行 BootROM 級別的 homebrew、安裝自訂主題、安裝/讀取存檔、運行來自其他區域的遊戲(無區域限制)、和來自另一個區域的遊戲一起上線、運行 3DS ROMs、安裝不同地區的商店內容(如 DLC)、玩 hacked ROMs、玩 DS ROMs、使用 Custom Firmware (CFW) / EmuNAND、安裝 unsigned CIA,甚至降級系統等等,非常非常多的玩法。可以參考 [3DS Homebrew 的 Wiki](https://wiki.gbatemp.net/wiki/3DS_Homebrew) 找到所有可以做的事情。
### 1. 檢查自製韌體與系統版本 ###
透過按住「Select」鍵開機,看看有沒有進入到自製韌體系統(Luma3DS),以確認是否已經可以執行自製韌體。進設定確認系統版本,如圖:Ver. 8.1.0-14T
![](https://hackmd.io/_uploads/HJDFONIwn.jpg)
### 2. 透過 Soundhax 安裝 boot9strap ###
Old 3DS Ver. 8.1.0-14T 適用 Soundhax 當作 Second Entrypoint 來進行破解。
Soundhax (與 universal-otherapp 使用時) 可與韌體版本 1.0.0 至 11.3.0 的歐、日、韓、美版主機相容。
#### 準備項目 ####
- The latest release of [Soundhax](http://soundhax.com/) (for your region, console, and version)
- The latest release of [SafeB9SInstaller](https://github.com/d0k3/SafeB9SInstaller/releases/download/v0.0.7/SafeB9SInstaller-20170605-122940.zip) (direct download)
- The latest release of [boot9strap](https://github.com/SciresM/boot9strap/releases/download/1.4/boot9strap-1.4.zip) (direct download)
- The latest release of [Luma3DS](https://github.com/LumaTeam/Luma3DS/releases/latest) (the Luma3DS .zip file)
- The latest release of [universal-otherapp](https://github.com/TuxSH/universal-otherapp/releases/latest) (otherapp.bin)
將以上檔案放入 3DS 的 SD 卡
![](https://hackmd.io/_uploads/S1_td4IDn.jpg)
### 3. 觸發 Soundhax ###
進入 3DS 音樂館播放剛剛從 http://soundhax.com/ 下載的『<3 nedwill 2016』惡意m4a音樂檔
![](https://hackmd.io/_uploads/Hye2OV8Dn.jpg)
### 4. 成功進入 SafeB9SInstaller ###
依照上螢幕提示,輸入螢幕上給出的組合鍵以安裝 boot9strap
![](https://hackmd.io/_uploads/Bk5odVIP2.jpg)
### 5. 安裝 boot9strap 過程 ###
![](https://hackmd.io/_uploads/ryxsiOE8vn.jpg)
### 6. boot9strap 安裝完成! ###
![](https://hackmd.io/_uploads/rJGhuNIv2.jpg)
### 7. 成功進入 Luma3DS configuration menu ###
按 (A) 重新啟動,之後默認開機直接進入 Luma3DS 系統
![](https://hackmd.io/_uploads/HJ-nuV8w2.jpg)
### 8. 重開機後成功進入 Luma3DS 系統 ###
已經可以看到黑色程式icon(之前裝壞的自製軟件)
#### 準備項目 ####
- The latest release of [Anemone3DS](https://github.com/astronautlevel2/Anemone3DS/releases/latest) (the .cia file)
- The v3.7.4 release of [Checkpoint](https://github.com/BernardoGiordano/Checkpoint/releases/tag/v3.7.4) (the .cia file)
- The latest release of [Homebrew Launcher Wrapper](https://github.com/mariohackandglitch/homebrew_launcher_dummy/releases/latest) (the .cia file)
- The latest release of [Universal-Updater](https://github.com/Universal-Team/Universal-Updater/releases/latest) (the .cia file)
- The latest release of [FBI](https://github.com/Steveice10/FBI/releases/latest) (both the .cia and .3dsx files)
- 最新版的 [GodMode9](https://github.com/d0k3/GodMode9/releases/latest) (選擇 GodMode9 .zip 檔案)
將以上檔案放入 3DS 的 SD 卡
![](https://hackmd.io/_uploads/HkXh_4LD3.jpg)
### 9. 在 Luma3DS 系統中更新系統至最新版 ###
在安裝 B9S + Luma 後,進行系統更新是很安全的
![](https://hackmd.io/_uploads/ryWnuEUP2.jpg)
### 10. 系統更新中... ###
![](https://hackmd.io/_uploads/ByV2O48Dh.jpg)
### 11. 啟動『下載通信(Download Play)』程式 (![](https://hackmd.io/_uploads/SyG3lXPwh.png)) ###
![](https://hackmd.io/_uploads/rJ3XtVLDn.jpg)
### 12. 啟動 Rosalina 選單,將 Download Play title 暫時換成 Homebrew Launcher ###
1. 同時按下『L』+『下』+『Select』鍵以啟動 Rosalina 選單
2. 選擇『Miscellaneous options』
3. 選擇『Switch the hb. title to the current app.』
4. 按『B』繼續
5. 按『B』回到 Rosalina 主選單
6. 按『B』退出 Rosalina 選單
7. 按『Home』跳出程式 並按『X』關閉 Download Play
![](https://hackmd.io/_uploads/ByJ2ON8P2.jpg)
### 13. 成功進入 Homebrew Launcher ###
重新進入 Download Play,這時你會發現已經成功進入 Homebrew Launcher
![](https://hackmd.io/_uploads/By7nu48wh.jpg)
### 14. 將 3DS 內部 clock 與實際時間同步並轉儲聲音固件 ###
P.S. 這是某些自製軟件正確使用聲音所必需的
#### 再次進入 Rosalina ####
1. 同時按下『L』+『下』+『Select』鍵以啟動 Rosalina 選單
2. 選擇『Miscellaneous options』
3. 選擇『Dump DSP firmware』
4. 按『B』繼續
5. 選擇『Nullify user time offset』
6. 按『B』繼續
7. 按『B』回到 Rosalina 主選單
8. 按『B』退出 Rosalina 選單
![](https://hackmd.io/_uploads/BkjiuNUPh.jpg)
### 15. 用 FBI 安裝 SD 卡中的自製軟件 CIAs ###
1. 回到 Homebrew 清單內啟動 FBI 管理器
2. 移動至 SD -> cias
3. 選擇『\<current directory\>』
4. 選擇『Install and delete all CIAs』(安裝並刪除所有的 CIA 檔),並按下『A』確認
5. 按『Home』鍵,並關閉『下載通信 (Download Play)』程式
![](https://hackmd.io/_uploads/HJ42O48v3.jpg)
![](https://hackmd.io/_uploads/S1gG2dN8wn.jpg)
### 16. 在 Luna3DS 系統中安裝自製軟件成功! ###
![](https://hackmd.io/_uploads/BJeEh_EIPh.jpg)
### 17. CTRNAND Luma3DS ###
使用腳本將一些 Luma3DS 的文件複製到內部存儲器,即使沒有插入 SD 卡也可以訪問它們。
#### 18. 進入 GodMode9 ####
1. 關機
2. 按住「Select」鍵開機,這將會啟動 GodMode9
3. 當提示重要檔案備份時,按下『A』繼續,並在完畢後按下『A』繼續
4. 當提示修正 RTC 日期及時間時,按『A』繼續並設定日期及時間,再按『A』繼續
![](https://hackmd.io/_uploads/Byem2dVIwh.jpg)
### 19. Setup Luma3DS to CTRNAND ###
1. 按『Home』鍵以叫出主選單
2. 選擇『Scripts…』
3. 選擇『GM9Megascript』
4. 選擇『Scripts from Plailect’s Guide』
5. 選擇『Setup Luma3DS to CTRNAND』
6. 如提示時,按下『A』繼續
7. 按『A』解鎖 SysNAND(lvl1)的寫入保護,然後按下提示的按鍵組合
8. 按『A』 繼續
9. 選擇『Cleanup SD Card』
10. 如提示時,按下『A』繼續
11. 按『A』 繼續
12. 按『B』回到主選單
![](https://hackmd.io/_uploads/BkMhd4LDh.jpg)
![](https://hackmd.io/_uploads/SJkhuEIv3.jpg)
![](https://hackmd.io/_uploads/rkooOE8wn.jpg)
### 20. 備份基本文件 ###
備份可用於從變磚恢復或恢復數據的文件。
1. 選擇『Backup Options』
2. 選擇『SysNAND Backup』
3. 按 『A』 確認,此過程將花費一些時間
4. 按『A』 繼續
5. 按『B』回到主選單
6. 選擇『Exit』
7. 如提示時,按下『A』取消檔案寫入鎖定
8. 移動至 `[S:] SYSNAND VIRTUAL`
9. 選擇 essential.exefs,並按『A』選擇
10. 選擇『Copy to `0:/gm9/out`』
10-2. 如果你看到『Destination already exists (目的地有相同檔名的檔案)』,那麼請選擇『Overwrite file(s) (覆寫檔案)』並按下「A」鍵
11. 按『A』 繼續
12. 按『Home』鍵以叫出主選單
13. Select “Poweroff system” to power off your console
14. 將 SD 卡插入至電腦中
15. 從 SD 卡 `/gm9/out/` 資料夾複製
`<date>_<serialnumber>_sysnand_##.bin`,
`<date>_<serialnumber>_sysnand_##.bin.sha`,
`essential.exefs` 到電腦的安全位置(這些備份檔案可於未來您磚機時用來修復系統檔案)
16. 從 SD 卡 `/gm9/out/` 刪除 `<date>_<serialnumber>_sysnand_##.bin` 和
`<date>_<serialnumber>_sysnand_##.bin.sha `
17. 將 SD 卡上的 /luma/backups/ 資料夾複製到電腦的安全位置
![](https://hackmd.io/_uploads/Bk1hu4Uv3.jpg)
![](https://hackmd.io/_uploads/S1gm3O4Iv3.jpg)
### 21. 大功告成!!! ###
![](https://hackmd.io/_uploads/HkAMsXwv2.jpg)
因為已經有由社群維護且非常完整的 [3DS Hack 官方指南](https://3ds.hacks.guide/),甚至可以輸入你的 3DS 型號和版本就可以跳出最適合且最簡單的 Hack 方式,因此在這裡就不將其他破解方法列舉了。基本上僅需要一台能夠從 GitHub 下載 release 且可以讀取 SD 卡的電腦,再加上讓 3DS 透過掃 QR code 連網路就可以超級簡單地達到,不再需要透過老舊的 ninjhack 等方法特地去買卡帶等等。
<!-- ## 實驗過程與結果
### 1. 檢查自製韌體與系統版本 ###
透過按住「Select」鍵開機,看看有沒有進入到自製韌體系統(Luma3DS),以確認是否已經可以執行自製韌體。進設定確認系統版本,如圖:Ver. 8.1.0-14T
![](https://hackmd.io/_uploads/HJDFONIwn.jpg)
### 2. 安裝 boot9strap (透過 Soundhax) ###
Old 3DS Ver. 8.1.0-14T 適用 Soundhax 當作 Second Entrypoint 來進行破解。
Soundhax (與 universal-otherapp 使用時) 可與韌體版本 1.0.0 至 11.3.0 的歐、日、韓、美版主機相容。
#### 準備項目 ####
- The latest release of [Soundhax](http://soundhax.com/) (for your region, console, and version)
- The latest release of [SafeB9SInstaller](https://github.com/d0k3/SafeB9SInstaller/releases/download/v0.0.7/SafeB9SInstaller-20170605-122940.zip) (direct download)
- The latest release of [boot9strap](https://github.com/SciresM/boot9strap/releases/download/1.4/boot9strap-1.4.zip) (direct download)
- The latest release of [Luma3DS](https://github.com/LumaTeam/Luma3DS/releases/latest) (the Luma3DS .zip file)
- The latest release of [universal-otherapp](https://github.com/TuxSH/universal-otherapp/releases/latest) (otherapp.bin)
將以上檔案放入 3DS 的 SD 卡
![](https://hackmd.io/_uploads/S1_td4IDn.jpg)
### 3. 觸發 Soundhax ###
進入 3DS 音樂館播放剛剛從 http://soundhax.com/ 下載的『<3 nedwill 2016』惡意m4a音樂檔
![](https://hackmd.io/_uploads/Hye2OV8Dn.jpg)
### 4. 成功進入 SafeB9SInstaller ###
依照上螢幕提示,輸入螢幕上給出的組合鍵以安裝 boot9strap
![](https://hackmd.io/_uploads/Bk5odVIP2.jpg)
### 5. 安裝 boot9strap 過程 ###
![](https://hackmd.io/_uploads/ryxsiOE8vn.jpg)
### 6. boot9strap 安裝完成! ###
![](https://hackmd.io/_uploads/rJGhuNIv2.jpg)
### 7. 成功進入 Luma3DS configuration menu ###
按 (A) 重新啟動,之後默認開機直接進入 Luma3DS 系統
![](https://hackmd.io/_uploads/HJ-nuV8w2.jpg)
### 8. 重開機後成功進入 Luma3DS 系統 ###
已經可以看到黑色程式icon(之前裝壞的自製軟件)
#### 準備項目 ####
- The latest release of [Anemone3DS](https://github.com/astronautlevel2/Anemone3DS/releases/latest) (the .cia file)
- The v3.7.4 release of [Checkpoint](https://github.com/BernardoGiordano/Checkpoint/releases/tag/v3.7.4) (the .cia file)
- The latest release of [Homebrew Launcher Wrapper](https://github.com/mariohackandglitch/homebrew_launcher_dummy/releases/latest) (the .cia file)
- The latest release of [Universal-Updater](https://github.com/Universal-Team/Universal-Updater/releases/latest) (the .cia file)
- The latest release of [FBI](https://github.com/Steveice10/FBI/releases/latest) (both the .cia and .3dsx files)
- 最新版的 [GodMode9](https://github.com/d0k3/GodMode9/releases/latest) (選擇 GodMode9 .zip 檔案)
將以上檔案放入 3DS 的 SD 卡
![](https://hackmd.io/_uploads/HkXh_4LD3.jpg)
### 9. 在 Luma3DS 系統中更新系統至最新版 ###
在安裝 B9S + Luma 後,進行系統更新是很安全的
![](https://hackmd.io/_uploads/ryWnuEUP2.jpg)
### 10. 系統更新中... ###
![](https://hackmd.io/_uploads/ByV2O48Dh.jpg)
### 啟動『下載通信(Download Play)』程式 (![](https://hackmd.io/_uploads/SyG3lXPwh.png)) ###
![](https://hackmd.io/_uploads/rJ3XtVLDn.jpg)
### 啟動 Rosalina 選單,將 Download Play title 暫時換成 Homebrew Launcher ###
1. 同時按下『L』+『下』+『Select』鍵以啟動 Rosalina 選單
2. 選擇『Miscellaneous options』
3. 選擇『Switch the hb. title to the current app.』
4. 按『B』繼續
5. 按『B』回到 Rosalina 主選單
6. 按『B』退出 Rosalina 選單
7. 按『Home』跳出程式 並按『X』關閉 Download Play
![](https://hackmd.io/_uploads/ByJ2ON8P2.jpg)
### 成功進入 Homebrew Launcher ###
重新進入 Download Play,這時你會發現已經成功進入 Homebrew Launcher
![](https://hackmd.io/_uploads/By7nu48wh.jpg)
### 將 3DS 內部 clock 與實際時間同步並轉儲聲音固件 ###
P.S. 這是某些自製軟件正確使用聲音所必需的
#### 再次進入 Rosalina ####
1. 同時按下『L』+『下』+『Select』鍵以啟動 Rosalina 選單
2. 選擇『Miscellaneous options』
3. 選擇『Dump DSP firmware』
4. 按『B』繼續
5. 選擇『Nullify user time offset』
6. 按『B』繼續
7. 按『B』回到 Rosalina 主選單
8. 按『B』退出 Rosalina 選單
![](https://hackmd.io/_uploads/BkjiuNUPh.jpg)
### 用 FBI 安裝 SD 卡中的自製軟件 CIAs ###
1. 回到 Homebrew 清單內啟動 FBI 管理器
2. 移動至 SD -> cias
3. 選擇『<current directory>』
4. 選擇『Install and delete all CIAs』(安裝並刪除所有的 CIA 檔),並按下『A』確認
5. 按『Home』鍵,並關閉『下載通信 (Download Play)』程式
![](https://hackmd.io/_uploads/HJ42O48v3.jpg)
![](https://hackmd.io/_uploads/S1gG2dN8wn.jpg)
### 在 Luna3DS 系統中安裝自製軟件成功! ###
![](https://hackmd.io/_uploads/BJeEh_EIPh.jpg)
### CTRNAND Luma3DS ###
使用腳本將一些 Luma3DS 的文件複製到內部存儲器,即使沒有插入 SD 卡也可以訪問它們。
#### 進入 GodMode9 ####
1. 關機
2. 按住「Select」鍵開機,這將會啟動 GodMode9
3. 當提示重要檔案備份時,按下『A』繼續,並在完畢後按下『A』繼續
4. 當提示修正 RTC 日期及時間時,按『A』繼續並設定日期及時間,再按『A』繼續
![](https://hackmd.io/_uploads/Byem2dVIwh.jpg)
### Setup Luma3DS to CTRNAND ###
1. 按『Home』鍵以叫出主選單
2. 選擇『Scripts…』
3. 選擇『GM9Megascript』
4. 選擇『Scripts from Plailect’s Guide』
5. 選擇『Setup Luma3DS to CTRNAND』
6. 如提示時,按下『A』繼續
7. 按『A』解鎖 SysNAND(lvl1)的寫入保護,然後按下提示的按鍵組合
8. 按『A』 繼續
9. 選擇『Cleanup SD Card』
10. 如提示時,按下『A』繼續
11. 按『A』 繼續
12. 按『B』回到主選單
![](https://hackmd.io/_uploads/BkMhd4LDh.jpg)
![](https://hackmd.io/_uploads/SJkhuEIv3.jpg)
![](https://hackmd.io/_uploads/rkooOE8wn.jpg)
### 備份基本文件 ###
備份可用於從變磚恢復或恢復數據的文件。
1. 選擇『Backup Options』
2. 選擇『SysNAND Backup』
3. 按 『A』 確認,此過程將花費一些時間
4. 按『A』 繼續
5. 按『B』回到主選單
6. 選擇『Exit』
7. 如提示時,按下『A』取消檔案寫入鎖定
8. 移動至 [S:] SYSNAND VIRTUAL
9. 選擇 essential.exefs,並按『A』選擇
10. 選擇『Copy to 0:/gm9/out』
10-2. 如果你看到『Destination already exists (目的地有相同檔名的檔案)』,那麼請選擇『Overwrite file(s) (覆寫檔案)』並按下「A」鍵
11. 按『A』 繼續
12. 按『Home』鍵以叫出主選單
13. Select “Poweroff system” to power off your console
14. 將 SD 卡插入至電腦中
15. 從 SD 卡 /gm9/out/ 資料夾複製
<date>_<serialnumber>_sysnand_##.bin,
<date>_<serialnumber>_sysnand_##.bin.sha,
essential.exefs 到電腦的安全位置(這些備份檔案可於未來您磚機時用來修復系統檔案)
16. 從 SD 卡 /gm9/out/ 刪除 <date>_<serialnumber>_sysnand_##.bin 和
<date>_<serialnumber>_sysnand_##.bin.sha
17. 將 SD 卡上的 /luma/backups/ 資料夾複製到電腦的安全位置
![](https://hackmd.io/_uploads/Bk1hu4Uv3.jpg)
![](https://hackmd.io/_uploads/S1gm3O4Iv3.jpg)
### 大功告成!!! ###
![](https://hackmd.io/_uploads/HkAMsXwv2.jpg)
-->
---
## 總結
本報告主要探討了 Nintendo 3DS 的破解和自定義功能。通過研究和實驗,我們獲得了對3DS破解機制的更深入了解。破解 3DS 可以帶來許多優勢,像是更廣泛的遊戲選擇、自定義功能和安裝不同地區的商店內容與軟體。然而,破解也存在風險和限制,需要玩家仔細考慮。
我們希望本報告能為對 3DS 破解感興趣的玩家提供基礎知識,幫助他們在破解的路上走得更順利。同時,我們鼓勵進一步研究和討論遊戲主機修改和自定義。
---
## 心得與想法
<!-- > 自己的想法(個人)
> 心得指的是破解過程的心得與想法 -->
### 范紀予
我是負責本次3DS 需要後面的理論資料收集,並且統整
在對了解如何破解的理論後我感覺又重新把這學期的資訊安全的課程有重新複習了一次,因為有很多技術都是在密碼學當中都是很常見到,並且可以讓我知道原來上課講的那麼多理論原來都可以用上,也包含作業當中的LAB的技術也會用上,真的很有趣,但是也讓我知曉如果今天沒有一些實力不要輕易進入這一塊領域,也許你會不小心就掉入無限循環當中出不來,這邊也要感謝在另外一門課遇到的資安高手為台大資工網媒所的家妤同學,幫我們補足了很多資安攻防演練的知識,並用很容易懂得方法讓我們可以在短短幾個小時內有對整個3DS破解有用到的技術重新認識,並且我之前有許多地方是錯誤理解的,也感謝可以被指正。
同時也很感謝老師開了一堂很有趣的課程,讓大家就算不是資安專家,但是也可以具備資安意識。
### 陳昱亨
第一次破解3DS是在我國中畢業的那個暑假,那時候的破解還沒像現在那麼容易,不像現在按照教學大概花一小時就完成,那時大概花了一個暑假才終於可以執行盜版遊戲,當時使用的hax 應該是跟內建的瀏覽器有關,印象中需要用瀏覽器掃QR code 進入特定網站,透過網站上的rxTools.dat 去注入觸發原本放在SD卡的自製軟件與系統,才能開始玩盜版遊戲,因為那時要成功觸法此注入點的成功率不高,失敗又需要重開機再跑一次流程,所以到最後我成功進入自製系統後,就不太敢關機。
我覺得這次透過資安專題研究破解3DS 的原理,非常有趣,也讓我從當時按照步驟做的Script Kiddie ,到能夠了解目前每個破解步驟中大概使用的技術原理,透過研究的過程中發現駭客們是如何串聯起好幾個漏洞,每一個漏洞都不可或缺才能完全破解這台設計精良的掌機,深入理解後讓我發自內心的讚嘆,讚嘆這些漏洞背後使用的攻擊方法,讚嘆這些漏洞是如何巧妙的被串起來,讓我不禁覺得這根本就是藝術呀!看到整個社群一起合作,每人都貢獻一己之力、無私奉獻,只為貫徹駭客精神,這樣的精神也讓我深感佩服。
### 洪軾凱
我大約是在 2022 年下半接觸到和認識 Console Hacking Community,同時也第一次把自己小時候最喜歡的掌機拿來 mod 掉,才感受到這個社群的魅力,和大家對遊戲的熱愛有多麼狂熱。當時的破解方法應該已經足夠簡單了,那時我大約只花不到半小時就把所有流程走過,也把整個機器備份過、下載一些比較不重要的 plug-in 等等(不過我忘記當時是怎麼 hack 的了,但應該不是 soundhax),不過現在的方法真的簡單很多,也很開心看到 Stanley 也把自己的 3DS 也 mod 掉了XD
心得就是希望封閉性的遊戲廠商能夠讓這些遊戲有永遠能正版 Access 的方法,我們花少少的錢就可以快樂的玩正版遊戲,你們也能獲利不是很棒ㄇ \>\<
感謝紀予和昱亨願意讓我任性的選我目前為止最喜歡的掌機作為本次期末報告的主題,報告前一天還基本上就是熬夜,幫了超級大的忙。但我因為撐不下去先去睡覺了,負責的內容相較之下簡單很多,也非常抱歉讓你們耗費超級多心力提醒我要把負責的期末報告寫完@@ 也想感謝來自台大資工網媒所的家妤學姊聽我們試講,甚至手把手帶我們看懂 Smealum 等人在 32C3 Keynote 上講的簡報,和各種在資安圈裡出現但我們看不懂的地方,最後也感謝大家願意為這個專題花那麼多時間研究!
---
## Reference
- 3DS Hack 官方指南 https://3ds.hacks.guide/
- Breaking the 3DS - 32C3 Keynote by Smealum, derrek, plutoo https://smealum.github.io/3ds/32c3/#
- 同時有影片 https://www.youtube.com/watch?v=CzVZgdkzBn8
- History of Hacking the Nintendo 3DS - by Shavina Chau, Joonho Ko and Jessica Tang https://courses.csail.mit.edu/6.857/2019/project/20-Chau-Ko-Tang.pdf
- Introduction to how 3DS hacks work https://gbatemp.net/threads/introduction-to-how-3ds-hacks-work.491138/
- "The 3DS Cryptosystem" by Yifan Lu https://yifan.lu/2016/04/06/the-3ds-cryptosystem/
- Wikipedia
- Ninjhax https://www.3dbrew.org/wiki/Ninjhax
- 3DS Hacking History https://wiki.gbatemp.net/wiki/Hacking_history_3DS
- 3DS Homebrew https://wiki.gbatemp.net/wiki/3DS_Homebrew
- 其他閱讀參考資料
- Binary Exploitation https://speakerdeck.com/yuawn/binary-exploitation
---