Skip to content

Commit 5f5c256

Browse files
committed
Add examples of Linux kernel modules.
1 parent a8f6db5 commit 5f5c256

File tree

12 files changed

+522
-0
lines changed

12 files changed

+522
-0
lines changed

kernel_mod/kprobe_templ/Makefile

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
obj-m := schk.o devmem_ret_one.o \
2+
kp_alter_ovl_tnc.o \
3+
kp_igd_alter_ovl2.o \
4+
kp_emgd_alter_ovl2.o \
5+
jp_drm_ioctl.o \
6+
kp_trace_many.o \
7+
kretp_alter_ovl_tnc.o \
8+
kp_drm_wait_vblank.o
9+
10+
all:
11+
make -C /lib/modules/`uname -r`/build M=`pwd` V=1
12+
13+
.PHONY: clean ins rm rei
14+
clean:
15+
rm -fr *.ko *.o *.mod.* Module.symvers
16+
17+
ins:
18+
insmod schk.ko
19+
20+
rm:
21+
rmmod schk.ko
22+
23+
rei:
24+
rmmod schk.ko
25+
insmod schk.ko
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/kprobes.h>
4+
#include <linux/kallsyms.h>
5+
6+
static struct kretprobe my_kretprobe;
7+
static const char *sym_name = "devmem_is_allowed";
8+
9+
static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
10+
{
11+
regs->ax = 1;
12+
return 0;
13+
}
14+
15+
static __init int init_devmem_ret_one(void)
16+
{
17+
int ret;
18+
printk("%s: sym_name: %s\n", __func__, sym_name);
19+
my_kretprobe.handler = ret_handler;
20+
my_kretprobe.kp.symbol_name = "devmem_is_allowed";
21+
if ((ret = register_kretprobe(&my_kretprobe)) < 0) {
22+
printk("register_kretprobe failed, returned %d\n", ret);
23+
return -1;
24+
}
25+
printk("Planted return probe at %p\n", my_kretprobe.kp.addr);
26+
return 0;
27+
}
28+
module_init(init_devmem_ret_one);
29+
30+
static __exit void cleanup_devmem_ret_one(void)
31+
{
32+
printk("%s\n", __func__);
33+
unregister_kretprobe(&my_kretprobe);
34+
}
35+
module_exit(cleanup_devmem_ret_one);
36+
37+
MODULE_LICENSE("GPL");
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include <linux/module.h>
2+
#include <linux/kprobes.h>
3+
#include <linux/kallsyms.h>
4+
#include <linux/fb.h>
5+
6+
//struct jprobe jp0;
7+
struct jprobe jp;
8+
9+
long
10+
jp_drm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
11+
{
12+
printk(KERN_INFO "cmd: %x, arg: %lx\n", cmd, arg);
13+
jprobe_return();
14+
return 0;
15+
}
16+
/*
17+
int
18+
jp_fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
19+
unsigned long arg)
20+
{
21+
printk("cmd: 0x%x\n", cmd);
22+
jprobe_return();
23+
return 0;
24+
}*/
25+
26+
/*
27+
int jp_fb_set_var(struct kprobe *p, struct pt_regs *regs) {
28+
//printk("pre_handler: p->addr=0x%p, eflags=0x%lx\n",p->addr,
29+
// regs->eflags);
30+
int i;
31+
dump_stack();
32+
unsigned long* sp = (unsigned long*)regs->esp;
33+
unsigned long ret = *sp;
34+
unsigned long* a_info = (unsigned long*) *(sp+1);
35+
unsigned long* a_var = (unsigned long*) *(sp+2);
36+
printk("esp: %lx, sp: %p, ret: %lx, a_info: %p, a_var: %p, eip: %lx, ebp: %lx\n",
37+
regs->esp, sp, ret, a_info, a_var, regs->eip, regs->ebp);
38+
39+
for (i = 0; i < 10; i++) {
40+
printk("%lx\n", sp[i]);
41+
}
42+
43+
return 0;
44+
}*/
45+
46+
static __init int init_myjp(void)
47+
{
48+
printk("Hello\n");
49+
50+
//
51+
// Settting up kprobes;
52+
//
53+
jp.kp.symbol_name = "drm_ioctl";
54+
jp.entry= JPROBE_ENTRY(jp_drm_ioctl);
55+
register_jprobe(&jp);
56+
57+
/*
58+
jp0.kp.symbol_name = "fb_ioctl";
59+
jp0.entry= JPROBE_ENTRY(jp_fb_ioctl);
60+
register_jprobe(&jp0);
61+
*/
62+
63+
return 0;
64+
}
65+
module_init(init_myjp);
66+
67+
static __exit void cleanup_myjp(void)
68+
{
69+
unregister_jprobe(&jp);
70+
//unregister_jprobe(&jp0);
71+
printk("Good by!\n");
72+
}
73+
module_exit(cleanup_myjp);
74+
75+
MODULE_LICENSE("GPL");
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/kprobes.h>
4+
#include <linux/kallsyms.h>
5+
6+
static struct kprobe kp;
7+
static const char *sym_name = "alter_ovl_tnc";
8+
9+
static int pre_handler(struct kprobe *p, struct pt_regs *regs)
10+
{
11+
printk(KERN_INFO "pre_handler\n");
12+
//dump_stack();
13+
return 0;
14+
}
15+
16+
static __init int init_mykp(void)
17+
{
18+
int ret;
19+
printk("%s: sym_name: %s\n", __func__, sym_name);
20+
kp.pre_handler = pre_handler;
21+
kp.symbol_name = sym_name;
22+
if ((ret = register_kprobe(&kp)) < 0) {
23+
printk("register_kprobe failed, returned %d\n", ret);
24+
return -1;
25+
}
26+
printk("Planted return probe at %p\n", kp.addr);
27+
return 0;
28+
}
29+
module_init(init_mykp);
30+
31+
static __exit void cleanup_mykp(void)
32+
{
33+
printk("%s\n", __func__);
34+
unregister_kprobe(&kp);
35+
}
36+
module_exit(cleanup_mykp);
37+
38+
MODULE_LICENSE("GPL");
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/kprobes.h>
4+
#include <linux/kallsyms.h>
5+
6+
struct probe_info {
7+
const char *name;
8+
unsigned int offset;
9+
};
10+
11+
static const struct probe_info symbols[] = {
12+
{"drm_wait_vblank", 0},
13+
{"drm_wait_vblank", 0x43},
14+
{"drm_wait_vblank", 0x50},
15+
{"drm_wait_vblank", 0x5d},
16+
{"drm_wait_vblank", 0xa5},
17+
{"drm_wait_vblank", 0xd5},
18+
{"drm_wait_vblank", 0x114},
19+
{"drm_control", 0},
20+
};
21+
22+
#define NUM_SYMS sizeof(symbols) / sizeof (struct probe_info)
23+
24+
static struct kprobe kp_array[NUM_SYMS];
25+
static int pre_handler(struct kprobe *p, struct pt_regs *regs)
26+
{
27+
printk(KERN_INFO "pre_handler[%d] %s [%lx]\n",
28+
current->pid, p->symbol_name, regs->ip);
29+
//dump_stack();
30+
drm_irq_install();
31+
return 0;
32+
}
33+
34+
static __init int init_mykp(void)
35+
{
36+
int idx;
37+
int ret;
38+
for (idx = 0; idx < NUM_SYMS; idx++) {
39+
struct kprobe *kp = &kp_array[idx];
40+
printk("%s: sym_name: %s (%x)\n", __func__,
41+
symbols[idx].name, symbols[idx].offset);
42+
kp->pre_handler = pre_handler;
43+
kp->symbol_name = symbols[idx].name;
44+
kp->offset = symbols[idx].offset;
45+
if ((ret = register_kprobe(kp)) < 0) {
46+
printk("register_kprobe failed, returned %d\n", ret);
47+
goto error;
48+
}
49+
printk(" => Addr: %p\n", kp->addr);
50+
}
51+
return 0;
52+
53+
error:
54+
for (idx--; idx >= 0; idx--) {
55+
struct kprobe *kp = &kp_array[idx];
56+
unregister_kprobe(kp);
57+
}
58+
return 0;
59+
}
60+
module_init(init_mykp);
61+
62+
static __exit void cleanup_mykp(void)
63+
{
64+
int idx;
65+
for (idx = NUM_SYMS - 1; idx >= 0; idx--) {
66+
struct kprobe *kp = &kp_array[idx];
67+
printk("[%s] Unregister: %s\n", __func__, kp->symbol_name);
68+
unregister_kprobe(kp);
69+
}
70+
}
71+
module_exit(cleanup_mykp);
72+
73+
MODULE_LICENSE("GPL");
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/kprobes.h>
4+
#include <linux/kallsyms.h>
5+
6+
static struct kprobe kp;
7+
static const char *sym_name = "emgd_alter_ovl2";
8+
9+
static int pre_handler(struct kprobe *p, struct pt_regs *regs)
10+
{
11+
printk(KERN_INFO "pre_handler [%s]\n", sym_name);
12+
//dump_stack();
13+
return 0;
14+
}
15+
16+
static __init int init_mykp(void)
17+
{
18+
int ret;
19+
printk("%s: sym_name: %s\n", __func__, sym_name);
20+
kp.pre_handler = pre_handler;
21+
kp.symbol_name = sym_name;
22+
if ((ret = register_kprobe(&kp)) < 0) {
23+
printk("register_kprobe failed, returned %d\n", ret);
24+
return -1;
25+
}
26+
printk("Planted return probe at %p\n", kp.addr);
27+
return 0;
28+
}
29+
module_init(init_mykp);
30+
31+
static __exit void cleanup_mykp(void)
32+
{
33+
printk("%s\n", __func__);
34+
unregister_kprobe(&kp);
35+
}
36+
module_exit(cleanup_mykp);
37+
38+
MODULE_LICENSE("GPL");
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/kprobes.h>
4+
#include <linux/kallsyms.h>
5+
6+
static struct kprobe kp;
7+
static const char *sym_name = "igd_alter_ovl2";
8+
9+
static int pre_handler(struct kprobe *p, struct pt_regs *regs)
10+
{
11+
printk(KERN_INFO "pre_handler [%s]\n", sym_name);
12+
//dump_stack();
13+
return 0;
14+
}
15+
16+
static __init int init_mykp(void)
17+
{
18+
int ret;
19+
printk("%s: sym_name: %s\n", __func__, sym_name);
20+
kp.pre_handler = pre_handler;
21+
kp.symbol_name = sym_name;
22+
if ((ret = register_kprobe(&kp)) < 0) {
23+
printk("register_kprobe failed, returned %d\n", ret);
24+
return -1;
25+
}
26+
printk("Planted return probe at %p\n", kp.addr);
27+
return 0;
28+
}
29+
module_init(init_mykp);
30+
31+
static __exit void cleanup_mykp(void)
32+
{
33+
printk("%s\n", __func__);
34+
unregister_kprobe(&kp);
35+
}
36+
module_exit(cleanup_mykp);
37+
38+
MODULE_LICENSE("GPL");
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#include <linux/kernel.h>
2+
#include <linux/module.h>
3+
#include <linux/kprobes.h>
4+
#include <linux/kallsyms.h>
5+
6+
static const char *symbols[] = {
7+
"emgd_alter_ovl2",
8+
"emgd_alter_ovl",
9+
"gmm_alloc_region",
10+
};
11+
12+
#define NUM_SYMS sizeof(symbols) / sizeof (char *)
13+
14+
static struct kprobe kp_array[NUM_SYMS];
15+
static int pre_handler(struct kprobe *p, struct pt_regs *regs)
16+
{
17+
printk(KERN_INFO "pre_handler %s [%lx]\n", p->symbol_name, regs->ip);
18+
//dump_stack();
19+
return 0;
20+
}
21+
22+
static __init int init_mykp(void)
23+
{
24+
int idx;
25+
int ret;
26+
for (idx = 0; idx < NUM_SYMS; idx++) {
27+
struct kprobe *kp = &kp_array[idx];
28+
printk("%s: sym_name: %s\n", __func__, symbols[idx]);
29+
kp->pre_handler = pre_handler;
30+
kp->symbol_name = symbols[idx];
31+
if ((ret = register_kprobe(kp)) < 0) {
32+
printk("register_kprobe failed, returned %d\n", ret);
33+
goto error;
34+
}
35+
printk(" => Addr: %p\n", kp->addr);
36+
}
37+
return 0;
38+
39+
error:
40+
for (idx--; idx >= 0; idx--) {
41+
struct kprobe *kp = &kp_array[idx];
42+
unregister_kprobe(kp);
43+
}
44+
return 0;
45+
}
46+
module_init(init_mykp);
47+
48+
static __exit void cleanup_mykp(void)
49+
{
50+
int idx;
51+
for (idx = NUM_SYMS - 1; idx >= 0; idx--) {
52+
struct kprobe *kp = &kp_array[idx];
53+
printk("[%s] Unregister: %s\n", __func__, kp->symbol_name);
54+
unregister_kprobe(kp);
55+
}
56+
}
57+
module_exit(cleanup_mykp);
58+
59+
MODULE_LICENSE("GPL");

0 commit comments

Comments
 (0)