今日得闲,终日read fucking code,现在也终于可以读读圣贤书好好的系统的学习学习了...虽然很多东西开发过程中都已经实现,不过系统的学习学习理论还是没有的!so just do it^_^
export_symbol大家应该不会默认,模块之间如果有依赖关系除了extern之外还都需要在源文件中用到这个东西.具体看代码吧,有EXPORT_SYMBOL函数和变量的...
隐藏内核模块代码,首先是要弄清楚的struct module结构体,再就是内核中模块都是以链表的形式链接起来的也就是全局变量module_list的指向中...
好了看fucking code吧
export1.c
#include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL");
int var_c = 10; EXPORT_SYMBOL(var_c);
int test_export_fun(int a, int b) { return a+b; } EXPORT_SYMBOL(test_export_fun);
/* * init and exit */
static int __init init_export1(void) { printk("init_export\n"); return 0; }
static void __exit exit_export1(void) { printk("exit_export\n"); } module_init(init_export1); module_exit(exit_export1);
|
export2.c
#include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("GPL");
extern int var_c; extern int test_export_fun(int , int);
/* * init and exit */
static int __init init_export2(void) { printk("init_export2\n"); printk("var_c is %d\n", var_c); printk("fun ret is %d\n", test_export_fun(1, 2)); return 0; }
static void __exit exit_export2(void) { printk("exit_export2\n"); } module_init(init_export2); module_exit(exit_export2);
|
clean.c://用于隐藏内核模块
#include <linux/kernel.h> #include <linux/module.h>
static int __init init_clean(void) { if (__this_module.list.next) __this_module.list.next = __this_module.list.next->next; printk("init_clean\n"); return 0; }
static void __exit exit_clean(void) { printk("exit_clean\n"); }
module_init(init_clean); module_exit(exit_clean);
MODULE_LICENSE("GPL");
|
Makefile:
obj-m := export1.o export2.o clean.o
KDIR := /lib/modules/$(shell uname -r)/build/ PWD := $(shell pwd)
all:module
module: $(MAKE) -C $(KDIR) M=$(PWD) modules
clean: rm -rf *.ko *.mod.c *.o Module.* modules.* .*.cmd .tmp_versions
|
使用的时候先Make在开另一个端口tailf /var/log/messages
insmod的顺序是export1.ko export2.ko clean.ko
看到export2输出的结果了吧, lsmod | grep export就可以看到已经隐藏了内核模块export2了,由此也可以猜想出内核list的add是在头部add