2 frida

什么是 Frida?

frida 是一个动态插桩工具,可以让原生 APP 运行一些代码,类似浏览器上的拓展插件 Greasemonkey (也就是很火的油猴子)。

类似一个 Hook 框架,可以动态的 hook 程序,调用程序的原生方法等!

Frida 官方:Frida • A world-class dynamic instrumentation toolkit | Observe and reprogram running programs on Windows, macOS, GNU/Linux, iOS, watchOS, tvOS, Android, FreeBSD, and QNX

Frida 源码:https://github.com/frida

Frida 脚本

FRIDA脚本就是利用FRIDA动态插桩框架,使用FRIDA导出的API和方法,对内存空间里的对象方法进行监视、修改或者替换的一段代码。

FRIDAAPI是使用JavaScript实现的,所以我们可以充分利用JS的匿名函数的优势、以及大量的hook和回调函数的API

Frida 安装

Frida-Server

Frida-Server 是安装到手机上的,安装之前我们需要检查手机系统,检测命令如下:

getprop ro.product.cpu.abi
image-20230213150347932

可以发现我的手机是 arm64 的,可以去官方下载一个 Releases · frida/frida (github.com) 对应 CPU,个人有版本控,因此直接先尝试怼最新的版本。

image-20230213150713495

下载完毕后解压,将其用 adb 导入到手机里面去

adb push ~/Downloads/frida-server-16.0.8-android-arm64 /data/local/tmp/
image-20230213151107363

尝试运行一下,在运行之前先尝试修改一下名字,并且需要赋予权限

15:11:00 › adb shell
OnePlus6:/ $ su
OnePlus6:/ # cd /data/local/tmp/
OnePlus6:/data/local/tmp # ls
frida-server-16.0.8-android-arm64
OnePlus6:/data/local/tmp # mv frida-server-16.0.8-android-arm64 frd-16.0.8
OnePlus6:/data/local/tmp # ls
frd-16.0.8
OnePlus6:/data/local/tmp # chmod 755 frd-16.0.8
OnePlus6:/data/local/tmp # ./frd-16.0.8

运行完之后界面直接阻塞卡住了,这个是正常的。

Frida-Client

暂时先命名为 Frida-Client 把,因为手机上的叫做 Frida-Server,上面章节中我们已经将 Frida-Server 在手机上部署好了,这个时候我们需要在自己的电脑上安装 Frida-Client (其实只是我自己这么叫),Frida-Client 包括 frida-python 和一个 frida-tools

首先安装 frida-python , 因为我们第一步装的版本是 16.0.8 的,所以这次装的时候需要指定一下八本,并且加一下镜像源,加快下载速度

pip install frida==16.0.8 --upgrade -i https://pypi.douban.com/simple/
image-20230213153836748

然后安装 frida-tools

pip install frida-tools --upgrade -i https://pypi.douban.com/simple/
image-20230213152236235

检查一下是否安装成功,可以使用以下命令

frida --version
image-20230213154951826

输入以下命令查看正在运行的进程来看看我们之前跑的 frida-server 是不是运行成功了

frida-ps -U | grep fr
image-20230213155206116

可以看到我们的 frida-server 是已经成功运行了的!

脚本测试

尝试编写一个典型的 hello world 脚本,该脚本的功能就是打印一下 hello world

setTimeout(function(){
  Java.perform(function(){
      console.log("hello world!");
    });
});

编写一段管理脚本

# -*- coding: utf-8 -*-
# @Time    : 2023/2/13 16:01
# @Author  : Kem
# @File    : hello_world.py
# @Software: PyCharm
# @Desc    : 请输入文件描述信息

import time

import frida

# 初始化一个 device manager
device_manage = frida.get_device_manager()

# 获取当前正在连接的 USB 设备
device8 = device_manage.get_usb_device()

# 附件进程 -> com.android.settings

# 将进程 com.android.settings 变为可附加状态, 获取 pid
pid = device8.spawn("com.android.settings")
device8.resume(pid)
time.sleep(1)

# 附加这个 pid
session = device8.attach(pid)

# 加载 js 脚本
with open("js/helloWorld.js") as f:
    script = session.create_script(f.read())
script.load()
input()  # 等待输入

该脚本的功能就是打开 frida ,附加到 settings 这个进程上,然后执行 helloWorld.js 脚本,

此时我们关注到手机的状态如下(frida-server 已经安装完毕并打开了 )

image-20230213160857252

可以看到,当我们运行程序的时候,手机就会打开 settings ,并且输出 hello world

image-20230213160946752
image-20230213160952813

最后更新于

这有帮助吗?