ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Linux kernel 使用 kprobe

2020-09-19 11:33:32  阅读:327  来源: 互联网

标签:kernel addr modules regs kprobe handler Linux kp


 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

 

标签:kernel,addr,modules,regs,kprobe,handler,Linux,kp
来源: https://www.cnblogs.com/maojun1998/p/13695477.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有