首页
论坛
课程
招聘
[原创]基于ptrace的Android系统调用跟踪&hook工具
2022-3-18 15:07 5006

[原创]基于ptrace的Android系统调用跟踪&hook工具

2022-3-18 15:07
5006

前言

大概一年前写的吧,arm64版本已开源:https://github.com/onesss19/Syscall_intercept_arm64(求star

 

hook svc的方案已经有好几种,前几天有个大佬开源的Frida-Seccomp,罗哥开源的krhook,内存搜索+inlinehook,还有一些大佬没开源的核武器

 

这个工具是基于ptrace实现的,开发涉及到的关键API都是直接参考官方文档https://man7.org/linux/man-pages/man2/ptrace.2.html

使用

1
2
3
4
5
6
7
8
9
void show_helper(){
    printf(
            "\nSyscall_intercept -z <zygote_pid> -n <appname> -p <target_pid>\n"
            "options:\n"
            "\t-z <zygote_pid> : pid of zygote\n"
            "\t-t <appname> : application name\n"
            "\t-p <target_pid>: pid of application\n"
    );
}

支持spawn模式和attach模式

spawn模式

1
Syscall_intercept -z zygote_pid -n package_name

运行上述指令后手动打开目标app

attach模式

1
Syscall_intercept -p target_pid

打开目标app后运行上述指令

原理

主要就是依赖于ptrace的这个参数:

1
2
// the tracee to be stopped at the next entry to or exit from a system call
ptrace(PTRACE_SYSCALL, wait_pid, 0, 0);

spawn模式的原理是ptrace到zygote进程,然后跟踪zygote进程的fork系统调用,如果fork出来的新进程是指定包名的app,那么detach掉zygote进程,进而跟踪目标app进程的系统调用

 

attach模式的原理是直接ptrace目标app进程的所有线程

功能

大体功能和strace类似,实现原理也是一样的,主要是多了hook的能力

 

起初是想在strace的基础上改,源码框架没看太懂,转而自己写了个小玩具(逃

 

以拦截openat系统调用为例,运行结果:

 

 

对应源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void openat_item(pid_t pid,user_pt_regs regs){
    char        filename[256];
    char        path[256];
    uint32_t    filenamelength=0;
 
    get_addr_path(pid,regs.ARM_x1,path);
    if(strstr(path,"/data/app")!=0 || strstr(path,"[anon:libc_malloc]")!=0){
        getdata(pid,regs.ARM_x1,filename,256);
        if(strcmp(filename,"/dev/ashmem")!=0){
            print_register_enter(regs,pid,(char*)"__NR_openat",regs.ARM_x8);
            printf("filename: %s\n",filename);
            printf("path: %s\n",path);
            if(strcmp(filename,"/proc/sys/kernel/random/boot_id")==0){
                char tmp[256]="/data/local/tmp/boot_id";
                filenamelength=strlen(tmp)+1;
                putdata(pid,regs.ARM_x1,tmp,filenamelength);
                getdata(pid,regs.ARM_x1,filename,256);
                printf("changed filename: %s\n",filename);
            }
        }
    }
}

编译

1
clang++ -target aarch64-linux-android21 Syscall_intercept_arm64.cpp Syscall_item_enter_arm64.cpp -o Syscall_intercept_arm64 -static-libstdc++

用ndk里面自带的clang++编译即可

TODO

只是一个能跑的玩具,主要是把思路抛出来,后续可以适配更多的系统调用,可以添加栈回溯等等功能~


【看雪培训】《Adroid高级研修班》2022年夏季班招生中!

收藏
点赞7
打赏
分享
最新回复 (7)
雪    币: 218
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
0x7 活跃值 2022-3-18 15:29
2
0
厉害
雪    币: 113
活跃值: 活跃值 (456)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 活跃值 1 2022-3-18 15:31
3
0
mark
雪    币: 159
活跃值: 活跃值 (1929)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huaerxiela 活跃值 2022-3-18 15:41
4
0
great,再坐等cv一个seccomp组合的
雪    币: 89
活跃值: 活跃值 (216)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小菜鸭 活跃值 2022-3-18 17:10
5
0
mark
雪    币: 616
活跃值: 活跃值 (237)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
风中的承诺 活跃值 2022-3-18 21:54
6
0
雪    币: 1053
活跃值: 活跃值 (309)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
图灵真主护佑 活跃值 2022-3-19 08:53
7
0
厉害,
雪    币: 22
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
万里星河 活跃值 2022-3-19 12:46
8
0
额 支持一下
游客
登录 | 注册 方可回帖
返回