@@ -30,7 +30,10 @@ int (*bpf_probe_read_user)(void *dst, u32 size,const void __user *unsafe_ptr) =
3030
3131unsigned long (* get_unmapped_area )(struct file * file , unsigned long addr , unsigned long len ,unsigned long pgoff , unsigned long flags ) = 0 ;
3232
33- void * xol_add_vma_addr ;
33+ char * (* special_mapping_name )(struct vm_area_struct * vma ) = 0 ;
34+
35+ void * install_special_mapping_addr ;
36+ void * create_xol_area_addr ;
3437void * copy_insn_addr ;
3538
3639
@@ -57,18 +60,27 @@ void before_copy_insn(hook_fargs5_t *args, void *udata){
5760 }
5861}
5962
60- void before_xol_add_vma ( hook_fargs2_t * args , void * udata ){
61- struct xol_area * o_area ;
63+ void before_create_xol_area ( hook_fargs1_t * args , void * udata ){
64+ unsigned long vaddr = ( unsigned long ) args -> arg0 ;
6265
63- o_area = (struct xol_area * )args -> arg1 ;
64- if (!o_area -> vaddr ){
65- o_area -> xol_mapping .name = "Kernel-Trace" ;
66- o_area -> vaddr = get_unmapped_area (NULL , 0 ,PAGE_SIZE , 0 , 0 );
67- logkd ("+Test-Log+ create map item:Kernel-Trace\n" );
66+ if (!vaddr ){
67+ vaddr = get_unmapped_area (NULL , 0 ,PAGE_SIZE , 0 , 0 );
68+ args -> arg0 = vaddr ;
69+ logkd ("+Test-Log+ change uprobe map addr to:%llx\n" ,vaddr );
6870 }
6971
7072}
7173
74+
75+ void before_install_special_mapping (hook_fargs6_t * args , void * udata ){
76+ struct vm_special_mapping * ospec ;
77+ ospec = (struct vm_special_mapping * )args -> arg4 ;
78+ if (strcmp (ospec -> name ,"[uprobes]" )== 0 ){
79+ ospec -> name = "Kernel-Trace" ;
80+ logkd ("+Test-Log+ create map item:Kernel-Trace\n" );
81+ }
82+ }
83+
7284void before_mincore (hook_fargs3_t * args , void * udata ){
7385 int trace_flag = (int )syscall_argn (args , 1 );
7486 if (trace_flag < TRACE_FLAG || trace_flag > TRACE_FLAG + CLEAR_UPROBE ){
@@ -231,8 +243,11 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
231243 bpf_probe_read_user = (typeof (bpf_probe_read_user ))kallsyms_lookup_name ("bpf_probe_read_user" );
232244
233245 get_unmapped_area = (typeof (get_unmapped_area ))kallsyms_lookup_name ("get_unmapped_area" );
246+ special_mapping_name = (typeof (special_mapping_name ))kallsyms_lookup_name ("special_mapping_name" );
234247
235- xol_add_vma_addr = (void * )kallsyms_lookup_name ("xol_add_vma" );
248+ install_special_mapping_addr = (void * )kallsyms_lookup_name ("__install_special_mapping" );
249+
250+ create_xol_area_addr = (void * )kallsyms_lookup_name ("__create_xol_area" );
236251
237252 copy_insn_addr = (void * )kallsyms_lookup_name ("__copy_insn" );
238253
@@ -254,15 +269,19 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
254269 logkd ("+Test-Log+ bpf_probe_read_user:%llx\n" ,bpf_probe_read_user );
255270
256271 logkd ("+Test-Log+ get_unmapped_area:%llx\n" ,get_unmapped_area );
272+ logkd ("+Test-Log+ special_mapping_name:%llx\n" ,special_mapping_name );
273+
274+ logkd ("+Test-Log+ install_special_mapping_addr:%llx\n" ,install_special_mapping_addr );
257275
258- logkd ("+Test-Log+ xol_add_vma_addr :%llx\n" ,xol_add_vma_addr );
276+ logkd ("+Test-Log+ create_xol_area_addr :%llx\n" ,create_xol_area_addr );
259277
260278 logkd ("+Test-Log+ copy_insn_addr:%llx\n" ,copy_insn_addr );
261279
262280 if (!(mtask_pid_nr_ns && uprobe_register && uprobe_unregister
263281 && kern_path && igrab && path_put && rcu_read_unlock
264282 && rb_erase && rb_insert_color && rb_first && trace_printk
265- && bpf_probe_read_user && get_unmapped_area && xol_add_vma_addr && copy_insn_addr )){
283+ && bpf_probe_read_user && get_unmapped_area && special_mapping_name
284+ && install_special_mapping_addr && create_xol_area_addr && copy_insn_addr )){
266285 logke ("+Test-Log+ can not find some fun addr\n" );
267286 return -1 ;
268287 }
@@ -275,9 +294,15 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
275294 return -1 ;
276295 }
277296
278- err = hook_wrap2 (xol_add_vma_addr , before_xol_add_vma , NULL , 0 );
297+ err = hook_wrap6 (install_special_mapping_addr , before_install_special_mapping , NULL , 0 );
298+ if (err ){
299+ logke ("+Test-Log+ hook install_special_mapping_addr error\n" );
300+ return -1 ;
301+ }
302+
303+ err = hook_wrap2 (create_xol_area_addr , before_create_xol_area , NULL , 0 );
279304 if (err ){
280- logke ("+Test-Log+ hook xol_add_vma error\n" );
305+ logke ("+Test-Log+ hook create_xol_area_addr error\n" );
281306 return -1 ;
282307 }
283308
@@ -301,7 +326,8 @@ static long kernel_trace_control0(const char *args, char *__user out_msg, int ou
301326static long kernel_trace_exit (void * __user reserved )
302327{
303328 inline_unhook_syscall (__NR_mincore , before_mincore , 0 );
304- unhook (xol_add_vma_addr );
329+ unhook (install_special_mapping_addr );
330+ unhook (create_xol_area_addr );
305331 unhook (copy_insn_addr );
306332 rcu_read_unlock ();//解锁,不然内核会崩
307333 for (int i = 0 ; i < hook_num ; ++ i ) {
0 commit comments