ARM架構kprobe應用及實現分析(1.0 簡單示例)

網絡對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是一致的。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章