frida是一款方便并且易用的跨平台Hook工具,使用它不仅可以Hook Java写的应用程序,而且还可以Hook原生的应用程序。
1. 准备
frida分客户端环境和服务端环境。在客户端我们可以编写Python代码,用于连接远程设备,提交要注入的代码到远程,接受服务端的发来的消息等。在服务端,我们需要用Javascript代码注入到目标进程,操作内存数据,给客户端发送消息等操作。我们也可以把客户端理解成控制端,服务端理解成被控端。
假如我们要用PC来对Android设备上的某个进程进行操作,那么PC就是客户端,而Android设备就是服务端。
1.1 准备frida服务端环境
本文,服务端在Android平台测试。服务端环境准备步骤如下:
1.1.1 根据自己的平台下载frida服务端并解压
https://github.com/frida/frida/releases
1.1.2 执行以下命令将服务端推到手机的/data/local/tmp目录
adb push frida-server /data/local/tmp/frida-server
1.1.3 执行以下命令修改frida-server文件权限
adb shell chmod 777 /data/local/tmp/frida-server
注:Windows系统执行命令可以在CMD中进行;Linux和MacOS执行命令可以在终端中进行。adb是Android一个调试工具,具体安装方法不是本文的重点。
1.2 准备客户端环境
在PC上安装Python的运行环境,安装完成后执行下面的命令安装frida
pip install frida-tools
1.3 客户端命令参数
下面是frida客户端命令行的参数帮助
Usage: frida [options] target
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-D ID, --device=ID connect to device with the given ID
-U, --usb connect to USB device
-R, --remote connect to remote frida-server
-H HOST, --host=HOST connect to remote frida-server on HOST
-f FILE, --file=FILE spawn FILE
-n NAME, --attach-name=NAME
attach to NAME
-p PID, --attach-pid=PID
attach to PID
--debug enable the Node.js compatible script debugger
--enable-jit enable JIT
-l SCRIPT, --load=SCRIPT
load SCRIPT
-c CODESHARE_URI, --codeshare=CODESHARE_URI
load CODESHARE_URI
-e CODE, --eval=CODE evaluate CODE
-q quiet mode (no prompt) and quit after -l and -e
--no-pause automatically start main thread after startup
-o LOGFILE, --output=LOGFILE
output to log file
1.3.1 将一个脚本注入到Android目标进程
frida -U -l myhook.js com.xxx.xxxx
参数解释:
- -U 指定对USB设备操作
- -l 指定加载一个Javascript脚本
- 最后指定一个进程名,如果想指定进程pid,用-p选项。正在运行的进程可以用frida-ps -U命令查看
1.3.2 重启一个Android进程并注入脚本
frida -U -l myhook.js -f com.xxx.xxxx --no-pause
参数解释:
- -f 指定一个进程,重启它并注入脚本
- –no-pause 自动运行程序
- 这种注入脚本的方法,常用于hook在App就启动期就执行的函数。
frida运行过程中,执行%resume重新注入,执行%reload来重新加载脚本;执行exit结束脚本注入
2. Hook Java方法
2.1 载入类
Java.use方法用于加载一个Java类,相当于Java中的Class.forName()
。比如要加载一个String类:
var StringClass = J