mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
959 字
3 分钟
写frida时碰到的问题
2026-09-05

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/0xd8
device_destroy+0x4c/0x6c
dispatch_open+0x18/0x30

翻了10条崩溃记录(从2025年5月到7月),全是同一个位置崩的。

排查过程#

  1. 看崩溃栈,是device_destroy传了空指针进去
  2. 翻logcat,发现/data/load.sh在开机时自动执行
  3. load.sh加载了/data/4.9.186.ko这个第三方内核模块
  4. 这个模块来自前任机主装的游戏外挂工具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 found

attach模式能用,spawn死活不行。我当时一度以为是Zygisk的锅。

真正的原因#

旧进程没有退出!

frida spawn的原理是:frida-server告诉Android的ActivityManager启动一个新app进程。但如果这个app已经有一个实例在运行,系统就会拒绝再启动一个,frida就报”process not found”。

复现步骤#

Terminal window
# 第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):

Terminal window
# 每次spawn前先杀旧进程!
adb shell "su -c 'am force-stop com.fatdog.reverse'"
frida -U -f com.fatdog.reverse -l main.js

attach模式(app已在运行):

Terminal window
# 先手动启动app
adb shell am start -n com.fatdog.reverse/.MainActivity
# 然后用PID或进程名attach
frida -U <PID> -l main.js
frida -U 胖狗逆向靶场 -l main.js
frida -U com.fatdog.reverse -l main.js

五、容易混淆的点#

命令模式说明
frida -U -f 包名spawnfrida帮你启动app,app还没运行时用
frida -U 包名attach连接已运行的app,app必须已经在跑
frida -U PIDattach通过PID连接,最稳的方式

核心区别:有-f是启动,没-f是连接。app没开就跑attach,当然找不到进程。

六、总结#

这次排查的核心教训:

  1. 二手手机要清理:前任机主留的外挂/内核模块可能导致各种莫名其妙的问题
  2. kernel panic看last_kmsg:崩溃栈+logcat双管齐下定位问题
  3. spawn失败先检查进程是否还活着adb shell "su -c 'ps -A | grep 包名'",活着就先kill
  4. Zygisk和system_server崩溃有关联:排查时可以作为变量之一
  5. frida版本要一致:客户端和服务端版本必须匹配,否则各种奇怪问题

最最重要的教训:不要想当然地认为某个功能”坏了”,先排查使用方式是否正确! 我一开始就误判了,以为spawn功能本身有问题,结果只是旧进程没杀而已。🤡

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

写frida时碰到的问题
https://fatdog.20060113.xyz/posts/frida-bug/
作者
神秘大胖狗
发布于
2026-09-05
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00