Try   HackMD

2025q1 Homework 3 (kxo)

contributed by <Dennis40816>

閱讀紀錄

初探 kxo

Note

模組應該和核心同版本,使用以下路徑中的編譯器:

/lib/modules/$(shell uname -r)/build

作者的版本為: 6.8.0-56-generic 6.8.0-57-generic

設定金鑰與編譯模組

避免破壞安全啟動,執行以下命令進行金鑰簽章:

  1. 輸入以下命令以確認模組簽章設定:

    ​​​​cat /boot/config-$(uname -r) | grep CONFIG_MODULE_SIG
    

    應可查看到類似輸出:

    ​​​​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 會設定為啟動,因此要求簽署模組。

  2. 產生私鑰與公鑰

    ​​​​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/"
    
  3. 參考 kxo 使用 make 進行編譯,以產生 kxo.ko

  4. kxo 目錄中,簽署模組:

    ​​​​/lib/modules/$(uname -r)/build/scripts/sign-file\
    ​​​​  sha256\
    ​​​​  <private_key_file>\
    ​​​​  <certificate_file>\
    ​​​​  kxo.ko
    
    

    例如:

    ​​​​/lib/modules/$(uname -r)/build/scripts/sign-file\
    ​​​​  sha256\
    ​​​​  ~/key/mod-key.priv\
    ​​​​  ~/key/mod-key.der\
    ​​​​  kxo.ko
    
  5. 註冊你的公鑰到 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 ... 表示還沒設定密碼:

    ​​​​sudo passwd -S root
    

    可以透過以下命令設定密碼,設定時務必小心謹慎:

    ​​​​sudo passwd root
    

    如果不行,請確認 BIOS 中的 UEFI boot 已經開啟。

    如果依舊不行,為什麼不找找自己問題,請確認是否使用 ASUS 主機板。如果是請參考 两天血泪史:华硕主板上的Ubuntu驱动签名终极解决方案 將公鑰存入 USB 後進 BIOS 匯入金鑰。

    存入路徑是 BIOS ➞ 進階設定 ➞ 安全性 ➞ 安全啟動 ➞ 金鑰管理(安全啟動控制要打開) ➞ 授權簽名 (db) ➞ 附加 ➞ 。接著選擇你的 .der檔案,完成後螢幕會出現一行符號,螢幕會略白,這時按下 ESC 會出現是否附加,選擇附加後,儲存並重啟。

    如果你此時再次匯入公鑰,你會看到一行美妙的文字:

    ​​​​SKIP: <your-der-file> is already in db.
    
  6. 導入模組:

    ​​​​sudo insmod kxo.ko
    

    出現以下錯誤:

    ​​​​[  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 了! 於是只好重新編譯並重新簽署,後問題排除。可以透過以下檢查:

    ​​​​lsmod | grep kxo
    
  7. 執行

    ​​​​stty start '^-' stop '^-'
    ​​​​sudo ./xo-user
    

    如果需要干涉遊戲:

    ​​​​# Pause / Resume
    ​​​​Ctrl + P
    ​​​​
    ​​​​# Quit
    ​​​​Ctrl + Q
    
  8. 卸載模組:

    ​​​​sudo rmmod kxo
    

至此我們對 kxo 的基本操作有了基礎認識。

VSCode 設定

對於 x86 架構,在 .vscode/c_cpp_properties.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_PATHLINUX_HEADERS_PATH 定義在 ~/.bashrc 中。

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

演算法

MCTS

改進

說好的進度呢?