История изменений
Исправление m0rph, (текущая версия) :
Если я прав и ты действительно хочешь подменять системные вызовы, может быть этот пример тебе поможет:
#define CR0_WP 0x00010000 // Write Protect Bit
static unsigned long** sys_call_table;
asmlinkage long (*old_sys_open)(const char __user* filename, int flags, umode_t mode);
asmlinkage long new_sys_open(const char __user* filename, int flags, umode_t mode)
{
// TODO: Add code here
return 0;
}
static unsigned long** find_sys_call_table(void)
{
unsigned long int offset = PAGE_OFFSET;
while(offset < ULLONG_MAX) {
unsigned long** table = (unsigned long**) offset;
if(table[__NR_close] == (unsigned long*) sys_close)
return table;
offset += sizeof(void*);
}
return NULL;
}
static int __init interceptor_init(void)
{
if(!(sys_call_table = find_sys_call_table()))
return -1;
unsigned long cr0 = read_cr0();
write_cr0(cr0 & ~CR0_WP);
old_sys_open = (void*) sys_call_table[__NR_open];
sys_call_table[__NR_open] = (unsigned long*) new_sys_open;
write_cr0(cr0);
return 0;
}
Исправление m0rph, :
Если я прав и ты действительно хочешь подменять системные вызовы, может быть этот пример тебе поможет:
#define CR0_WP 0x00010000 // Write Protect Bit
static unsigned long** sys_call_table;
asmlinkage long (*old_sys_open)(const char __user* filename, int flags, umode_t mode);
asmlinkage long (*old_sys_creat)(const char __user* pathname, umode_t mode);
static unsigned long** find_sys_call_table(void)
{
unsigned long int offset = PAGE_OFFSET;
while(offset < ULLONG_MAX) {
unsigned long** table = (unsigned long**) offset;
if(table[__NR_close] == (unsigned long*) sys_close)
return table;
offset += sizeof(void*);
}
return NULL;
}
static int __init interceptor_init(void)
{
if(!(sys_call_table = find_sys_call_table()))
return -1;
unsigned long cr0 = read_cr0();
write_cr0(cr0 & ~CR0_WP);
old_sys_open = (void*) sys_call_table[__NR_open];
old_sys_creat = (void*) sys_call_table[__NR_creat];
sys_call_table[__NR_open] = (unsigned long*) new_sys_open;
sys_call_table[__NR_creat] = (unsigned long*) new_sys_creat;
write_cr0(cr0);
return 0;
}
Исходная версия m0rph, :
Если я прав и ты действительно хочешь подменять системные вызовы, может быть этот пример тебе поможет:
#define CR0_WP 0x00010000 // Write Protect Bit
static unsigned long** sys_call_table;
static unsigned long** find_sys_call_table(void)
{
unsigned long int offset = PAGE_OFFSET;
while(offset < ULLONG_MAX) {
unsigned long** table = (unsigned long**) offset;
if(table[__NR_close] == (unsigned long*) sys_close)
return table;
offset += sizeof(void*);
}
return NULL;
}
static int __init interceptor_init(void)
{
if(!(sys_call_table = find_sys_call_table()))
return -1;
unsigned long cr0 = read_cr0();
write_cr0(cr0 & ~CR0_WP);
old_sys_open = (void*) sys_call_table[__NR_open];
old_sys_creat = (void*) sys_call_table[__NR_creat];
write_cr0(cr0);
return 0;
}