Skip to content

Commit 1f2a4dd

Browse files
兼容的最低内核版本为5.10
1 parent 4265591 commit 1f2a4dd

File tree

2 files changed

+41
-15
lines changed

2 files changed

+41
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
编程思路可以参考[示例](https://github.com/AndroidReverser-Test/KernelTraceDemo/blob/main/app/src/main/cpp/kerneltracedemo.cpp)
2323

2424
# 支持的内核版本
25-
目前只在5.15版本通过测试,理论上5.15及以上版本都能正常使用
25+
目前只在5.10以及5.15两个版本通过测试,理论上5.10以上版本都能正常使用
2626

2727
# 一些疑惑
2828
~~在内核使用uprobe_register函数注册uprobe挂载点的时候在一些特殊情况下会出现实际注册的函数偏移与传入的函数偏移不一致的问题,至于为什么会这样, 我翻阅linux内核源码发现问题出现于内存地址计算错误,从这里开始内存地址就出现了偏差,我推测是内存页计算有偏差,但是具体原因不清楚。~~

kernel_trace.c

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@ int (*bpf_probe_read_user)(void *dst, u32 size,const void __user *unsafe_ptr) =
3030

3131
unsigned 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;
3437
void *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+
7284
void 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
301326
static 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

Comments
 (0)