1313#include "kernel_trace.h"
1414
1515KPM_NAME ("kernel_trace" );
16- KPM_VERSION ("6.0 .0" );
16+ KPM_VERSION ("6.1 .0" );
1717KPM_LICENSE ("GPL v2" );
1818KPM_AUTHOR ("Test" );
1919KPM_DESCRIPTION ("use uprobe trace some fun in kpm" );
@@ -27,7 +27,7 @@ void (*path_put)(const struct path *path) = 0;
2727void (* rcu_read_unlock )(void ) = 0 ;
2828int (* trace_printk )(unsigned long ip , const char * fmt , ...) = 0 ;
2929
30- int ( * bpf_probe_read_user )(void * dst , u32 size , const void __user * unsafe_ptr ) = 0 ;
30+ unsigned long ( * arch_copy_from_user )(void * to , const void __user * from , unsigned long n ) = 0 ;
3131
3232unsigned long (* get_unmapped_area )(struct file * file , unsigned long addr , unsigned long len ,unsigned long pgoff , unsigned long flags ) = 0 ;
3333
@@ -145,22 +145,18 @@ void before_mincore(hook_fargs3_t *args, void *udata){
145145 }
146146
147147 void * uuprobe_item = (void * )syscall_argn (args , 2 );
148- struct uprobe_item_info * uprobe_item = NULL ;
149- uprobe_item = kmalloc (sizeof (struct uprobe_item_info ), GFP_KERNEL );
150- if (!uprobe_item ){
151- logke ("+Test-Log+ Failed to allocate memory with kmalloc\n" );
152- goto error_out ;
153- }
154148
155- if (bpf_probe_read_user (uprobe_item ,sizeof (struct uprobe_item_info ),uuprobe_item )< 0 ){
156- logke ("+Test-Log+ bpf_probe_read_user error\n" );
149+ struct uprobe_item_info uprobe_item = {};
150+
151+ if (arch_copy_from_user (& uprobe_item ,uuprobe_item ,sizeof (struct uprobe_item_info ))< 0 ){
152+ logke ("+Test-Log+ arch_copy_from_user error\n" );
157153 goto error_out ;
158154 }
159155
160156
161- unsigned long fun_offset = (unsigned long )uprobe_item -> fun_offset ;
157+ unsigned long fun_offset = (unsigned long )uprobe_item . fun_offset ;
162158 char fun_name [MAX_FUN_NAME ];
163- compat_strncpy_from_user (fun_name ,uprobe_item -> fun_name ,sizeof (fun_name ));
159+ compat_strncpy_from_user (fun_name ,uprobe_item . fun_name ,sizeof (fun_name ));
164160
165161 int insert_ret = insert_key_value (& fun_info_tree ,fun_offset ,fun_name ,strlen (fun_name ));
166162 if (insert_ret == -1 ){
@@ -169,10 +165,9 @@ void before_mincore(hook_fargs3_t *args, void *udata){
169165 }
170166 logkd ("+Test-Log+ fun_name:%s,fun_offset:%llx\n" ,fun_name ,fun_offset );
171167
172- unsigned long rfun_offset = uprobe_item -> uprobe_offset ;
168+ unsigned long rfun_offset = uprobe_item . uprobe_offset ;
173169 unsigned int f_idx = fun_offset >> PAGE_SHIFT ;
174170 insert_key_value (& fix_idx_tree ,rfun_offset >> PAGE_SHIFT ,& f_idx ,4 );
175- kfree (uprobe_item );
176171
177172 int hret = uprobe_register (inode ,rfun_offset ,& trace_uc );
178173 if (hret < 0 ){
@@ -189,25 +184,20 @@ void before_mincore(hook_fargs3_t *args, void *udata){
189184
190185 if (trace_flag_num == SET_TRACE_INFO ){
191186 void * utrace_info = (void * )syscall_argn (args , 2 );
192- struct trace_init_info * base_info = NULL ;
193- base_info = kmalloc (sizeof (struct trace_init_info ), GFP_KERNEL );
194- if (!base_info ){
195- logke ("+Test-Log+ Failed to allocate memory with kmalloc\n" );
196- goto error_out ;
197- }
198-
199- if (bpf_probe_read_user (base_info ,sizeof (struct trace_init_info ),utrace_info )< 0 ){
200- logke ("+Test-Log+ bpf_probe_read_user error\n" );
187+ struct trace_init_info base_info = {};
188+ int ret = arch_copy_from_user (& base_info ,utrace_info ,sizeof (struct trace_init_info ));
189+ if (ret < 0 ){
190+ logke ("+Test-Log+ arch_copy_from_user error:%d\n" ,ret );
201191 goto error_out ;
202192 }
203193
204- target_uid = (uid_t )base_info -> uid ;
194+ target_uid = (uid_t )base_info . uid ;
205195 logkd ("+Test-Log+ set target_uid:%d\n" ,target_uid );
206196
207- module_base = (unsigned long )base_info -> module_base ;
197+ module_base = (unsigned long )base_info . module_base ;
208198 logkd ("+Test-Log+ set module_base:0x%llx\n" ,module_base );
209199
210- compat_strncpy_from_user (file_name ,base_info -> tfile_name ,sizeof (file_name ));
200+ compat_strncpy_from_user (file_name ,base_info . tfile_name ,sizeof (file_name ));
211201 logkd ("+Test-Log+ set target_file_name:%s\n" ,file_name );
212202 struct path path ;
213203 int fret = kern_path (file_name , LOOKUP_FOLLOW , & path );
@@ -220,7 +210,7 @@ void before_mincore(hook_fargs3_t *args, void *udata){
220210 logkd ("+Test-Log+ success set file inode\n" );
221211
222212 char fix_file_name [MAX_PATH_LEN ];
223- compat_strncpy_from_user (fix_file_name ,base_info -> fix_file_name ,sizeof (fix_file_name ));
213+ compat_strncpy_from_user (fix_file_name ,base_info . fix_file_name ,sizeof (fix_file_name ));
224214 if (strlen (fix_file_name )!= 0 ){
225215 if (fix_file ) {
226216 filp_close (fix_file , NULL );
@@ -232,7 +222,6 @@ void before_mincore(hook_fargs3_t *args, void *udata){
232222 }
233223 logkd ("+Test-Log+ set fix_file_name:%s\n" ,fix_file_name );
234224 }
235- kfree (base_info );
236225
237226 goto success_out ;
238227
@@ -337,7 +326,7 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
337326 kfree = (typeof (kfree ))kallsyms_lookup_name ("kfree" );
338327
339328 trace_printk = (typeof (trace_printk ))kallsyms_lookup_name ("__trace_printk" );
340- bpf_probe_read_user = (typeof (bpf_probe_read_user ))kallsyms_lookup_name ("bpf_probe_read_user " );
329+ arch_copy_from_user = (typeof (arch_copy_from_user ))kallsyms_lookup_name ("__arch_copy_from_user " );
341330
342331 get_unmapped_area = (typeof (get_unmapped_area ))kallsyms_lookup_name ("get_unmapped_area" );
343332 file_path = (typeof (file_path ))kallsyms_lookup_name ("file_path" );
@@ -375,7 +364,7 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
375364 logkd ("+Test-Log+ kfree:%llx\n" ,kfree );
376365
377366 logkd ("+Test-Log+ trace_printk:%llx\n" ,trace_printk );
378- logkd ("+Test-Log+ bpf_probe_read_user :%llx\n" ,bpf_probe_read_user );
367+ logkd ("+Test-Log+ arch_copy_from_user :%llx\n" ,arch_copy_from_user );
379368
380369 logkd ("+Test-Log+ get_unmapped_area:%llx\n" ,get_unmapped_area );
381370 logkd ("+Test-Log+ file_path:%llx\n" ,file_path );
@@ -398,8 +387,8 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
398387 if (!(mtask_pid_nr_ns && uprobe_register && uprobe_unregister
399388 && kern_path && igrab && path_put && rcu_read_unlock
400389 && rb_erase && rb_insert_color && rb_first && trace_printk
401- && bpf_probe_read_user && get_unmapped_area && file_path && mkstrdup && filp_open && kernel_read && filp_close && vmalloc && vfree && vmalloc_to_page
402- && install_special_mapping_addr && create_xol_area_addr && do_read_cache_page_addr )){
390+ && get_unmapped_area && file_path && mkstrdup && filp_open && kernel_read && filp_close && vmalloc && vfree && vmalloc_to_page
391+ && install_special_mapping_addr && create_xol_area_addr && do_read_cache_page_addr && arch_copy_from_user )){
403392 logke ("+Test-Log+ can not find some fun addr\n" );
404393 return -1 ;
405394 }
0 commit comments