请教通过module hijack syscall_table的方法修改系统调用函数的地址
想测试一下自己写的系统调用函数,如果每次都重编译一次内核太麻烦了,到网上找了一下,发现可以通过查找,找到了如下资料
http://technica.blogbus.com/logs/18945123.html
http://www.linuxeden.com/html/develop/20071031/36891.html
http://hi.baidu.com/tigerwooz/blog/item/cfe3e6a285990ea5cbefd0ae.html
,其中一个源码如下:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
MODULE_LICENSE("Dual BSD/GPL");
#define __NR_newhandler 333
struct {
unsigned short limit;
unsigned int base;
} __attribute__((packed)) idtr;
struct {
unsigned short off1;
unsigned short sel;
unsigned char none, flags;
unsigned short off2;
} __attribute__((packed)) idt;
unsigned int** syscall_table;
unsigned int old_handler;
asmlinkage int sys_newhandler(void) {
printk(KERN_ALERT "Inside new_handler().\n");
return 0;
}
unsigned int get_sys_call_table(void)
{
unsigned int sys_call_off;
unsigned int sys_call_table;
char* p;
int i;
// 获取中断描述符表寄存器的地址
asm("sidt %0":"=m"(idtr));
printk("addr of idtr: %x\n", (int)&idtr);
// 获取0x80中断处理程序的地址
memcpy(&idt, idtr.base+8*0x80, sizeof(idt));
sys_call_off=((idt.off2<<16)|idt.off1);
printk("addr of idt 0x80: %x\n", sys_call_off);
// 从0x80中断服务例程中搜索sys_call_table的地址
p=sys_call_off;
for (i=0; i<100; i++)
{
if (p[i]=='\xff' && p[i+1]=='\x14' && p[i+2]=='\x85')
{
sys_call_table=*(unsigned int*)(p+i+3);
printk("addr of sys_call_table: %x\n", sys_call_table);
return sys_call_table;
}
}
return 0;
}
static int mymod_init(void) {
syscall_table = (unsigned int*)get_sys_call_table();
old_handler = syscall_table[__NR_newhandler];
//篡改内存中的syscall_table中ofset为__NR_newhandler处的内容,也就是编号
//为 __NR_newhandler的syscall的处理程序的入口
syscall_table[__NR_newhandler] = (unsigned long)sys_newhandler;
return 0;
}
static int mymod_exit(void){
printk("over\n");
return 0;
}
module_init(mymod_init);
module_exit(mymod_exit);
我按这个方法试了,但总是在insmod 的时候报Segment Error,在执行倒数第八行
//为 __NR_newhandler的syscall的处理程序的入口
syscall_table[__NR_newhandler] = (unsigned long)sys_newhandler;
这条语句之前出错。想问一下哪位之前研究过这个,并且成功修改了调用表某个函数的地址的,望赐教。
这个问题我研究了好几天,仍不解,对 了,我的内核版本是2.6.29的,网上说上面这个方法是2.6.20左右的,但这个我看不出会是版本问题。
希望有见解的都帮帮忙,不胜感激!