一,Frida 的简介
二,准备工作
2.1 安装frida【PC】
pip install frida==16.0.1
当出现上述报错时,使用以下手段解决:
- 下载egg
https://pypi.doubanio.com/simple/frida/
-
放入指定目录
-
再次安装
pip install frida==16.0.1
2.2 安装frida-tools【PC】
pip install frida-tools==12.0.1 推荐
pip install frida-tools -> 这种方式默认安装最新版,可能会将老版本的frida移除,并安装最新的frida版本
2.3 frida-server【手机端】
2.3.1. 查看CPU架构
需要借助adb查看,abd在之前安装Android Studio的时候就已经下载并添加到系统环境变量了
启动adb
adb start-server # 关闭 adb:adb kill-server
查看连接到adb的设备:手机需要用USB线连接电脑
adb devices
参看CPU架构(只有一个设备时,可以不写设备名)
adb shell getprop ro.product.cpu.abi
adb 【-s 设备名】 shell getprop ro.product.cpu.abi
2.3.2. 下载frida-server
下载链接:https://github.com/frida/frida/releases
2.3.3. 上传到手机并授权
下载的是一个压缩包,需要将压缩包解压,然后将解压出来的文件上传至手机的/data/local/tmp/
目录下
- 文件上传到设备指定目录
>>>adb push C:\frida-server-16.0.1-android-arm64 /data/local/tmp
- 授予可执行的权限
>>>adb shell 进入手机
>>>su 获得root权限
>>>cd /data/local/tmp/
>>>chmod 755 frida-server-16.0.1-android-arm64
补充:建议使用 frida-server-14.2.18 ,这个版本在防Frida反调试时更好使。具体版本搭配如下:
手机:frida == 14.2.18 frida_tools == 9.2.5
电脑:frida-server-14.2.18
2.4 启动
2.4.1 启动
>>>adb shell
>>>su
>>>cd /data/local/tmp/
>>>./frida-server-16.0.1-android-arm64
>>>mv frida-server-16.0.1-android-arm64 frida-16.0.1 # 对 frida-server 重命名,方便以后调用
2.4.2 端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
或者在Pycharm中使用终端执行代码
import subprocess
subprocess.getoutput("adb forward tcp:27042 tcp:27042")
subprocess.getoutput("adb forward tcp:27043 tcp:27043")
2.4.3 获取进程
# 枚举手机上的所有进程 & 前台进程
import frida
# 获取设备信息
rdev = frida.get_remote_device()
print(rdev)
# 枚举所有的进程
processes = rdev.enumerate_processes()
for process in processes:
print(process)
# 获取在前台运行的APP
front_app = rdev.get_frontmost_application()
print(front_app)
在电脑上运行如下命令可以查看手机上运行着的 App 进程:
frida-ps -U
三,hook
3.1 hook Java
**运行下面脚本的前提:**手机的frida-server已经开启,手机中的app已经开启,提前把端口转发了。
下面通过详细的注释来讲解使用方法:
结合下面的代码去理解:frida是使用python注入javascript脚本实现的,可以通过javascript脚本操作手机上的java代码
import frida
import sys
# 获取连接手机的设备
rdev = frida.get_remote_device()
# 调用设备的attach方法挂载对应的进程
process = rdev.attach("车智赢+") # 也可写包名:com.che168.autotradercloud
scr = """
Java.perform(function () {
// 首先调用Java对象的use方法获取指向UserModel类的指针,并赋值为UserModel
var UserModel = Java.use("com.che168.autotradercloud.user.model.UserModel");
// Hook,改写UserModel中的loginByPassword方法
UserModel.loginByPassword.implementation = function(str,str2){
send('Start Hook!') // 实现了Js到Python的消息通信
console.log(str,str2);
// 执行原来的方法
var res = this.loginByPassword(str,str2);
return res;
}
});
"""
# 调用create_script方法往进程中注入Hook的js脚本,并将返回结果赋值为script变量
script = process.create_script(scr)
def on_message(message, data):
print(message, data)
# 对于script变量,可以设置事件监听和回调方法,例如这里监听message事件,回调方法设置为on_message
# 这样