一.Firda安装:
- frida分为客户端和服务端:
- 客户端:PC(控制端)
- 服务器:手机设备(被控制端)
- 客户端编写的 Python 代码,用于连接远程设备,提交要注入的 JS 代码到服务端,接受服务端发来的消息的
- 客户端安装:
pip install frida-tools
- 服务端安装:
adb shell cat /proc/cpuinfo 查看CPU架构
https://github.com/frida/frida/releases 根据手机架构要求找到frida-server
1.armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它.
2.arm64-v8a: 第8代、64位ARM处理器,很少设备。
3.x86: 平板、模拟器用得比较多。
4.x86_64: 64位的平板。
把下载好的frida-server解压完,adb 放到 /data/local/tmp 目录下,进行启动。
转发端口: adb forward tcp:27042 tcp:27042
二.HOOK:
上面基本简单介绍一下frida, 和安装流程,接下来就是一个简单的HookDemo, 话不多说上代码。
import frida
import sys
jscode = """
/* 这个字段标记Java虚拟机(例如: Dalvik 或者 ART)是否已加载, 操作Java任何东西的之前,要确认这个值是否为true */
if(Java.available){
Java.perform(function(){
/* Java.use方法用于声明一个Java类,在用一个Java类之前首先得声明。比如声明一个String类,要指定完整的类名var StringClass=Java.use("java.lang.String"); */
var MainActivity = Java.use("xxx.xxx.xxx.helpers.utils.Sign");
/* 类.函数.overload(参数类型).implementation = function(形参名称){ */
MainActivity.a.overload("java.lang.String", "java.lang.String", "java.lang.String", "java.lang.String").implementation = function(str1, str2, str3, str4){
for( var i=0; i<arguments.length; i++){
console.log("arge >>>>>>>" + arguments[i])
}
/* 修改addnumber函数的返回值 */
var result = this.a(str1, str2, str3, str4);
console.log("this sign >>>>>>>> " + result)
console.log('------------------------------------------------')
return result
}
});
}
"""
def on_message(message, data):
if message['type'] == 'send':
print(" {0}".format(message['payload']))
else:
print(message)
# 查找USB设备并附加到目标进程
session = frida.get_usb_device().attach('xxx.xxx.xxx') # appName
# 在目标进程里创建脚本
script = session.create_script(jscode)
# 注册消息回调
script.on('message', on_message)
# 加载创建好的javascript脚本
script.load()
# 读取系统输入
sys.stdin.read()