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

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

2022-3-18 15:07
16851

前言

大概一年前写的吧,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

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


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 10
支持
分享
最新回复 (12)
雪    币: 218
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
0x7
2
厉害
2022-3-18 15:29
0
雪    币: 102
活跃值: (2150)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
mark
2022-3-18 15:31
0
雪    币: 181
活跃值: (2998)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
great,再坐等cv一个seccomp组合的
2022-3-18 15:41
0
雪    币: 144
活跃值: (637)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
mark
2022-3-18 17:10
0
雪    币: 624
活跃值: (501)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
2022-3-18 21:54
0
雪    币: 4423
活跃值: (2757)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
厉害,
2022-3-19 08:53
0
雪    币: 116
活跃值: (1012)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
额 支持一下
2022-3-19 12:46
0
雪    币: 1416
活跃值: (1623)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
代码可以跑起来, 老哥威武
2022-12-12 14:11
0
雪    币: 171
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10

代码成功跑起来,大佬威武,github 已 star

最后于 2023-1-3 14:08 被liukuo362573编辑 ,原因:
2023-1-3 14:05
0
雪    币: 171
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
大佬,32 位的能开源么?(不敢相信,还有人白嫖)
2023-1-3 16:15
0
雪    币: 986
活跃值: (6167)
能力值: ( LV7,RANK:115 )
在线值:
发帖
回帖
粉丝
12
liukuo362573 大佬,32 位的能开源么?(不敢相信,还有人白嫖)
只是一个小demo,系统性学习建议直接去看proot项目
2023-1-4 10:20
0
雪    币: 35
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
13
开发安卓系统上运行的so库/静态链接库
能够ptrace本进程以及子进程所有系统调用,类似于strace那种。有兴趣的可以加QQ:2223603917 聊具体细节
2023-7-10 16:03
0
游客
登录 | 注册 方可回帖
返回
//