Пример #1
0
char* str_remove_duplicates(char *str) {
    char *w = str;
    char *r = str;
    char last_char = 'a';

    set_page_rw((ptr_t) str);

    while (*r) {
        if (*r == '/') {
            if (last_char != '/') {
                *w++ = *r;
                last_char = *r;
            }
        } else {
            *w++ = *r;
            last_char = *r;
        }
        r++;
    }

    *w = 0;
    set_page_ro((ptr_t) str);

    return str;
}
Пример #2
0
void cleanup_module(void) {
	printk(KERN_INFO "Filesystem Hierarchy Protection for LINUX(tm) Shutting Down...\n");

	if (sys_call_table[__NR_open] != our_sys_open) {
		printk(KERN_WARNING "The current open system call is not the one we replaced."
		       " There may be issues...");
	}

	set_page_rw((long unsigned int)sys_call_table);
	sys_call_table[__NR_open] = original_open_call;
	sys_call_table[__NR_unlink] = original_unlink_call;
	sys_call_table[__NR_unlinkat] = original_unlink_at_call;
	sys_call_table[__NR_mmap] = original_mmap_call;
	set_page_ro((long unsigned int)sys_call_table);
}
Пример #3
0
/*
 * These are the module load and unload functions. Relatively basic
 * stuff.
 */
int init_module(void) {
	printk(KERN_INFO "Filesystem Hierarchy Protection for LINUX(tm) Starting Up...\n");

	// WARNING: following will fail on a relocatable kernel!
	sys_call_table = (void **)0xffffffff81801400;
	original_open_call = sys_call_table[__NR_open];
	original_unlink_call = sys_call_table[__NR_unlink];
	original_unlink_at_call = sys_call_table[__NR_unlinkat];
	original_mmap_call = sys_call_table[__NR_mmap];
	getuid_call = sys_call_table[__NR_getuid];

	set_page_rw((long unsigned int)sys_call_table);
	sys_call_table[__NR_open] = our_sys_open;
	sys_call_table[__NR_unlink] = our_sys_unlink;
	sys_call_table[__NR_unlinkat] = our_sys_unlinkat;
	sys_call_table[__NR_mmap] = our_sys_mmap;
	set_page_ro((long unsigned int)sys_call_table);
	return 0;
}