iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0
Security

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

【Day-29】Kernel 進階實作:參數化模組與動態控制

  • 分享至 

  • xImage
  •  

前言

前幾天我們已經學會如何編譯 Kernel、在 QEMU 測試、了解 Booting 流程,還寫了第一個 Hello Kernel Module。
今天,我們來玩得更進階一些:讓模組可以 接收動態參數,並且在載入時改變行為,學習如何讓 Kernel 與外部互動更靈活。

為模組加入參數

Kernel 模組可以使用 module_param() 接收外部參數。
以下範例讓我們的模組接受一個名字,在載入時打印不同訊息:
hello_param.c:

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

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Hello Kernel Module with Parameter");

static char *name = "Kernel";
module_param(name, charp, 0000);
MODULE_PARM_DESC(name, "A name to greet");

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

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

module_init(hello_init);
module_exit(hello_exit);

說明:

  • module_param(name, charp, 0000):定義字串參數 name
  • MODULE_PARM_DESC:描述參數用途
  • hello_init()hello_exit() 在載入與移除時分別打印訊息

編譯模組

Makefile 與之前一樣:

obj-m += hello_param.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

載入與測試

載入模組時傳參數:

sudo insmod hello_param.ko name=QEMU
dmesg | tail

輸出:

[ 1234.567890] Hello, QEMU! Module loaded.

移除模組:

sudo rmmod hello_param
dmesg | tail

延伸玩法

  • 嘗試多個參數:整數、布林值、字串

  • 動態控制模組行為,例如設定計數器或開關

  • 實作簡單字元裝置,讓 User Space 與模組互動

  • 在 QEMU 下測試不同 Kernel 版本的相容性

小結

今天,我們讓 Kernel Module 變得更 靈活,可以透過外部參數改變行為,為後續探索 System Call Hook、字元裝置驅動 或 Kernel Debug 打下基礎


上一篇
【Day-28】撰寫第一個 Linux Kernel Module
下一篇
【Day-30】總結
系列文
現在是pwn的天下!30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言