Android逆向中,我们分析app时常常遇到如下问题:
同时在检测到该行为,并定位到具体代码位置后,我们如何去修改设备信息、隐藏调试器、隐藏Frida又是一个问题。
比如传统方法检测调试器是检查 /proc/pid/status
文件,调试器附加进程后,TracerPid字段的值是调试器的 PID
,要想绕过该反调试,需要解决如下问题:
PID
定位代码可以依靠逆向工程或者Frida hook等,但是遇到混淆、SVC等会遇到问题,且针对性不强,不够通用,如果用 frida hook libc
的函数,遇到 syscall
时就无法使用了。
因此,解决问题的关键是如何定位系统调用位置并修改系统调用逻辑。
这就涉及到 Android Linux Kernel
定制方案,具体如下:
监测 | 修改 | 动态加载/卸载 | 需要内核源码/头文件/重新编译内核 | 开发难度 | |
---|---|---|---|---|---|
内核源码定制 | 是 | 是 | 否 | 是 | 中 |
ko内核模块 | 否 | 否 | 是 | 是 | 中 |
eBPF(监测) | 是 | 否 | 是 | 是(有些也不用) | 低 |
eBPF(修改) | 是 | 是 | 是 | 是(默认不能修改返回值) | 高 |
Kernel Patch | 是 | 是 | 是 | 否 | 中 |
Binary Patch | 否 | 否 | 否 | 否 | 高 |
https://github.com/SeeFlowerX/stackplz
stackplz是一款基于eBPF的堆栈追踪工具,目前仅适用于Android平台
特性:
- 支持arm64 syscall trace,可以打印参数(包括详细的结构体信息)、调用栈、寄存器
- 支持对64位用户态动态库进行uprobe hook,可以打印参数、调用栈、寄存器
- 支持硬件断点功能,可以打印调用栈、寄存器,并且提供了frida rpc调用
- 支持进程号、线程号、线程名的黑白名单过滤
- 支持追踪fork产生的进程
要求:
- root权限,系统内核版本5.10+(可执行
uname -r
查看)- 对于4.1x的内核,内核开启了CONFIG_HAVE_HW_BREAKPOINT,硬件断点功能同样可以使用
不仅仅是真机,这些环境下也可以使用:
- arm开发板刷安卓镜像
- arm开发板/云服务器 + Docker + ReDroid
- Apple M系列设备 + 安卓官方arm64模拟器
- 有root权限,内核版本5.10+的云真机也可以
eBPF非常适合做监测类任务,但是不适合做修改类任务:
CONFIG_BPF_KPROBE_OVERRIDE
配置未开)