frida安装
推荐安装以下版本
pip install frida==14.2.18
pip install frida-tools==9.2.5
pip install objection==1.8.4
frida-server安装
安装的frida版本:需要下载与安装的frida版本对应的frida-server,否则会出错
C:\Users\Administrator>frida --version
12.2.25
手机设备的架构
从 https://github.com/frida/frida/releases 中获取对应安装版本的 frida-server
# 先查看设备平台,然后在官网下载对应 server 版本
adb shell getprop ro.product.cpu.abi # 查看设备CPU
# 获取架构信息后,再与安装的Frida版本结合,便可前去Github下载
# 其Frida-server文件命名格式如下:
# frida-server-
# 下载完毕之后,解压后通过adb push到设备的临时目录下
adb push [电脑端frida-server路径] /data/local/tmp/fs
adb shell
su
cd /data/local/tmp
chmod 777 fs # 文件权限修改
./fs # 启动frida-server
./fs -l 0.0.0.0:8888 # 监听端口就这样启动
启动frida服务并连接
然后 进行端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
完毕后,可以在windows上运行简单的frida命令测试我们是否安装成功了
frida-ps -U
frida 使用
代码内置在python文件中
# -*- coding: UTF-8 -*-
import frida,sys
js_code = '''
Java.perform(function(){
console.log("Frida Test");
var cls = Java.use("cn.gemini.k.fridatest.FridaHook1");
cls.func1_add.implementation = function(arg1,arg2){
console.log("hook arg1:",arg1," hook arg2:",arg2);
return this.func1_add(arg1,arg2);
}
});
'''
# 目标包名
appPacknName = "cn.gemini.k.fridatest"
scriptFile = "hook_script.js"
# 输出日志的回调方法
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
device = frida.get_usb_device()
# spawn模式,找到目标包名并重启,在启动前注入脚本
pid = device.spawn([appPacknName])
session = device.attach(pid)
# 注意这里需要将device.attach(pid)这句代码写在前面,这样执行才符合预期(启动时程序白屏,等待下面这行代码来恢复执行)
# 其实在https://www.jianshu.com/p/b833fba1bffe这篇文章中有提到
device.resume(pid)
# 方式一: 通过js文件创建hook代码
#with open(scriptFile, encoding='UTF-8') as f :
# script = session.create_script(f.read())
# 方式二: 直接将hook代码写在python文件中
script = session.create_script(js_code)
script.on('message', on_message)
script.load() #把js代码注入到目标应用中
# 避免结束
sys.stdin.read()
封装js文件
hook_script.js代码如下
function main(){
Java.perform(function(){
console.log("Frida Test");
var cls = Java.use("cn.gemini.k.fridatest.FridaHook1");
cls.func1_add.implementation = function(arg1,arg2){
console.log("hook arg1:",arg1," hook arg2:",arg2);
return this.func1_add(arg1,arg2);
}
});
}
setImmediate(main)
load2.py代码如下
# -*- coding: UTF-8 -*-
import frida,sys
# 目标包名
appPacknName = "cn.gemini.k.fridatest"
scriptFile = "hook_script.js"
# 输出日志的回调方法
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
device = frida.get_usb_device()
# spawn模式,找到目标包名并重启,在启动前注入脚本
pid = device.spawn([appPacknName])
session = device.attach(pid)
# 注意这里需要将device.attach(pid)这句代码写在前面,这样执行才符合预期(启动时程序白屏,等待下面这行代码来恢复执行)
# 其实在https://www.jianshu.com/p/b833fba1bffe这篇文章中有提到
device.resume(pid)
# 方式一: 通过js文件创建hook代码
with open(scriptFile, encoding='UTF-8') as f :
script = session.create_script(f.read())
# 方式二: 直接将hook代码写在python文件中
# script = session.create_script(js_code)
script.on("message", on_message)
script.load() #把js代码注入到目标应用中
# 避免结束
sys.stdin.read()
运行结果如下
// frida打印日志
λ python load2.py
Frida Test
hook arg1: 1 hook arg2: 2
// APP程序执行打印日志
19493-19493/cn.gemini.k.fridatest E/func1_add: arg1:1 arg2:2
19493-19493/cn.gemini.k.fridatest E/FridaHook1: 一般方法 ret:3