LINUX.ORG.RU

История изменений

Исправление 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;
}