frida动态调试环境搭建

环境搭建

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端:

  1. 先将frida-server-16.1.7-android-arm64.xz解压得到frida文件
  2. adb push frida /data/local/tmp
  3. adb shell
  4. su
  5. cd /data/local/tmp
  6. chmod 777 frida
  7. 运行./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关闭成功。