ldd学习笔记之EXPORT_SYMBOL & 隐藏内核模块

2756阅读 1评论2009-12-27 ubuntuer
分类:LINUX

   今日得闲,终日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

上一篇:浅析u盘等热插拔uevent事件用户空间截获方法和具体实现
下一篇:字符设备驱动程序1

文章评论