环境搭建
https://github.com/frida/frida/releases
pycharm
python: 3.11.5
frida-server: frida-server-16.1.7-android-arm64.xz
模拟器 android 8 root
server端:
- 先将frida-server-16.1.7-android-arm64.xz解压得到frida文件
- adb push frida /data/local/tmp
- adb shell
- su
- cd /data/local/tmp
- chmod 777 frida
- 运行./frida
以上搭配手机环境。重新换一个终端 进行端口转发
adb forward tcp:27042 jdwp:27042
adb forward tcp:27043 jdwp:27043
frida-ps -U 列出进程
adb shell ps 查看进程pid
加载脚本
attach后可以写入进程名 com.xxx.xxx .如果提示找不到进程,可以使用pid
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| import frida # 导入frida模块 import sys # 导入sys模块
jscode = """ send('script load ! '); Java.perform(function(){ send(' load into java ! '); var MainActivity = Java.use('com.junxi.bizhewan.ui.game.detail.GameDetailActivity'); send('MainActivity success !'); MainActivity.getMsg.implementation = function(){ send('Statr! Hook!'); return 'return hooked'; } }); """
def on_message(message, data): # js中执行send函数后要回调的函数 print(message)
device = frida.get_remote_device() pid = device.spawn(["com.junxi.bizhewan.sdkdemo"]) device.resume(pid) time.sleep(1)
process = device.attach(pid) # 得到设备并劫持进程com.example.testfrida(该开始用get_usb_device函数用来获取设备,但是一直报错找不到设备,改用get_remote_device函数即可解决这个问题) script = process.create_script(jscode) # 创建js脚本 script.on('message', on_message) # 加载回调函数,也就是js中执行send函数规定要执行的python函数 script.load() # 加载脚本 sys.stdin.read()
|
执行 python3 main.py
得保证frida-server正在运行,方法可以是在kali主机输入frida-ps -U命令,如果安卓机上的进程出现了,则frida-server运行良好。
还需要保证selinux是关闭的状态,可以在adb shell里,su -获得root权限之后,输入setenforce 0命令来获得,在Settings→About Phone→SELinux status里看到Permissive,说明selinux关闭成功。