Frida
Frida
Frida 环境安装
frida 、frida-tools
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 安装frida
pip install frida -i https://pypi.mirrors.ustc.edu.cn/simple/
# 安装frida-tools
pip install frida-tools -i https://pypi.mirrors.ustc.edu.cn/simple/
# 如果报错,需要更新
python -m pip install --upgrade pip
# 如果网络没有问题还是报错,换下一条指令:
python -m pip install -U --force-reinstall pip
## 等待安装frida成功即可
# frida安装成功后的测试指令:
frida help
# 查看frida版本
frida version
frida-server
- frida-server 的 下载:要看清楚 frida-server 要往下滑才能看见,(后缀为.xz)我理解的就是类似于二进制
- frida-server 的版本需要和 frida 版本一致
- 使用 adb 命令:如下,我的手机/模拟器就是 x86_64,在去找对应的 frida-server 后缀 x86_64 下载:
1
2
adb shell getprop ro.product.cpu.abi
# arm64-v8a,需要下载64位的版本:frida-server-16.7.3-android-x86_64.xz
- x86 (32-bit):
frida-server-*-android-x86.xz
- x86_64 (64-bit):
frida-server-*-android-x86_64.xz
- ARM (32-bit):
frida-server-*-android-arm.xz
- ARM64:
frida-server-*-android-arm64.xz
- 下载后将.xz 解压出来,adb push 到手机上:
1
2
3
4
5
6
7
8
9
# 解压得到:frida-server-16.7.3-android-x86_64
# adb push; 路径网上大部分都是data/local/tmp,不知道是不是有关系的;如果放到/sdcard/download目录下,chmod 755不生效
adb push ./frida-server-16.7.3-android-x86_64 data/local/tmp
adb shell
cd /data/local/tmp
# 更改权限可执行
chmod 755 ./frida-server-16.7.3-android-x86_64
- 启动 frida-server
1
2
3
4
5
cd /data/tmp/local
./frida-server-16.7.3-android-x86_64
#监听端口
./frida-server-16.7.3-android-x86_64 -l 0.0.0.0:8888
新版 Frida 不需要转发端口
- 报错
1
Unable to load SELinux policy from the kernel: Failed to open file ?/sys/fs/selinux/policy?: Permission denied
解决 1:需要 su 权限
报错 2:Unable to save SELinux policy to the kernel: Out of memory · Issue #473 · frida/frida
1
Unable to save SELinux policy to the kernel: Out of memory
解决 2:
1
2
su ./frida-server-16.7.3-android-arm64 &
# 加&,表示以后台模式运行
- 和
frida-server
交互,前提是通过 USB 连接
1
frida-ps -U
vscode 配置代码提示
首先安装 Node.js (nodejs.org),新建一个文件夹,在目录下执行下面这条命令。
1
npm i @types/frida-gum
Objection
Frida + Objection,动态代码插桩,支持 Hook 方法、监控文件操作、网络请求、加解密函数等。
- 优点:
- 无需 Xposed,支持非 Root 设备(部分功能需 Root)。
- 灵活性强,可编写自定义脚本。
- Objection 提供简化命令(如
android hooking watch
)。 GitHub - sensepost/objection: 📱 objection - runtime mobile exploration
Frida 使用
frida-tools 使用
frida tools 主要有Frida CLI、frida-ps、frida-trace、frida-discover、frida-ls-devices、frida-kill等命令工具。
frida cli
- frida-ps -U 查看通过 USB 连接的设备上运行的程序
- frida-ps -Ua 查看正在运行的应用程序
- frida-ps -Uai 查看设备已经安装的应用程序
frida-ps -D <UDID>
通过设备的 UDID 查看设备中应用程序中的 pid、进程名,frida-kill -D <UDID> <pid>
杀死指定 UDID 的设备的具体进程,pid 为该进程的进程号
实战
Hook 步骤
以 Android 平台为例,了解一下 frida 的工作流程:
- frida-server:运行在安卓端,与电脑端进行通信,接收电脑端的调试请求,并将 JavaScript 编写的 hook 代码注入到目标 app 中。
- 电脑端:与 frida-server 通信,可以使用多种编程语言编写脚本和管理注入过程,最常用的是 Python
- JavaScript 脚本:编写具体的注入和修改逻辑,并通过电脑端提供的环境被推送到 frida-server 中,从而注入到目标 app。
demo
对此,我们需要建立两个文件,一个 hook.js
用于存放具体的修改逻辑,一个 hook.py
用于自动管理注入流程,如:在合适的时机自动注入。
- hook.py
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
41
42
43
import frida
import sys
import time
# 应用包名
app_package_name = 'me.hacket.demos'
# 延迟注入时间(秒),防止dex未加载
delay_time = 2
# hook脚本所在路径
hookJs='hook.js'
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
elif message['type'] == 'error':
print("[!] {0}".format(message['stack']))
# 启动应用程序
device = frida.get_usb_device()
print("Device: %s" % device)
print("app_package_name: %s" % app_package_name)
pid = device.spawn([app_package_name])
print("Pid: %d" % pid)
device.resume(pid)
time.sleep(1) # 等待应用程序启动
# 延迟注入
print(f"Waiting for {delay_time} seconds before injecting script...")
time.sleep(delay_time)
# 注入脚本
with open(hookJs, 'r',encoding='utf-8') as f:
script_code = f.read()
session = device.attach(pid)
script = session.create_script(script_code)
script.on('message', on_message)
script.load()
print("[*] Script injected successfully.")
sys.stdin.read()
- hook.js
1
2
3
4
5
6
7
8
9
10
11
12
13
// 从内存中寻找包含android字样的类并打印
Java.perform(function () {
Java.enumerateLoadedClasses({
onMatch: function (className) {
if (className.includes("android")) {
console.log(className);
}
},
onComplete: function () {
console.log("Class enumeration complete");
},
});
});
- 执行 hook
1
python hook.py
报错
Windows 上报错:need Gadget to attach on jailed
错误显示:问题出在这个 C:\Users\XXX\AppData\Local\Microsoft\Windows\INetCache\frida\gadget-android-arm64.so
文件中。
但是当我们去访问这个文件夹时,发现该文件夹不存在
因此我们自己创建这个文件夹:
C:\Users\XXX\AppData\Local\Microsoft\Windows\INetCache\frida\
去下载对应版本的: gadget-android-arm64.so
下载完成后解压,并将文件重命名为 gadget-android-arm64.so
放到 C:\Users\XXX\AppData\Local\Microsoft\Windows\INetCache\frida\gadget-android-arm64.so