網絡對krpobe的實現機制及擴展都不是特別詳細
由於工作需要及個人愛好,正好有這個機會好好學習此模塊及應用到實際中
並將整個應用擴展及當時的分析情況,詳細記錄下來,希望對感興趣的人有些許幫助
最開始還是先給個具體的栗子:
參考: kernel/samples 下面有不少的例子
/* For each probe you need to allocate a kprobe structure */
static struct kprobe kp = {
//.symbol_name = "do_fork",
.symbol_name = "testAddadd5",
};
當運行到監控的某個點的時候,會調用此函數
static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
printk(" kprobes name is %s pt_regs size is %d \n",p->symbol_name,sizeof(regs->uregs));
return 0;
}
初始話,註冊一個kprobe,可以傳入函數名或者在內存的絕對地址(system.map)
static int __init kprobe_init(void)
{
int ret;
kp.pre_handler = handler_pre;
ret = register_kprobe(&kp);
printk(KERN_INFO " Planted kprobe at %p\n", kp.addr);
if (ret < 0) {
printk(KERN_INFO " register_kprobe failed, returned %d\n", ret);
return ret;
}
return 0;
}
註銷kprobe探測點
static void __exit kprobe_exit(void)
{
unregister_kprobe(&kp);
printk(KERN_INFO " kprobe at %p unregistered\n", kp.addr);
}
module_init(kprobe_init)
module_exit(kprobe_exit)
MODULE_LICENSE("GPL");
system.map
//現在我們只關心 do_fork testAddadd5 這兩個函數
它們在內存的地址如下:
c0052368 T testAddadd5
c00523c0 T do_fork
static struct kprobe kp = {
//.symbol_name = "do_fork",
.symbol_name = "testAddadd5",
};
register_kprobe(&kp)
printk(KERN_INFO " Planted kprobe at %p\n", kp.addr);
insmod
<6>[ 9749.442971] (0)[5251:insmod] Planted kprobe at c0052368
發現這裏打印的地址與system.map是一致的。