diff --git a/src/TaxiDriver.c b/src/TaxiDriver.c index e9e7d37..af40d71 100644 --- a/src/TaxiDriver.c +++ b/src/TaxiDriver.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -22,6 +23,26 @@ static int device_release(struct inode *inode, struct file *file) return 0; } +int RPM(t_RPM args) { + struct mm_struct *mm; + unsigned long value = 0; + + printk(KERN_ALERT "TaxiDriver: RPM --> addr : 0x%lx, size : %ld\n", rpm_args.addr, rpm_args.size); + if (args.addr == 0) + return -1; + mm = get_task_mm(task); + if (mm != NULL) { + if (access_process_vm(task, args.addr, &value, args.size, 0) == args.size) { + printk(KERN_INFO "TaxiDriver: Value at 0x%lx: %lu\n", args.addr, value); + mmput(mm); + } else { + printk(KERN_INFO "TaxiDriver: Failed to read value at 0x%lx\n", args.addr); + return -1; + } + } + return (int)value; +} + static int init_process_by_pid(int target_pid) { printk(KERN_INFO "TaxiDriver: Accessing process with PID: %d\n", target_pid); @@ -64,8 +85,7 @@ static long device_ioctl(struct file *file, unsigned int ioctl_num, unsigned lon case IOCTL_RPM: if (copy_from_user(&rpm_args, (int *)arg, sizeof(t_RPM))) return -EFAULT; - printk(KERN_ALERT "TaxiDriver: RPM --> addr : %ld, size : %ld\n", rpm_args.addr, rpm_args.size); - return_value = 1337; + return_value = RPM(rpm_args); break; case IOCTL_WPM: diff --git a/src/client/main.c b/src/client/main.c index 2ec39a4..57f7779 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -4,18 +4,18 @@ int main() { if (!open_device()) return -1; - int pid = 25801; + int pid = 55803; if (!open_process(pid)) return -1; struct s_RPM args; - args.addr = 0x420; - args.size = 4; + args.addr = 0x55a813479d70; + args.size = sizeof(int); int val = (int)RPM(args); printf("Value from RPM: %d\n", val); struct s_WPM args_wpm; - args_wpm.addr = 0x420; + args_wpm.addr = 0x55a813479d7; args_wpm.size = 4; args_wpm.value = (uintptr_t)667; WPM(args_wpm);