免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5936 | 回复: 11
打印 上一主题 下一主题

劫持内核函数do_gettimeofday为何总死机呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-05-10 19:15 |只看该作者 |倒序浏览
内核是2.6.15.4,想学习一下劫持内核函数的方法,于是写了一个模块劫持
arch/i386/kernel/time.c中的do_gettimeofday函数,
模块编译通过但是一旦加载就死机,
是因为此函数不能被劫持还是模块编写的有问题呢?
那位前辈大哥帮忙看看,不胜感激!!!!

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/time.h>

void do_gettimeofday(struct timeval *tv)
{
  printk("been here ,but do nothing");
}
u_char tmp[5];

static int __init init(void)
{
        u_char *buf;
        long p;
        printk("Hi, i'll replace do_gettimeofday()...\n");

        buf = (u_char *)do_gettimeofday;
        p = (long)my_do_gettimeofday - (long)do_gettimeofday + (long)5;
        memcpy(tmp, buf, 5);
        buf[0] = 0xe9;
        memcpy( buf + 1, &p, 4);

        return 0;
}

static void __exit fini(void)
{
        u_char *buf;
        printk("Hi, i'll restore do_gettimeofday...\n");

        buf = (u_char *)do_gettimeofday;
        memcpy(buf, tmp, 5);
}

module_init(init);
module_exit(fini);
MODULE_LICENSE("GPL");

论坛徽章:
0
2 [报告]
发表于 2006-05-10 19:18 |只看该作者
其实我完全是看了近期的一篇关于劫持函数的贴子后,
先作的是如下的模块,完全按照CLF的teawater兄的方法做的,
加载没问题,不会死机的,但改成另一个函数就老死机,怎末回事呢:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/fs.h> //register_chrdev

int my_register_chrdev(unsigned int major, const char *name, struct file_operations *fops)
{
        printk("Hi, do you really want to call register_chrdev?\n");
        return -1;
}

u_char tmp[5];

static int __init init(void)
{
        u_char *buf;
        long p;
        printk("Hi, i'll replace register_chrdev()...\n");

        buf = (u_char *)register_chrdev;
        p = (long)my_register_chrdev - (long)register_chrdev + (long)5;
        memcpy(tmp, buf, 5);
        buf[0] = 0xe9;
        memcpy( buf + 1, &p, 4);

        return 0;
}

static void __exit fini(void)
{
        u_char *buf;
        printk("Hi, i'll restore register_chrdev()...\n");

        buf = (u_char *)register_chrdev;
        memcpy(buf, tmp, 5);
}

module_init(init);
module_exit(fini);
MODULE_LICENSE("GPL");

论坛徽章:
0
3 [报告]
发表于 2006-05-11 10:31 |只看该作者
请问各位高手,在Linux内核中,函数是如何定位的?
为什么如下这般覆盖一下就可以替换函数体?

buf = (u_char *)register_chrdev;
p = (long)my_register_chrdev - (long)register_chrdev + (long)5;
memcpy(tmp, buf, 5);
buf[0] = 0xe9;
memcpy( buf + 1, &p, 4);

先谢谢了!

论坛徽章:
0
4 [报告]
发表于 2006-05-11 10:36 |只看该作者

回复 3楼 snow_insky 的帖子

哪個0xe9是jmp指令, 無條件跳轉到新函數。
茶總自己說的

论坛徽章:
0
5 [报告]
发表于 2006-05-11 11:41 |只看该作者
原帖由 albcamus 于 2006-5-11 10:36 发表
哪個0xe9是jmp指令, 無條件跳轉到新函數。
茶總自己說的



谢谢!了解了

论坛徽章:
0
6 [报告]
发表于 2006-05-11 12:44 |只看该作者
估计是 do_gettimeofday 太常用了,导致的问题,你可以试试把struct timeval *tv置个确定的值或者直接调用原来的入口试试看,应该不会死机。

论坛徽章:
0
7 [报告]
发表于 2006-05-11 12:48 |只看该作者
buf = (u_char *)register_chrdev;
        p = (long)my_register_chrdev - (long)register_chrdev + (long)5;
        memcpy(tmp, buf, 5);
        buf[0] = 0xe9;
        memcpy( buf + 1, &p, 4);
上述
====>
jmp  (long)my_register_chrdev - (long)register_chrdev + (long)5;
内核空间直接就跳转到了my_register_chrdev.
至于do_gettimeofday,估计是系统需要不断的通过这个调用来获取时间,你把他改了以后系统无法获取时间。。而内核出错一般都会导致死机的。而register_chrdev,这个函数一般是用户在加载模块的时候主动调用的,所以不会出现死机的 情况。
。自己的理解,没有经过论证。请高手指正。

论坛徽章:
0
8 [报告]
发表于 2006-05-11 14:44 |只看该作者
buf = (u_char *)register_chrdev;
        p = (long)my_register_chrdev - (long)register_chrdev + (long)5;
        memcpy(tmp, buf, 5);
        buf[0] = 0xe9;
        memcpy( buf + 1, &p, 4);

这里错了一处,应该是减去(long)5 ,我看到别人的贴子没搞明白就直接用了,又选择了do_gettimeofday这个系统不断使用的函数,所以老死机
按照楼上jobman所说我又试了试,不死了

感谢给与帮助的朋友们

论坛徽章:
0
9 [报告]
发表于 2006-05-12 09:40 |只看该作者
还想问一下,为什么是跳转到这里:
jmp  (long)my_register_chrdev - (long)register_chrdev + (long)5;
而不是直接跳转到这里呢?
jmp  (long)my_register_chrdev;

论坛徽章:
0
10 [报告]
发表于 2006-05-12 09:44 |只看该作者
memcpy( buf + 1, &p, 4);
不对吧,这句话的意思应该是跳转到p的地址处,和p的值是没有关系的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP