iT邦幫忙

2025 iThome 鐵人賽

DAY 28
0
Security

現在是pwn的天下!系列 第 28

【Day-28】撰寫第一個 Linux Kernel Module

  • 分享至 

  • xImage
  •  

前言

昨天我們了解了 Linux 的 Booting 流程,Kernel 如何從零開始啟動。
今天,我們要實際動手撰寫一個 Kernel Module(核心模組),看看怎麼在 Linux 核心裡新增程式碼,並觀察它的運作。

這也是學習 Kernel 開發的重要第一步

什麼是 Kernel Module?

Kernel Module 是一段可以在系統運行中動態載入或移除的程式碼,常用來:

  • 增加功能(例如新增檔案系統、驅動程式)
  • 測試或實驗(例如資安研究)

特點:

  • 可以 動態載入 / 移除,不用重開機
  • 運行在 Kernel Space,擁有完整硬體操作權限

常用指令:

  • insmod <module.ko>:載入模組

  • rmmod <module.ko>:移除模組

  • lsmod:查看已載入模組

  • dmesg:查看 Kernel 日誌

實作:Hello Kernel Module

hello.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple Hello World Kernel Module");

static int __init hello_init(void) {
    printk(KERN_INFO "Hello, Kernel! Module loaded.\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye, Kernel! Module unloaded.\n");
}

module_init(hello_init);
module_exit(hello_exit);

說明:

  • hello_init():模組載入時執行

  • hello_exit():模組移除時執行

  • printk():在 Kernel 日誌輸出訊息

建立 Makefile

makefile:

obj-m += hello.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
make

載入與測試

載入模組:

sudo insmod hello.ko

查看 Kernel 日誌:

dmesg | tail

移除模組:

sudo rmmod hello

延伸玩法

#include <linux/moduleparam.h>

static int myval = 42;
module_param(myval, int, 0644);
MODULE_PARM_DESC(myval, "An integer parameter");

載入時可傳值:

sudo insmod hello.ko myval=100
  • 實作簡單字元裝置驅動

  • 在 QEMU 測試不同 Kernel 版本下的模組行為

總結

今天我們學會了:

  • Kernel Module 是什麼,為什麼要用

  • 如何寫最簡單的 Hello World Kernel Module

  • 如何編譯、載入、移除模組

  • 觀察 Kernel 日誌,理解模組與 Kernel 的互動

下一步,可以進一步探索 System Call 或 Kernel Debug,將你的模組開發技能提升到更高階


上一篇
【Day-27】Booting:Linux Kernel 如何從零啟動
下一篇
【Day-29】Kernel 進階實作:參數化模組與動態控制
系列文
現在是pwn的天下!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言