959 字
3 分钟
写frida时碰到的问题
Frida在小米8上的踩坑全记录——从内核崩溃到spawn失败
一、前言
大佬们好呀,这次记录一下我在小米8上使用frida时遇到的一系列离谱问题。从手机反复重启,到frida怎么都用不了,排查了整整一下午。希望这篇文章能帮到同样踩坑的朋友!😊
设备信息:
- 手机:小米8 UD(Equuleus)
- 系统:Android 10,MIUI 12.5
- 内核:4.9.186-perf
- Root:Magisk Kitsune v27.2-kitsune-2
- frida版本:16.4.0(客户端和服务端一致)
二、问题一:手机反复内核崩溃(kernel panic)
症状
手机不定时重启,last_kmsg里全是这个:
class_find_device+0x28/0xd8device_destroy+0x4c/0x6cdispatch_open+0x18/0x30翻了10条崩溃记录(从2025年5月到7月),全是同一个位置崩的。
排查过程
- 看崩溃栈,是
device_destroy传了空指针进去 - 翻logcat,发现
/data/load.sh在开机时自动执行 - load.sh加载了
/data/4.9.186.ko这个第三方内核模块 - 这个模块来自前任机主装的游戏外挂工具GT V1.5
根本原因
前任机主在手机里留了一堆外挂工具:
/data/4.9.186.ko— 第三方内核模块,dispatch_open有bug/data/load.sh— 开机自动加载内核模块的脚本- GT V1.5文件夹 — 游戏外挂
- Google PUBG文件夹 — 吃鸡辅助
这些模块的dispatch_open函数调用device_destroy时传了NULL,直接空指针解引用导致kernel panic。
解决
adb shell "su -c 'rm /data/4.9.186.ko'"adb shell "su -c 'rm /data/load.sh'"adb shell "su -c 'rm -rf /data/GT*'"# 删除所有外挂相关文件教训:买二手手机一定要检查/data目录下有没有前任机主留的垃圾!
三、问题二:Zygisk导致system_server崩溃
症状
删完外挂文件后手机不崩了,但是开了Zygisk后,system_server偶尔会崩:
jit-zygisk-cache空指针IPackageManager$Stub.onTransact排查过程
- 关掉Zygisk → system_server不再崩溃
- 但关掉Zygisk后frida spawn又用不了了(当时以为是这个原因,后来证明不是)
教训
Zygisk和某些Magisk模块组合使用时可能会出问题。如果遇到system_server崩溃,先试试关掉Zygisk排查。
四、问题三:frida spawn一直失败(核心问题)
症状
frida -U -f com.fatdog.reverse -l main.js# → Failed to spawn: process not foundattach模式能用,spawn死活不行。我当时一度以为是Zygisk的锅。
真正的原因
旧进程没有退出!
frida spawn的原理是:frida-server告诉Android的ActivityManager启动一个新app进程。但如果这个app已经有一个实例在运行,系统就会拒绝再启动一个,frida就报”process not found”。
复现步骤
# 第1次:spawn成功frida -U -f com.fatdog.reverse -l main.js# ...用完直接关掉frida客户端(app进程还活着)
# 第2次:spawn失败frida -U -f com.fatdog.reverse -l main.js# → Failed to spawn: process not found
# 第3次:先杀进程,再spawn,又成功了adb shell "su -c 'am force-stop com.fatdog.reverse'"frida -U -f com.fatdog.reverse -l main.js# → Spawned! Resuming main thread!正确用法
spawn模式(自动启动app):
# 每次spawn前先杀旧进程!adb shell "su -c 'am force-stop com.fatdog.reverse'"frida -U -f com.fatdog.reverse -l main.jsattach模式(app已在运行):
# 先手动启动appadb shell am start -n com.fatdog.reverse/.MainActivity
# 然后用PID或进程名attachfrida -U <PID> -l main.jsfrida -U 胖狗逆向靶场 -l main.jsfrida -U com.fatdog.reverse -l main.js五、容易混淆的点
| 命令 | 模式 | 说明 |
|---|---|---|
frida -U -f 包名 | spawn | frida帮你启动app,app还没运行时用 |
frida -U 包名 | attach | 连接已运行的app,app必须已经在跑 |
frida -U PID | attach | 通过PID连接,最稳的方式 |
核心区别:有-f是启动,没-f是连接。app没开就跑attach,当然找不到进程。
六、总结
这次排查的核心教训:
- 二手手机要清理:前任机主留的外挂/内核模块可能导致各种莫名其妙的问题
- kernel panic看last_kmsg:崩溃栈+logcat双管齐下定位问题
- spawn失败先检查进程是否还活着:
adb shell "su -c 'ps -A | grep 包名'",活着就先kill - Zygisk和system_server崩溃有关联:排查时可以作为变量之一
- frida版本要一致:客户端和服务端版本必须匹配,否则各种奇怪问题
最最重要的教训:不要想当然地认为某个功能”坏了”,先排查使用方式是否正确! 我一开始就误判了,以为spawn功能本身有问题,结果只是旧进程没杀而已。🤡
写frida时碰到的问题
https://fatdog.20060113.xyz/posts/frida-bug/ 部分信息可能已经过时









