1414#include "kernel_trace.h"
1515
1616KPM_NAME ("kernel_trace" );
17- KPM_VERSION ("2.3 .0" );
17+ KPM_VERSION ("3.5 .0" );
1818KPM_LICENSE ("GPL v2" );
1919KPM_AUTHOR ("Test" );
2020KPM_DESCRIPTION ("use uprobe trace some fun in kpm" );
@@ -29,18 +29,30 @@ void (*rcu_read_unlock)(void) = 0;
2929int (* trace_printk )(unsigned long ip , const char * fmt , ...) = 0 ;
3030
3131void * show_map_vma_addr ;
32+ void * copy_insn_addr ;
3233
3334
3435char file_name [MAX_PATH_LEN ];
3536uid_t target_uid = -1 ;
3637unsigned long fun_offsets [MAX_HOOK_NUM ];
3738int hook_num = 0 ;
3839struct rb_root fun_info_tree = RB_ROOT ;
40+ struct rb_root fix_ins_tree = RB_ROOT ;
3941static struct inode * inode ;
4042unsigned long module_base = 0 ;
4143static struct uprobe_consumer trace_uc ;
4244
4345
46+ void before_copy_insn (hook_fargs5_t * args , void * udata ){
47+ struct my_key_value * ins_info ;
48+ loff_t offset = (loff_t )args -> arg4 ;
49+ ins_info = search_key_value (& fix_ins_tree ,offset );
50+ if (ins_info ){
51+ memcpy ((void * )args -> arg2 ,ins_info -> value ,INS_LEN );
52+ args -> ret = 0 ;
53+ args -> skip_origin = 1 ;
54+ }
55+ }
4456
4557void before_show_map_vma (hook_fargs2_t * args , void * udata )
4658{
@@ -89,6 +101,20 @@ void before_mincore(hook_fargs3_t *args, void *udata){
89101 goto success_out ;
90102 }
91103
104+ if (trace_info == FIX_ORI_INS ){
105+ unsigned long rfun_offset = (unsigned long )syscall_argn (args , 0 );
106+ const char __user * ufix_ins = (typeof (ufix_ins ))syscall_argn (args , 2 );
107+ char fix_ins [INS_LEN * 2 ];
108+ compat_strncpy_from_user (fix_ins ,ufix_ins ,INS_LEN * 2 );
109+ // logkd("+Test-Log3+ insn:%lx %lx %lx %lx\n",fix_ins[0],fix_ins[1],fix_ins[2],fix_ins[3]);
110+ int insert_ins_ret = insert_key_value (& fix_ins_tree ,rfun_offset ,fix_ins );
111+ if (insert_ins_ret == -1 ){
112+ logke ("+Test-Log+ set insn for same fun 0x%llx\n" ,rfun_offset );
113+ goto error_out ;
114+ }
115+ goto success_out ;
116+ }
117+
92118 if (trace_info == SET_TARGET_UPROBE ){
93119 unsigned long rfun_offset = (unsigned long )syscall_argn (args , 0 );
94120 int hret = uprobe_register (inode ,rfun_offset ,& trace_uc );
@@ -138,6 +164,7 @@ void before_mincore(hook_fargs3_t *args, void *udata){
138164 }
139165 hook_num = 0 ;
140166 destroy_entire_tree (& fun_info_tree );
167+ destroy_entire_tree (& fix_ins_tree );
141168 logkd ("+Test-Log+ success clear all uprobes\n" );
142169 goto success_out ;
143170 }
@@ -205,6 +232,8 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
205232
206233 show_map_vma_addr = (void * )kallsyms_lookup_name ("show_map_vma" );
207234
235+ copy_insn_addr = (void * )kallsyms_lookup_name ("__copy_insn" );
236+
208237 logkd ("+Test-Log+ mtask_pid_nr_ns:%llx\n" ,mtask_pid_nr_ns );
209238 logkd ("+Test-Log+ uprobe_register:%llx\n" ,uprobe_register );
210239 logkd ("+Test-Log+ uprobe_unregister:%llx\n" ,uprobe_unregister );
@@ -223,10 +252,12 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
223252
224253 logkd ("+Test-Log+ show_map_vma_addr:%llx\n" ,show_map_vma_addr );
225254
255+ logkd ("+Test-Log+ copy_insn_addr:%llx\n" ,copy_insn_addr );
256+
226257 if (!(mtask_pid_nr_ns && uprobe_register && uprobe_unregister
227258 && kern_path && igrab && path_put && rcu_read_unlock
228259 && rb_erase && rb_insert_color && rb_first && trace_printk
229- && show_map_vma_addr )){
260+ && show_map_vma_addr && copy_insn_addr )){
230261 logke ("+Test-Log+ can not find some fun addr\n" );
231262 return -1 ;
232263 }
@@ -245,6 +276,11 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
245276 return -1 ;
246277 }
247278
279+ err = hook_wrap5 (copy_insn_addr , before_copy_insn , NULL , 0 );
280+ if (err ){
281+ logke ("+Test-Log+ hook copy_insn error\n" );
282+ return -1 ;
283+ }
248284
249285 logkd ("+Test-Log+ success init\n" );
250286 return 0 ;
@@ -261,12 +297,14 @@ static long kernel_trace_exit(void *__user reserved)
261297{
262298 inline_unhook_syscall (__NR_mincore , before_mincore , 0 );
263299 unhook (show_map_vma_addr );
300+ unhook (copy_insn_addr );
264301 rcu_read_unlock ();//解锁,不然内核会崩
265302 for (int i = 0 ; i < hook_num ; ++ i ) {
266303 uprobe_unregister (inode ,fun_offsets [i ],& trace_uc );
267304 }
268305 logkd ("+Test-Log+ success clear all uprobes\n" );
269306 destroy_entire_tree (& fun_info_tree );
307+ destroy_entire_tree (& fix_ins_tree );
270308 logkd ("kpm kernel_trace exit\n" );
271309}
272310
0 commit comments