1. 程式人生 > 實用技巧 >Linux kernel 使用 kprobe

Linux kernel 使用 kprobe

 1 #include <linux/module.h>
 2 #include <linux/file.h>
 3 #include <linux/uaccess.h>
 4 #include <linux/kallsyms.h>
 5 #include <linux/kprobes.h>
 6 
 7 //
 8 // long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
 9 //
10 //
11 //
12 static struct kprobe kp = {
13 .symbol_name = "do_sys_open", 14 }; 15 static int handler_pre(struct kprobe *p, struct pt_regs *regs) 16 { 17 //printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx," 18 // " flags = 0x%lx\n", 19 // p->addr, regs->ip, regs->flags); /*列印地址、指令和標識*/ 20 21 22 23
24 /* 在這裡可以呼叫核心介面函式dump_stack打印出棧的內容*/ 25 return 0; 26 } 27 28 static void handler_post(struct kprobe *p, struct pt_regs *regs, 29 unsigned long flags) 30 { 31 //printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n", 32 // p->addr, regs->flags); 33 pr_err(""
); 34 35 //pr_err("pid: %d do fork\n", current->pid); 36 //pr_err("ppid: %d do fork\n", current->parent->pid); 37 38 } 39 40 /*在pre-handler或post-handler中的任何指令或者kprobe單步執行的被探測指令產生了例外時,會呼叫fault_handler*/ 41 static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr) 42 { 43 printk(KERN_INFO "fault_handler: p->addr = 0x%p, trap #%dn", 44 p->addr, trapnr); 45 /* 不處理錯誤時應該返回*/ 46 return 0; 47 } 48 49 static int __init driver_init(void) 50 { 51 52 53 int ret; 54 55 kp.pre_handler = handler_pre; 56 kp.post_handler = handler_post; 57 kp.fault_handler = handler_fault; 58 59 ret = register_kprobe(&kp); /*註冊kprobe*/ 60 if (ret < 0) { 61 printk(KERN_INFO "register_kprobe failed, returned %d\n", ret); 62 return ret; 63 } 64 65 printk(KERN_INFO "Planted kprobe at %p\n", kp.addr); 66 pr_err("driver_init"); 67 return 0; 68 } 69 70 static void __exit driver_exit(void) 71 { 72 pr_err("driver_exit"); 73 unregister_kprobe(&kp); 74 printk(KERN_INFO "kprobe at %p unregistered\n", kp.addr); 75 } 76 77 78 79 80 MODULE_LICENSE("GPL"); 81 module_init(driver_init); 82 module_exit(driver_exit);
 1 ifeq ($(KERNELRELEASE),)
 2 
 3 KERNELDIR ?=/lib/modules/$(shell uname -r)/build
 4 PWD := $(shell pwd)
 5 
 6 modules:
 7     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
 8 
 9 modules_install:
10     $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
11 
12 clean:
13     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions modules* Module*
14 
15 .PHONY: modules modules_install clean
16 
17 else
18     obj-m += kprobe_.o
19     kprobe_-objs := kprobe.o
20 endif