免费注册 查看新帖 |

Chinaunix

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

LKM问题,动态查找sys_call_table相关 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-22 16:59 |只看该作者 |倒序浏览
麻烦看下链接,我就不在重写了(这个论坛上发代码可以向csdn上那样吗?)

http://topic.csdn.net/u/20080721/22/16a6e7f8-97a7-414f-b823-c462fcdc06f3.html

论坛徽章:
0
2 [报告]
发表于 2008-07-22 19:42 |只看该作者

我还是贴出来吧,代码要是不公正,各位见谅吧

1. 在编写模块是每次insmod后都无法卸载模块,只能重启,网上说是因为编译内核时没有把卸载模块选项选中,我直接装的linux,没机会选阿,难道我要重新编译一次内核?
2. 我在2.6内核下调一个模块,大致这样:动态查找系统调用表,然后替换其中的系统调用,不过每次insmod都是段错误,帮忙看看错在那里。。。
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm/unistd.h>
#include <linux/sched.h>

unsigned long *sys_call_table = NULL;
//typedef int (*funcType)(const char*,int);
//funcType orig_mkdir;
asmlinkage int (*orig_mkdir)(const char*,int mode);

struct idt_tag
{
    unsigned short offset_low,segment_select;
    unsigned char reserved,flags;
    unsigned short offset_high;
};

static unsigned long* getSyscallTable(void)
{
    unsigned char idtr[6],*shell,*sort;
    struct idt_tag *idt;
    unsigned long system_call,sct;
    unsigned short offset_low,offset_high;
    char *p;
    int i;
    __asm__("sidt %0":"=m"(idtr));
    idt = (struct idt_tag*)((*(unsigned long*)&idtr[2]) + 8 * 0x80);
    offset_low = idt->offset_low;
    offset_high = idt->offset_high;
    system_call = (offset_high)<<16 | offset_low;   
    shell = (char*)system_call;
    sort = "\xff\x14\x85";

    for(i = 0;i < 100-2;i++)
        if(shell[ i ] == sort[0] && shell[i+1] == sort[1] && shell[i+2] == sort[2])
            break;
    p = &shell[ i ] + 3;
    sct = *(unsigned long*)p;
    return (unsigned long*)(sct);   
}

asmlinkage int hack_mkdir(const char* pathname,int mode)
{
    printk("called sys_mkdir,but gain nothing,hei hei!!\n");
    return 0;
}

static int __init myinit(void)
{
    sys_call_table = (unsigned long*)getSyscallTable();
    orig_mkdir = (asmlinkage int(*)(const char*,int))sys_call_table[__NR_mkdir];
    sys_call_table[__NR_mkdir] = (unsigned long)hack_mkdir;
    return 0;
}

static void __exit myexit(void)
{
    sys_call_table[__NR_mkdir] = (unsigned long)orig_mkdir;
}

module_init(myinit);
module_exit(myexit);

[ 本帖最后由 LZHWWY 于 2008-7-22 21:54 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-07-22 21:24 |只看该作者
根据我用printk调试, myinit()函数中的下面一句会导致错误
sys_call_table[__NR_mkdir] = (unsigned long)hack_mkdir;

但为什么呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2008-07-24 10:16 |只看该作者
你make menuconfig看一下,你的内核是否是允许动态加载模块的,按理说你可以insmod的话,应该内核是可以动态加载模块的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP