diff --git a/src/TaxiDriver.c b/src/TaxiDriver.c index 02281fe..73c2e0e 100644 --- a/src/TaxiDriver.c +++ b/src/TaxiDriver.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #define DRIVER_NAME "TaxiDriver" #define DRIVER @@ -72,6 +74,23 @@ int WPM(t_WPM args) { return ret; } +static uintptr_t list_process_modules(const char *mod) { + struct mm_struct *mm = task->mm; + struct vm_area_struct *vma; + VMA_ITERATOR(vmi, mm, 0); + + for_each_vma(vmi, vma) { + if (vma->vm_file) { + struct file *file = vma->vm_file; + printk(KERN_INFO "TaxiDriver: Shared Library: %s start: 0x%lx end: 0x%lx\n", + file->f_path.dentry->d_name.name, vma->vm_start, vma->vm_end); + if (strcmp(file->f_path.dentry->d_name.name, mod) == 0) + return (uintptr_t)vma->vm_start; + } + } + return 0; +} + static int init_process_by_pid(int target_pid) { printk(KERN_INFO "TaxiDriver: Accessing process with PID: %d\n", target_pid); @@ -82,7 +101,6 @@ static int init_process_by_pid(int target_pid) { if (task != NULL) { const char *process_name = task->comm; printk(KERN_INFO "TaxiDriver: Process with PID %d has name: %s\n", target_pid, process_name); - // Access and manipulate the process here put_task_struct(task); } else { printk(KERN_INFO "TaxiDriver: Process with PID %d not found\n", target_pid); @@ -101,10 +119,20 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num, unsigned lon { struct s_WPM wpm_args; struct s_RPM rpm_args; + const char *mod = kmalloc(sizeof(char) * 256, GFP_KERNEL); + if (!mod) + return -ENOMEM; int pid; - int return_value = 0; + long return_value = 0; switch (ioctl_num) { + case IOCTL_GETMODULE: + if (copy_from_user((void *)mod, (int *)arg, sizeof(char *))) + return -EFAULT; + return_value = list_process_modules(mod); + kfree(mod); + break; + case IOCTL_OPENPROC: if (copy_from_user(&pid, (int *)arg, sizeof(int))) return -EFAULT; @@ -115,6 +143,7 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num, unsigned lon if (copy_from_user(&rpm_args, (int *)arg, sizeof(t_RPM))) return -EFAULT; return_value = RPM(rpm_args); + put_user(return_value, rpm_args.out_addr); break; case IOCTL_WPM: diff --git a/src/client/communication_struct.h b/src/client/communication_struct.h index b19789a..b9c9dde 100644 --- a/src/client/communication_struct.h +++ b/src/client/communication_struct.h @@ -5,14 +5,17 @@ #include #endif -#define IOCTL_OPENPROC _IOW('k', 1, int) -#define IOCTL_RPM _IOW('k', 1, t_RPM) -#define IOCTL_WPM _IOW('k', 2, t_WPM) +#define IOCTL_OPENPROC _IOW('k', 1, int) +#define IOCTL_GETMODULE _IOW('k', 2, const char*) +#define IOCTL_RPM _IOW('k', 3, t_RPM) +#define IOCTL_WPM _IOW('k', 4, t_WPM) typedef struct s_RPM { uintptr_t addr; ssize_t size; + uintptr_t out; + uintptr_t *out_addr; } t_RPM; typedef struct s_WPM diff --git a/src/client/main.c b/src/client/main.c index b98e2d9..0dc85e5 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -1,4 +1,5 @@ #include "memory.h" +#include int main() { if (!open_device()) @@ -8,17 +9,16 @@ int main() { if (!open_process(pid)) return -1; + uintptr_t addr = get_module("nsnake"); + printf("module : 0x%lx\n", addr); struct s_WPM args_wpm; args_wpm.addr = 0x55a813479d70; args_wpm.size = 4; args_wpm.value = (uintptr_t)667; WPM(args_wpm); - struct s_RPM args; - args.addr = 0x55a813479d70; - args.size = sizeof(int); - int val = (int)RPM(args); - printf("Value from RPM: %d\n", val); + int out = (int)RPM(0x55a813479d70, sizeof(int)); + printf("Value from RPM: %d\n", out); close_device(); return 0; diff --git a/src/client/memory.c b/src/client/memory.c index 1cc62a3..97730a8 100644 --- a/src/client/memory.c +++ b/src/client/memory.c @@ -1,4 +1,6 @@ #include "memory.h" +#include "communication_struct.h" +#include #include #include #include @@ -22,17 +24,21 @@ void close_device(void) close(file_desc); } -void *RPM(t_RPM args) +void *RPM(uintptr_t address, ssize_t size) { - int ret; + struct s_RPM args; + args.addr = address; + args.size = size; + args.out = 0; + args.out_addr = &args.out; - ret = ioctl(file_desc, IOCTL_RPM, &args); + int ret = ioctl(file_desc, IOCTL_RPM, &args); if (ret < 0) { perror("Revird: RPM failed."); close(file_desc); return 0; } - return (void *)ret; + return (void *)args.out; } void WPM(t_WPM args) @@ -60,3 +66,15 @@ int open_process(int pid) } return 1; } + +uintptr_t get_module(const char *mod) +{ + int ret = ioctl(file_desc, IOCTL_GETMODULE, mod); + if (ret < 0) { + perror("Revird: getmodule failed."); + close(file_desc); + return -1; + } + + return ret; +} diff --git a/src/client/memory.h b/src/client/memory.h index 447cd01..031f6c9 100644 --- a/src/client/memory.h +++ b/src/client/memory.h @@ -4,6 +4,7 @@ int open_device(void); void close_device(void); -void *RPM(t_RPM args); +void *RPM(uintptr_t address, ssize_t size); void WPM(t_WPM args); int open_process(int pid); +uintptr_t get_module(const char *mod);