Android逆向中,我们分析app时常常遇到如下问题:

  1. APP获取了哪些设备信息
  2. APP怎么检测调试器
  3. APP怎么检测Frida
  4. APP怎么检测root环境

同时在检测到该行为,并定位到具体代码位置后,我们如何去修改设备信息、隐藏调试器、隐藏Frida又是一个问题。

比如传统方法检测调试器是检查 /proc/pid/status 文件,调试器附加进程后,TracerPid字段的值是调试器的 PID ,要想绕过该反调试,需要解决如下问题:

  1. 如何定位代码
  2. 如何修改绕过,修改里面的 PID

定位代码可以依靠逆向工程或者Frida hook等,但是遇到混淆、SVC等会遇到问题,且针对性不强,不够通用,如果用 frida hook libc的函数,遇到 syscall 时就无法使用了。

因此,解决问题的关键是如何定位系统调用位置并修改系统调用逻辑。

Android Linux Kernel 定制

这就涉及到 Android Linux Kernel 定制方案,具体如下:

监测 修改 动态加载/卸载 需要内核源码/头文件/重新编译内核 开发难度
内核源码定制
ko内核模块
eBPF(监测) 是(有些也不用)
eBPF(修改) 是(默认不能修改返回值)
Kernel Patch
Binary Patch

基于 eBPF 开发的开源工具

https://github.com/SeeFlowerX/stackplz

stackplz是一款基于eBPF的堆栈追踪工具,目前仅适用于Android平台

特性:

要求:

不仅仅是真机,这些环境下也可以使用:

eBPF非常适合做监测类任务,但是不适合做修改类任务:

  1. 很难修改寄存器或参数的值
  2. 很难修改返回值(CONFIG_BPF_KPROBE_OVERRIDE 配置未开)