mirror of
https://github.com/bashrc/LKMPG.git
synced 2018-06-11 03:06:54 +02:00
reversed syscall for the 4.14 kernel
This commit is contained in:
@@ -25,7 +25,7 @@
|
|||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
|
||||||
sys_call_ptr_t *sys_call_table_ptr;
|
unsigned long **sys_call_table;
|
||||||
unsigned long original_cr0;
|
unsigned long original_cr0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -87,18 +87,15 @@ asmlinkage int our_sys_open(const char *filename, int flags, int mode)
|
|||||||
return original_call(filename, flags, mode);
|
return original_call(filename, flags, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static sys_call_ptr_t *aquire_sys_call_table(void)
|
static unsigned long **aquire_sys_call_table(void)
|
||||||
{
|
{
|
||||||
unsigned long int offset = PAGE_OFFSET;
|
unsigned long int offset = PAGE_OFFSET;
|
||||||
/* unsigned long **sct; */
|
unsigned long **sct;
|
||||||
sys_call_ptr_t *sct;
|
|
||||||
|
|
||||||
while (offset < ULLONG_MAX) {
|
while (offset < ULLONG_MAX) {
|
||||||
/* sct = (unsigned long **)offset; */
|
sct = (unsigned long **)offset;
|
||||||
sct = (sys_call_ptr_t *)offset;
|
|
||||||
|
|
||||||
/* if (sct[__NR_close] == (unsigned long *) sys_close) */
|
if (sct[__NR_close] == (unsigned long *) sys_close)
|
||||||
if (sct[__NR_close] == (sys_call_ptr_t) sys_close)
|
|
||||||
return sct;
|
return sct;
|
||||||
|
|
||||||
offset += sizeof(void *);
|
offset += sizeof(void *);
|
||||||
@@ -109,7 +106,7 @@ static sys_call_ptr_t *aquire_sys_call_table(void)
|
|||||||
|
|
||||||
static int __init syscall_start(void)
|
static int __init syscall_start(void)
|
||||||
{
|
{
|
||||||
if(!(sys_call_table_ptr = aquire_sys_call_table()))
|
if(!(sys_call_table = aquire_sys_call_table()))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
original_cr0 = read_cr0();
|
original_cr0 = read_cr0();
|
||||||
@@ -117,10 +114,10 @@ static int __init syscall_start(void)
|
|||||||
write_cr0(original_cr0 & ~0x00010000);
|
write_cr0(original_cr0 & ~0x00010000);
|
||||||
|
|
||||||
/* keep track of the original open function */
|
/* keep track of the original open function */
|
||||||
original_call = (void*)sys_call_table_ptr[__NR_open];
|
original_call = (void*)sys_call_table[__NR_open];
|
||||||
|
|
||||||
/* use our open function instead */
|
/* use our open function instead */
|
||||||
sys_call_table_ptr[__NR_open] = (sys_call_ptr_t)our_sys_open;
|
sys_call_table[__NR_open] = (unsigned long *)our_sys_open;
|
||||||
|
|
||||||
write_cr0(original_cr0);
|
write_cr0(original_cr0);
|
||||||
|
|
||||||
@@ -131,14 +128,14 @@ static int __init syscall_start(void)
|
|||||||
|
|
||||||
static void __exit syscall_end(void)
|
static void __exit syscall_end(void)
|
||||||
{
|
{
|
||||||
if(!sys_call_table_ptr) {
|
if(!sys_call_table) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the system call back to normal
|
* Return the system call back to normal
|
||||||
*/
|
*/
|
||||||
if (sys_call_table_ptr[__NR_open] != (sys_call_ptr_t) our_sys_open) {
|
if (sys_call_table[__NR_open] != (unsigned long *)our_sys_open) {
|
||||||
pr_alert("Somebody else also played with the ");
|
pr_alert("Somebody else also played with the ");
|
||||||
pr_alert("open system call\n");
|
pr_alert("open system call\n");
|
||||||
pr_alert("The system may be left in ");
|
pr_alert("The system may be left in ");
|
||||||
@@ -146,7 +143,7 @@ static void __exit syscall_end(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
write_cr0(original_cr0 & ~0x00010000);
|
write_cr0(original_cr0 & ~0x00010000);
|
||||||
sys_call_table_ptr[__NR_open] = (sys_call_ptr_t)original_call;
|
sys_call_table[__NR_open] = (unsigned long *)original_call;
|
||||||
write_cr0(original_cr0);
|
write_cr0(original_cr0);
|
||||||
|
|
||||||
msleep(2000);
|
msleep(2000);
|
||||||
|
|||||||
Reference in New Issue
Block a user