Frida检测常见技术
参考:https://bbs.pediy.com/thread-217482.html
ptrace占坑
ptrace(0,0,0,0)
开启一个子进程附加主进程,这个其实不算检测,主要是为了限制frida和IDA进行附加进程,因为app只能被一个进程attach,自己attach了自己,其他的进程就无法attach了。绕过也比较简单,使用-f
参数指定包名,加上--no-pause
参数,使js代码优先attach上,而且frida的attach是用完就释放,不影响app代码里的ptrace
同一个app有多个进程的情况,守护进程(主进程崩掉了之后由守护进程把主进程再跑起来)、子进程附加主进程(不让别人再附加上去)、普通多进程。用ps -A
里看到的PPID就是父进程ID
双进程也可以尝试使用PID的方式去注入,不使用包名(使用包名也没用,因为两个进程包名一样),这种针对的是普通双进程,对于既是双进程又是子进程附加主进程的一般没用
进程名检测
遍历运行的进程列表,检测frida-server是否运行
端口检测
检测frida-server默认端口27042是否开发
D-Bus协议通信
Frida使用D-Bus协议通信,可以遍历/proc/<PID>/net/tcp
文件,或者对每个端口挨个发送消息
向每个开放的端口发送D-Bus认证消息,哪个端口回复了Reject,就是frida server
检测demo,绕过的话就去hook strcmp
函数就可以了
1 | /* |
扫描maps文件
maps文件用于显示当前app中加载的依赖库,maps文件位于/proc/<PID>/maps
frida在运行时会先确定路径下是否有re.frida.server
文件夹
若没有则创建该文件夹并往文件夹里存放frida-agent.so
等文件,该so文件会出现在maps文件中
扫描task目录
扫描目录下所有/proc/<PID>/task/<线程ID>/status
中的Name
字段,其实就是线程名,寻找是否存在frida注入的特征
具体线程名为gmain
、gdbus
、gum-js-loop
、pool-frida
等
检测文件及内存特征字符串
通过readlink
查看/proc/self/fd
、/proc/self/task/<pid>/fd
下所有打开的文件,检测是否有frida相关文件
常见用于检测的系统函数
1 | strstr、strcmp、open、read、fread、readlink |
扫描内存中是否有frida库特征出现,例如字符串LIBFRIDA
hluwa的去掉字符串特征的frida-server https://github.com/hluwa/strongR-frida-android
补充
通常会被检测的文件
1 | riru的特征文件 |
hluwa-server 处理了re.frida.server
文件夹以及该文件夹下的文件的名字
使用这个server,不放在/data/local/tmp
目录下的话,基本可以不用关心fd和maps的检测,但是线程关键字里还是可能有的,但是也不多,有时候可以用
frida-gadget https://bbs.pediy.com/thread-269866.html