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

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

2022-3-18 15:07
15343

前言

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

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


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞10
打赏
分享
最新回复 (12)
雪    币: 218
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
0x7 2022-3-18 15:29
2
0
厉害
雪    币: 122
活跃值: (1390)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
koflfy 1 2022-3-18 15:31
3
0
mark
雪    币: 181
活跃值: (2868)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huaerxiela 2022-3-18 15:41
4
0
great,再坐等cv一个seccomp组合的
雪    币: 144
活跃值: (502)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
小菜鸭 2022-3-18 17:10
5
0
mark
雪    币: 624
活跃值: (501)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
风中的承诺 2022-3-18 21:54
6
0
雪    币: 3509
活跃值: (1952)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
图灵真主护佑 2022-3-19 08:53
7
0
厉害,
雪    币: 62
活跃值: (545)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
万里星河 2022-3-19 12:46
8
0
额 支持一下
雪    币: 228
活跃值: (498)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
全都是HOOK 2022-12-12 14:11
9
0
代码可以跑起来, 老哥威武
雪    币: 172
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
liukuo362573 2023-1-3 14:05
10
0

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

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