@@ -176,7 +176,7 @@ int ksu_handle_execveat_ksud(int *fd, struct filename **filename_ptr,
176
176
return 0 ;
177
177
}
178
178
179
- if (unlikely (!memcmp (filename -> name , system_bin_init ,
179
+ if (unlikely (!memcmp (filename -> name , system_bin_init ,
180
180
sizeof (system_bin_init ) - 1 ) && argv )) {
181
181
// /system/bin/init executed
182
182
int argc = count (* argv , MAX_ARG_STRINGS );
@@ -472,6 +472,32 @@ static int execve_handler_pre(struct kprobe *p, struct pt_regs *regs)
472
472
return ksu_handle_execveat_ksud (fd , filename_ptr , & argv , NULL , NULL );
473
473
}
474
474
475
+ static int sys_execve_handler_pre (struct kprobe * p , struct pt_regs * regs )
476
+ {
477
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION (4 , 16 , 0 )
478
+ struct pt_regs * real_regs = (struct pt_regs * )PT_REGS_PARM1 (regs );
479
+ #else
480
+ struct pt_regs * real_regs = regs ;
481
+ #endif
482
+ const char __user * * filename_user = (const char * * )& PT_REGS_PARM1 (real_regs );
483
+ const char __user * const __user * __argv =
484
+ (const char __user * const __user * )PT_REGS_PARM2 (real_regs );
485
+ struct user_arg_ptr argv = { .ptr .native = __argv };
486
+ struct filename filename_in , * filename_p ;
487
+ char path [32 ];
488
+
489
+ if (!filename_user )
490
+ return 0 ;
491
+
492
+ memset (path , 0 , sizeof (path ));
493
+ ksu_strncpy_from_user_nofault (path , * filename_user , 32 );
494
+ filename_in .name = path ;
495
+
496
+ filename_p = & filename_in ;
497
+ return ksu_handle_execveat_ksud (AT_FDCWD , & filename_p , & argv , NULL ,
498
+ NULL );
499
+ }
500
+
475
501
// remove this later!
476
502
__maybe_unused static int vfs_read_handler_pre (struct kprobe * p , struct pt_regs * regs )
477
503
{
@@ -506,6 +532,12 @@ static int input_handle_event_handler_pre(struct kprobe *p,
506
532
return ksu_handle_input_handle_event (type , code , value );
507
533
}
508
534
535
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 10 , 0 )
536
+ static struct kprobe execve_kp = {
537
+ .symbol_name = SYS_EXECVE_SYMBOL ,
538
+ .pre_handler = sys_execve_handler_pre ,
539
+ };
540
+ #else
509
541
static struct kprobe execve_kp = {
510
542
#if LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 9 , 0 )
511
543
.symbol_name = "do_execveat_common" ,
@@ -516,6 +548,7 @@ static struct kprobe execve_kp = {
516
548
#endif
517
549
.pre_handler = execve_handler_pre ,
518
550
};
551
+ #endif
519
552
520
553
#if LINUX_VERSION_CODE >= KERNEL_VERSION (5 , 10 , 0 )
521
554
static struct kprobe vfs_read_kp = {
@@ -529,11 +562,20 @@ static struct kprobe vfs_read_kp = {
529
562
};
530
563
#endif
531
564
532
- static struct kprobe input_handle_event_kp = {
533
- .symbol_name = "input_handle_event " ,
565
+ static struct kprobe input_event_kp = {
566
+ .symbol_name = "input_event " ,
534
567
.pre_handler = input_handle_event_handler_pre ,
535
568
};
536
569
570
+ static struct kprobe input_inject_event_kp = {
571
+ .symbol_name = "input_inject_event" ,
572
+ .pre_handler = input_handle_event_handler_pre ,
573
+ };
574
+
575
+ static struct kprobe * input_event_kps [] = {
576
+ & input_event_kp , & input_inject_event_kp
577
+ };
578
+
537
579
static void do_stop_vfs_read_hook (struct work_struct * work )
538
580
{
539
581
unregister_kprobe (& vfs_read_kp );
@@ -546,7 +588,7 @@ static void do_stop_execve_hook(struct work_struct *work)
546
588
547
589
static void do_stop_input_hook (struct work_struct * work )
548
590
{
549
- unregister_kprobe ( & input_handle_event_kp );
591
+ unregister_kprobes ( input_event_kps , 2 );
550
592
}
551
593
#endif
552
594
@@ -600,7 +642,7 @@ void ksu_ksud_init()
600
642
ret = register_kprobe (& vfs_read_kp );
601
643
pr_info ("ksud: vfs_read_kp: %d\n" , ret );
602
644
603
- ret = register_kprobe ( & input_handle_event_kp );
645
+ ret = register_kprobes ( input_event_kps , 2 );
604
646
pr_info ("ksud: input_handle_event_kp: %d\n" , ret );
605
647
606
648
INIT_WORK (& stop_vfs_read_work , do_stop_vfs_read_hook );
@@ -614,6 +656,6 @@ void ksu_ksud_exit() {
614
656
unregister_kprobe (& execve_kp );
615
657
// this should be done before unregister vfs_read_kp
616
658
// unregister_kprobe(&vfs_read_kp);
617
- unregister_kprobe ( & input_handle_event_kp );
659
+ unregister_kprobes ( input_event_kps , 2 );
618
660
#endif
619
661
}
0 commit comments