4,436
社区成员
发帖
与我相关
我的任务
分享
static asmlinkage long hijack_mkdir(const char *pathname, int mode)
{
printk("%s\n",pathname);
return orig_mkdir(pathname, mode);
}
asmlinkage long hijack_mkdir(const char *pathname, int mode)
{
return orig_mkdir(pathname, mode);
}
static asmlinkage long (*orig_mkdir)(const char *pathname, int mode);
也就是asmlinkage 加上了
00000000 <hijack_mkdir>:
0: 8b 0d 08 00 00 00 mov 0x8,%ecx
6: ff e1 jmp *%ecx
8: 90 nop
9: 8d b4 26 00 00 00 00 lea 0x0(%esi),%esi
00000000 <hijack_mkdir>:
0: 8b 54 24 08 mov 0x8(%esp),%edx
4: 8b 44 24 04 mov 0x4(%esp),%eax
8: ff 15 08 00 00 00 call *0x8
e: f3 c3 repz ret
#include <linux/init.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/timer.h>
#include <asm/unistd.h>
#include <asm/errno.h>
//#define HOST
MODULE_LICENSE("Dual BSD/GPL");
static void **hijack_sys_call_table;
static int (*orig_open)(const char *filename, int flags, int mode);
static asmlinkage long (*orig_mkdir)(const char *pathname, int mode);
static struct timer_list deamon_timer;
static struct {
unsigned short limit;
unsigned int base;
} __attribute__((packed)) idtr;
static struct {
unsigned short off_low;
unsigned short sel;
unsigned char none, flags;
unsigned short off_high;
} __attribute__((packed)) idt;
static asmlinkage long hijack_mkdir(const char *pathname, int mode)
{
printk("%s,%d\n",pathname,mode);
return (asmlinkage)orig_mkdir(pathname, mode);
}
static int get_sys_call_table(void)
{
unsigned int sys_call_off;
char* p;
int i;
// 获取中断描述符表寄存器的地址
asm("sidt %0":"=m"(idtr));
printk("addr of idtr: %x\n", &idtr);
// 获取0x80中断处理程序的地址
memcpy(&idt, idtr.base+8*0x80, sizeof(idt));
sys_call_off=((idt.off_high<<16)|idt.off_low);
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')
{
hijack_sys_call_table=(void **)(*(unsigned int*)(p+i+3));
printk("addr of sys_call_table: %x\n", hijack_sys_call_table);
return 0;
}
}
return -1;
}
static void deamon_timer_handler(unsigned long arg)
{
printk("time out\n");
hijack_sys_call_table[__NR_mkdir]=orig_mkdir;
del_timer(&deamon_timer);
}
static void deamon_timer_init(struct timer_list *timer)
{
init_timer(timer);
timer->function=deamon_timer_handler;
timer->data=0;
timer->expires=jiffies+HZ*20;
add_timer(timer);
}
static int hijack_init()
{
printk("init module\n");
#ifdef HOST
if(get_sys_call_table() == -1)
{
printk("check sys_call_table failed!\n");
return -1;
}
#else
hijack_sys_call_table = (void **)0xc0325500;
#endif
printk("now initialize timer\n");
deamon_timer_init(&deamon_timer);
orig_mkdir=hijack_sys_call_table[__NR_mkdir];
hijack_sys_call_table[__NR_mkdir]=hijack_mkdir;
return 0;
}
static void hijack_exit()
{
printk("bye hijack\n");
hijack_sys_call_table[__NR_mkdir]=orig_mkdir;
return ;
}
module_init(hijack_init);
module_exit(hijack_exit);
static asmlinkage long hijack_mkdir(const char *pathname, int mode)
{
return 0 ;
}