/* * Greets: All GNU Generation * * Author: Paulus Gandung Prakosa (syn-attack@devilzc0de.org) */ #include #include #include #include #define __vsys_fatal_error(msg) { \ printk(KERN_ERR msg); \ } #define __vsys_out(msg, fmt...) { \ printk(KERN_INFO msg, ##fmt); \ } #define __self_likely(arg) __builtin_expect(!!(arg), 1) #define __self_unlikely(arg) __builtin_expect(!!(arg), 0) struct control_register { unsigned long __cr0; unsigned long __cr2; unsigned long __cr3; } __attribute__ ((packed)); static int __init __self_module_loader(void) { struct control_register *cr_t; cr_t = kmalloc(sizeof(*cr_t), GFP_KERNEL); if (__self_unlikely(cr_t == NULL)) { __vsys_fatal_error("Not enough memory to allocate.\n"); return -1; } #ifdef __x86_64__ __vsys_out("Current system architecture is 64-bit.\n"); asm volatile("movl %%cr0, %%rax\n" "movl %%rax, %0\n" "xorl %%rax, %%rax\n" "movl %%cr2, %%rax\n" "movl %%rax, %1\n" "xorl %%rax, %%rax\n" "movl %%cr3, %%rax\n" "movl %%rax, %2\n" "xorl %%rax, %%rax\n" : "=r" (cr_t->__cr0), "=r" (cr_t->__cr2), "=r" (cr_t->__cr3)); #elif defined(__i386__) __vsys_out("Current system architecture is 32-bit.\n"); asm volatile("movl %%cr0, %%eax\n" "movl %%eax, %0\n" "xorl %%eax, %%eax\n" "movl %%cr2, %%eax\n" "movl %%eax, %1\n" "xorl %%eax, %%eax\n" "movl %%cr3, %%eax\n" "movl %%eax, %2\n" "xorl %%eax, %%eax\n" : "=r" (cr_t->__cr0), "=r" (cr_t->__cr2), "=r" (cr_t->__cr3)); #endif __vsys_out("cr0: 0x%08lx\n", cr_t->__cr0); __vsys_out("cr2: 0x%08lx\n", cr_t->__cr2); __vsys_out("cr3: 0x%08lx\n", cr_t->__cr3); kfree(cr_t); return 0; } static void __exit __self_module_unloader(void) { __vsys_out("Overall process done.\n"); return; } MODULE_AUTHOR("Paulus Gandung Prakosa (syn-attack@devilzc0de.org)"); MODULE_DESCRIPTION("Control Register"); MODULE_LICENSE("GPL"); module_init(__self_module_loader); module_exit(__self_module_unloader);