本文最后更新于 2025-08-14T01:08:34+08:00
入门
安装
1 2 3
| Frida 代码自动补全 ```bash npm install --save @types/frida-gum
|
安装Frida
1 2
| pip install frida-tools pip install objection
|
找到相应版本的Frida 推送到设备中
https://github.com/frida/frida/releases/tag/16.5.1

命令
1
| adb push frida-server16.5.1 /data/local/frida-server16.5.1
|
基础命令
frida-tools里面还提供了五个实用工具
frida-discover、
frida-kill、
frida-ls-devices、
frida-ps以及
frida-trace
在 shims下面
获取可用设备列表
获取设备进程列表
frida-ps [options]
● -U:连接到USB设备。
● -D:如果有多个USB设备,可以用该选项指定设备的UDID。
● -R/-H:连接到远程frida-server,主要用于远程调试。
● -a:仅显示正在运行的应用。
● -i:显示所有已安装的应用(包括App Store应用和系统应用)。
具体demo:
- 连接到USB设备查看进程列表 frida-ps -U
- 连接到USB设备查看正在运行的应用 frida-ps -U -a
- 连接到USB设备查看所有安装的应用 frida-ps -U -a -i
- 指定查看某个设备 frida-ps -D xxxx -a
遇到的坑:
- windows上frida环境配置出现Waiting for USB device to appear…
解决:
运行下面代码
1 2
| adb forward tcp:27042 tcp:27042 frida-ps -H 127.0.0.1:27042
|
结束设备的某个进程
frida-kill工具用来结束设备上的某个进程,它的使用规则如下:
- frida-kill -U /
- frida-kill -D /
例如用frida-ps获取了微信的PID为1815,
则可以用如下命令结束它:
1 2 3 4
| frida-kill -U 1815 frida-kill -U 微信 frida-kill -D xxxx 1815 frida-kill -D xxxx 微信
|
frida 追踪
https://frida.re/docs/frida-trace/
frida-trace工具用于跟踪函数或方法的调用,其功能非常强大,使用“-h”选项来查看帮助信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| // 设备相关 -D 连接到指定的设备,多个设备时使用。示例:frida-trace -D 555315d66cac2d5849408f53da9eea514a90547e -F -U 连接到USB设备,只有一个设备时使用。示例fria-trace -U -F
// 应用程序相关 -f 目标应用包名。spawn模式。示例:frida-trace -U -f com.apple.www -F 当前正在运行的程序。attach模式示例。示例:frida-trace -U -F或frida-trae -UF -n 正在运行的程序的名字。attach模式。示例:frida-trace -U -n QQ -N 正在运行的程序的包名。attach模式。示例:frida-trace -U -N com.apple.www -p 正在运行的程序的pid。attach模式。示例:frida-trace -U -p 2302 // 方法相关,以下参数在一条跟踪命令中可重复使用 -I 包含模块。示例:frida-trace -UF -I "libcommonCrypto*" -X 不包含模块。示例:frida-trace -UF -X "libcommonCrypto*" -i 包含c函数。示例:frida-trace -UF -i "strtsr" -x 不包名c函数。示例:frida-trace -UF -i "*MD5" -x "CC_MD5" -a 包含模块+偏移跟踪。示例:frida-trace -UF -a 模块名\!0x7B7D48 -j 包含某个Java方法 实列frida-trace -UF -j '*!*tesucanshu*/isu' !用来分隔MODULE和OFFSET,例如"gdi32full.dll!ExtTextOutW" *代表匹配任意内容
-J 包含某个Java方法 实列frida-trace -UF -J '*!*tesucanshu*/isu'
// 日志相关 -o 日志输出到文件。示例:frida-trace -UF -j '*!*tesucanshu*/isu' -o run.log
|
附加的两种方式
1.Attach模式
前台打开APP:
frida -UF -l 脚本.js
2.Spwan模式
frida -U -f 包名
%resume
可以加 --no-pause
但是在 16的版本已经取消 --no-pause 具体命令自行研究
另外需要一点JS和python语法基础
Hook 构造函数
常用API:
是一个非常重要的对象,在里面有许多的API。在对Java层进行hook时,是必须要写Java.perform的。
Java.perform(fn)
主要用于当前线程附加到Java VM
并且调用fn
方法
Java.available
该函数一般用来判断当前进程是否加载了JavaVM,Dalvik
或ART
虚拟机 通俗一点讲是否在Java代码空间
Java.androidVersion
显示android系统版本号
Java.use
Java.use(className),
动态获取className
的类定义 类似于xposed里面的获取Class 可以直接点到源代码看他的定义
Java.use(类名).方法名.implementation
获取方法的实现
overload
重载参数
.$init()
拦截构造函数时候使用
立即注入或者延迟注入
setImmediate(test);
setInterval(test,1000);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| function main() { Java.perform(function () { if (Java.available) { var Person_class = Java.use("com.example.hookdemo.Person");
Person_class.$init.overload('java.lang.String', 'int', 'java.lang.String').implementation = function (a1, a2, a3) { console.log(a1, a2, a3); var result = this.$init(a1, a2, a3); return result;
}
Person_class.setAddress.implementation = function (address) { console.log("address=>", address); var result = this.setAddress("address"); console.log("result=>", result); return result; }
Person_class.getName.implementation = function () { var result = this.getName(); console.log("result=>", result); return result; }
Person_class.print.overload('java.lang.String', 'int', 'java.lang.String').implementation = function (a1, a2, a3) { console.log(a1, a2, a3); var result = this.print(a1, a2, a3); return result; } } }) }
setImmediate(main)
|