# 2025q1 Homework 3 (kxo) contributed by <`Dennis40816`> ## 閱讀紀錄 - [x] [N04: kxo](https://hackmd.io/@sysprog/linux2025-kxo) - [ ] [LKMPG WriteUp]() ## 初探 kxo > [!Note] > 模組應該和核心同版本,使用以下路徑中的編譯器: > ```bash > /lib/modules/$(shell uname -r)/build > ``` > 作者的版本為: ~~`6.8.0-56-generic`~~ ``6.8.0-57-generic`` ### 設定金鑰與編譯模組 為++避免破壞安全啟動++,執行以下命令進行金鑰簽章: 1. 輸入以下命令以確認模組簽章設定: ```bash cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG ``` 應可查看到類似輸出: ```bash CONFIG_MODULE_SIG_FORMAT=y CONFIG_MODULE_SIG=y # CONFIG_MODULE_SIG_FORCE is not set CONFIG_MODULE_SIG_ALL=y # CONFIG_MODULE_SIG_SHA1 is not set ... ``` 預設 `CONFIG_MODULE_SIG_ALL` 會設定為啟動,因此要求簽署模組。 1. 產生私鑰與公鑰 ```bash openssl req -new -x509 -newkey rsa:2048 \ -keyout mod-key.priv \ -outform DER \ -out mod-key.der \ -nodes \ -days 36500 \ -subj "/CN=My Kernel Module Signing Key/" ``` 1. 參考 [kxo](https://github.com/sysprog21/kxo) 使用 `make` 進行編譯,以產生 `kxo.ko` 1. 在 `kxo` 目錄中,簽署模組: ```bash /lib/modules/$(uname -r)/build/scripts/sign-file\ sha256\ <private_key_file>\ <certificate_file>\ kxo.ko ``` 例如: ```bash /lib/modules/$(uname -r)/build/scripts/sign-file\ sha256\ ~/key/mod-key.priv\ ~/key/mod-key.der\ kxo.ko ``` 1. 註冊你的公鑰到 Machine Owner Key(MOK) 中: ``` sudo mokutil --import <your-mod-key>.der ``` 例如: ``` sudo mokutil --import ~/key/mod-key.der ``` 完成後重新啟動。 執行本步驟如果遇到 `Failed to enroll new keys`,請確保你的 root 已經設定密碼,若以下命令的結果是 `root L ...` 表示++還沒++設定密碼: ```bash sudo passwd -S root ``` 可以透過以下命令設定密碼,設定時務必小心謹慎: ```bash sudo passwd root ``` 如果不行,請確認 BIOS 中的 UEFI boot 已經開啟。 如果依舊不行,~~為什麼不找找自己問題~~,請確認是否使用 ==ASUS 主機板==。如果是請參考 [两天血泪史:华硕主板上的Ubuntu驱动签名终极解决方案](https://blog.csdn.net/bfonline/article/details/146406862) 將公鑰存入 USB 後進 BIOS 匯入金鑰。 存入路徑是 **BIOS ➞ 進階設定 ➞ 安全性 ➞ 安全啟動 ➞ 金鑰管理(安全啟動控制要打開) ➞ 授權簽名 (db) ➞ 附加 ➞ ==否==**。接著選擇你的 `.der`檔案,完成後螢幕會出現一行符號,螢幕會略白,這時按下 ESC 會出現是否附加,選擇附加後,儲存並重啟。 如果你此時再次匯入公鑰,你會看到一行美妙的文字: ``` SKIP: <your-der-file> is already in db. ``` 1. 導入模組: ```bash sudo insmod kxo.ko ``` 出現以下錯誤: ```bash [ 469.404598] kxo: loading out-of-tree module taints kernel. [ 469.404622] kxo: disagrees about version of symbol device_create_file [ 469.404622] kxo: Unknown symbol device_create_file (err -22) [ 469.404626] kxo: disagrees about version of symbol device_create [ 469.404627] kxo: Unknown symbol device_create (err -22) [ 469.404638] kxo: disagrees about version of symbol device_destroy [ 469.404638] kxo: Unknown symbol device_destroy (err -22) ``` 該錯誤通常源自與當前核心版本不同,但剛剛才檢查 `kxo.ko` 是 6.8.0-56 阿? 但再次使用 `uname -r` 居然變成 6.8.0-57 了! 於是只好重新編譯並重新簽署,後問題排除。可以透過以下檢查: ```bash lsmod | grep kxo ``` 1. 執行 ```bash stty start '^-' stop '^-' sudo ./xo-user ``` 如果需要干涉遊戲: ```bash # Pause / Resume Ctrl + P # Quit Ctrl + Q ``` 1. 卸載模組: ```bash sudo rmmod kxo ``` 至此我們對 kxo 的基本操作有了基礎認識。 ### VSCode 設定 對於 x86 架構,在 `.vscode/c_cpp_properties.json` 加入: ```json { "configurations": [ { "name": "Linux", "includePath": [ "${workspaceFolder}", "${env:KERNEL_BUILD_PATH}", "${env:KERNEL_BUILD_PATH}/include", "${env:KERNEL_BUILD_PATH}/arch/x86/include", "${env:LINUX_HEADERS_PATH}/include", "${env:LINUX_HEADERS_PATH}/arch/x86/include/generated" ], "defines": [ "KBUILD_MODNAME=\"kxo\"", "__GNUC__", "__KERNEL__", "MODULE" ], "compilerPath": "/usr/bin/gcc", "cStandard": "gnu99", "intelliSenseMode": "linux-gcc-x64" } ], "version": 4 } ``` 其中 `KERNEL_BUILD_PATH` 和 `LINUX_HEADERS_PATH` 定義在 `~/.bashrc` 中。 ```bash export KERNEL_BUILD_PATH="/lib/modules/$(uname -r)/build" export LINUX_HEADERS_PATH="/usr/src/linux-headers-$(uname -r)" ``` ## kxo 專案架構 為正確理解 kxo,首先閱讀其程式,並繪製其流程圖,以利後續修改。詳細參考 [kxo Code Write-Up](https://hackmd.io/@dennis40816/kxo-code-writeup)。 ## 演算法 ### MCTS ## 改進 :::danger 說好的進度呢? :::