什么是 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
和方法,对内存空间里的对象方法进行监视、修改或者替换的一段代码。
FRIDA
的API
是使用JavaScript
实现的,所以我们可以充分利用JS
的匿名函数的优势、以及大量的hook
和回调函数的API
。
Frida 安装
Frida-Server
Frida-Server
是安装到手机上的,安装之前我们需要检查手机系统,检测命令如下:
getprop ro.product.cpu.abi
可以发现我的手机是 arm64
的,可以去官方下载一个 Releases · frida/frida (github.com) 对应 CPU
,个人有版本控,因此直接先尝试怼最新的版本。
下载完毕后解压,将其用 adb
导入到手机里面去
adb push ~/Downloads/frida-server-16.0.8-android-arm64 /data/local/tmp/
尝试运行一下,在运行之前先尝试修改一下名字,并且需要赋予权限
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/
然后安装 frida-tools
pip install frida-tools --upgrade -i https://pypi.douban.com/simple/
检查一下是否安装成功,可以使用以下命令
输入以下命令查看正在运行的进程来看看我们之前跑的 frida-server
是不是运行成功了
可以看到我们的 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
已经安装完毕并打开了 )
可以看到,当我们运行程序的时候,手机就会打开 settings
,并且输出 hello world