在研究 libpairipcore.so 反调试时发现一件很奇怪的事情,只要手机上曾经启动过 frida-server,目标 app 也能检测到,卸载重新安装都没用,除非使用 adb shell stop;start 重启 framework 框架。
我就在想是不是 frida-server 在系统中有残留?为什么重启 framework 之后就能打开?带着疑惑,我问了下gpt,它说是 frida-server 启动后会影响到 zygote 进程,可能改变了某些内存布局。如果真是这样,那就能解释通为什么卸载重装也打不开了,因为所有 app 都是从 zygote 进程 fork 孵化出来的,新的 app 进程会继承 zygote 的所有内存信息,等于说 frida-server 痕迹也会被继承。
于是,我顺着内存这条路对比了下启动 frida-server 前后的 zygote 内存布局信息,发现启动 frida-server 后 zygote 的内存里面多了十多条 libc.so 内存段信息,很大可能性这个 libpairipcore.so 就是检测了这个 libc.so 内存段条目数量,目前还在研究中,待确认。
这个 libpairipcore.so 的检测逻辑都在 jni_onload 里面,第一步就是检测是否有 jdwp 或 lldb 调试器附加,通过 fork 子进程 ptrace 父进程来检测 lldb 调试器,jdwp 的检测方式还没摸清楚,目前研究的还不是很深入(道心破碎,已经有放弃的念头了),前面的检测步骤流程大概如下:
