免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5967 | 回复: 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
12 [报告]
发表于 2006-05-12 15:39 |只看该作者
p = (long)my_register_chrdev - (long)register_chrdev -(long)5;
printk打印出(long)my_register_chrdev是个8*******的地址
(long)register_chrdev 是system.map中该函数符号的地址大于3G,
相减后在减去5是要跳转的相对位移(i think)

论坛徽章:
0
11 [报告]
发表于 2006-05-12 09:54 |只看该作者
了解这是怎么回事了,问了两个弱弱的问题,不好意思。

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

论坛徽章:
0
9 [报告]
发表于 2006-05-12 09:40 |只看该作者
还想问一下,为什么是跳转到这里:
jmp  (long)my_register_chrdev - (long)register_chrdev + (long)5;
而不是直接跳转到这里呢?
jmp  (long)my_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
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
6 [报告]
发表于 2006-05-11 12:44 |只看该作者
估计是 do_gettimeofday 太常用了,导致的问题,你可以试试把struct timeval *tv置个确定的值或者直接调用原来的入口试试看,应该不会死机。

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



谢谢!了解了

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

回复 3楼 snow_insky 的帖子

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP