- 论坛徽章:
- 0
|
我还是贴出来吧,代码要是不公正,各位见谅吧
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 编辑 ] |
|