Skip to content

Commit 7c41d8e

Browse files
更新
1 parent 1ecf776 commit 7c41d8e

File tree

7 files changed

+60
-11
lines changed

7 files changed

+60
-11
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
上述函数的返回结果有SET_TRACE_SUCCESS、SET_TRACE_ERROR两种,分别表示设置成功和失败。
2020

2121
# 使用示例
22-
编程思路可以大概参考[示例](https://github.com/AndroidReverser-Test/Il2cppTraceModule/blob/main/app/src/main/cpp/il2cpp_trace.cpp)
22+
编程思路可以参考[示例](https://github.com/AndroidReverser-Test/Il2cppTraceModule/blob/main/app/src/main/cpp/il2cpp_trace.cpp)
2323

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

UprobeClearer/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# UprobeClearer
2+
一个可执行文件,用于一键清除所有的uprobes挂载点,防止app因残留的uprobe点崩溃。
3+
4+
5+
# 构建
6+
将ndk所在路径设置为环境变量后,在当前项目路径下执行ndk-build即可自动生成相应可执行文件。

UprobeClearer/jni/Android.mk

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
LOCAL_PATH := $(call my-dir)
2+
3+
include $(CLEAR_VARS)
4+
5+
MAIN_LOCAL_PATH := $(call my-dir)
6+
LOCAL_C_INCLUDES += $(MAIN_LOCAL_PATH)/Headers
7+
8+
include $(CLEAR_VARS)
9+
10+
LOCAL_MODULE := UprobeClearer
11+
12+
# Code optimization
13+
LOCAL_CPPFLAGS := -fvisibility=hidden -ffunction-sections -fdata-sections -w
14+
LOCAL_LDFLAGS += -Wl,--gc-sections,--strip-all -llog
15+
LOCAL_CPPFLAGS += -fexceptions -Werror -Wpedantic -s -std=c++17
16+
17+
LOCAL_SRC_FILES := uprobe_clear.cpp
18+
19+
LOCAL_LDLIBS := -llog -landroid
20+
21+
include $(BUILD_EXECUTABLE)

UprobeClearer/jni/Application.mk

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
APP_ABI := arm64-v8a
2+
APP_STL := c++_static
3+
APP_PLATFORM = android-27
4+
APP_OPTIM := release
5+
APP_PIE := true

UprobeClearer/jni/KernelTrace.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#include <stdio.h>
2+
#include <cstring>
3+
#include <unistd.h>
4+
5+
#include "Headers/uprobe_trace_user.h"
6+
7+
int main(int argc, char const *argv[])
8+
{
9+
clear_all_uprobes();
10+
printf("success clear all uprobes\n");
11+
return 0;
12+
}

kernel_trace.c

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#include "kernel_trace.h"
1515

1616
KPM_NAME("kernel_trace");
17-
KPM_VERSION("3.5.0");
17+
KPM_VERSION("3.7.0");
1818
KPM_LICENSE("GPL v2");
1919
KPM_AUTHOR("Test");
2020
KPM_DESCRIPTION("use uprobe trace some fun in kpm");
@@ -28,6 +28,8 @@ void (*path_put)(const struct path *path) = 0;
2828
void (*rcu_read_unlock)(void) = 0;
2929
int (*trace_printk)(unsigned long ip, const char *fmt, ...) = 0;
3030

31+
int (*bpf_probe_read_user)(void *dst, u32 size,const void __user *unsafe_ptr) = 0;
32+
3133
void *show_map_vma_addr;
3234
void *copy_insn_addr;
3335

@@ -49,6 +51,7 @@ void before_copy_insn(hook_fargs5_t *args, void *udata){
4951
ins_info = search_key_value(&fix_ins_tree,offset);
5052
if(ins_info){
5153
memcpy((void *)args->arg2,ins_info->value,INS_LEN);
54+
// logkd("+Test-Log+ offset:%lx,fix ins:%x %x %x %x\n",offset,ins_info->value[0],ins_info->value[1],ins_info->value[2],ins_info->value[3]);
5255
args->ret = 0;
5356
args->skip_origin = 1;
5457
}
@@ -92,7 +95,7 @@ void before_mincore(hook_fargs3_t *args, void *udata){
9295
const char __user *tfun_name = (typeof(tfun_name))syscall_argn(args, 2);
9396
char fun_name[MAX_FUN_NAME];
9497
compat_strncpy_from_user(fun_name,tfun_name,sizeof(fun_name));
95-
int insert_ret = insert_key_value(&fun_info_tree,fun_offset,fun_name);
98+
int insert_ret = insert_key_value(&fun_info_tree,fun_offset,fun_name,strlen(fun_name));
9699
if(insert_ret==-1){
97100
logke("+Test-Log+ same fun 0x%llx set uprobe\n",fun_offset);
98101
goto error_out;
@@ -104,10 +107,10 @@ void before_mincore(hook_fargs3_t *args, void *udata){
104107
if(trace_info==FIX_ORI_INS){
105108
unsigned long rfun_offset = (unsigned long)syscall_argn(args, 0);
106109
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);
110+
char fix_ins[INS_LEN];
111+
bpf_probe_read_user(fix_ins,INS_LEN,ufix_ins);
109112
// 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);
113+
int insert_ins_ret = insert_key_value(&fix_ins_tree,rfun_offset,fix_ins,INS_LEN);
111114
if(insert_ins_ret==-1){
112115
logke("+Test-Log+ set insn for same fun 0x%llx\n",rfun_offset);
113116
goto error_out;
@@ -125,7 +128,7 @@ void before_mincore(hook_fargs3_t *args, void *udata){
125128

126129
fun_offsets[hook_num] = rfun_offset;
127130
hook_num++;
128-
logkd("+Test-Log+ rfun_offset:%llx\n",rfun_offset);
131+
// logkd("+Test-Log+ rfun_offset:%llx\n",rfun_offset);
129132
goto success_out;
130133
}
131134

@@ -229,6 +232,7 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
229232
kfree = (typeof(kfree))kallsyms_lookup_name("kfree");
230233

231234
trace_printk = (typeof(trace_printk))kallsyms_lookup_name("__trace_printk");
235+
bpf_probe_read_user = (typeof(bpf_probe_read_user))kallsyms_lookup_name("bpf_probe_read_user");
232236

233237
show_map_vma_addr = (void *)kallsyms_lookup_name("show_map_vma");
234238

@@ -249,6 +253,7 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
249253
logkd("+Test-Log+ kfree:%llx\n",kfree);
250254

251255
logkd("+Test-Log+ trace_printk:%llx\n",trace_printk);
256+
logkd("+Test-Log+ bpf_probe_read_user:%llx\n",bpf_probe_read_user);
252257

253258
logkd("+Test-Log+ show_map_vma_addr:%llx\n",show_map_vma_addr);
254259

@@ -257,7 +262,7 @@ static long kernel_trace_init(const char *args, const char *event, void *__user
257262
if(!(mtask_pid_nr_ns && uprobe_register && uprobe_unregister
258263
&& kern_path && igrab && path_put && rcu_read_unlock
259264
&& rb_erase && rb_insert_color && rb_first && trace_printk
260-
&& show_map_vma_addr && copy_insn_addr)){
265+
&& bpf_probe_read_user && show_map_vma_addr && copy_insn_addr)){
261266
logke("+Test-Log+ can not find some fun addr\n");
262267
return -1;
263268
}

mrbtree.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static inline void rb_link_node(struct rb_node *node, struct rb_node *parent,str
3333
}
3434

3535

36-
int insert_key_value(struct rb_root *root, unsigned long key, const char *value)
36+
int insert_key_value(struct rb_root *root, unsigned long key, const char *value, int value_len)
3737
{
3838
struct rb_node **new = &(root->rb_node);
3939
struct rb_node *parent = NULL;
@@ -63,8 +63,8 @@ int insert_key_value(struct rb_root *root, unsigned long key, const char *value)
6363
kfree(data);
6464
return -1;
6565
}
66-
strcpy(data->value, value);
67-
66+
// strcpy(data->value, value);
67+
memcpy(data->value,value,value_len);
6868
// 设置键值
6969
data->key = key;
7070

0 commit comments

Comments
 (0)