Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736
  • 博文数量: 2
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 21
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-27 19:50
文章分类
文章存档

2016年(2)

我的朋友
最近访客

分类: LINUX

2016-07-18 18:02:33

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

阅读(239) | 评论(0) | 转发(0) |
0

上一篇:移动支付身份认证方法

下一篇:没有了

给主人留下些什么吧!~~