文章

Frida

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
  • ARM64frida-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 · Issue #597 · frida/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 方法、监控文件操作、网络请求、加解密函数等。

Frida 使用

frida-tools 使用

frida tools 主要有Frida CLIfrida-psfrida-tracefrida-discoverfrida-ls-devicesfrida-kill等命令工具。

frida cli

  • frida-ls-devices 查看电脑连接的设备信息,主要包括UDID连接方式设备名称,如下所示 202504090839860

  • frida-ps -U  查看通过 USB 连接的设备上运行的程序
  • frida-ps -Ua 查看正在运行的应用程序 202504090840588
  • 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

202504100040649

错误显示:问题出在这个 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

Ref

本文由作者按照 CC BY 4.0 进行授权