环境配置
本机的Python版本为Python3
Frida GitHub下载地址
Frida分为2个部分,第一个是位于PC的frida和frida-tools,第二个是位于手机端的frida-server。
位于电脑端的可以通过下面命令安装
pip install frida
pip install frida-tools
对于Python的环境管理推荐用Anaconda。
手机端需要一个root的手机。然后根据自己的手机架构从Github上下载对应版本的frida-server。
adb shell getprop ro.product.cpu.abi 查看手机架构
列入我的是arm64架构。
下载后进行解压,我把解压后的文件重命名为frida-server。
adb push firda-server /data/local/tmp 将frida-server放到手机的这个目录下
chmod 755 frida-server 赋予可执行权限
./frida-server & 后台运行frida-server
frida --version 电脑端查看安装的frida版本。
./frida-server --version 手机端查看安装的frida版本。
frida要求pc端和手机端的版本需要一致才可以。
简单实践
运行hookmethod python程序,手机上输入数字参数,点击调用成员方法。输出如下图,可以看出hook成功。
如果出现“frida.ServerNotRunningError: unable to connect to remote frida-server”的错误,试试端口转发:
adb forward tcp:27042 tcp:27042
使用gadget进行hook
在没有root手机的条件下,可以通过在代码中引入gadget.so文件来实现hook。
具体步骤
下载gadget库文件,并放到代码中进行加载
下载地址 注意,尽量下载最新版本,新版本修复了很多bug,避免之后遇到bug浪费我们的时间。将下载的.so.xz文档解压,获得so文件,重命名为libgadget.so,拷贝到项目中.
编写配置文件libgadget.config.so
{
"interaction": {
"type": "script",
"path": "/data/local/tmp/gadget_script.js"
}
}
interaction代表交互类型
- Listen
- Connect
- Script
-
ScriptDirectory
Listen和Connect交互方式需要通过电脑与手机建立连接,然后通过发送脚本命令进行交互。Script交互方式为我们写好脚本,gadget会到指定路径加载运行脚本。path则代表脚本路径
修改代码
在应用启动时就加载gadget库文件。
编写脚本
将编写好的脚本push到配置文件中写的手机存储目录
'use strict';
console.log("Waiting for Java..");
//将该脚本push到手机中 adb push gadget_script.js data/local/tmp
setImmediate(function() {
Java.perform(function () {
var Log = Java.use("android.util.Log");
Log.v("Frida", "脚本开始执行!");
var MainActivity = Java.use("com.demo.fridahook.MainActivity");
MainActivity.add.implementation = function(a,b){
Log.v("Frida","MainActivity add方法调用 a="+a+" b="+b);
return this.add(a,b);
}
Log.v("Frida", "脚本执行完!");
});
});
编译运行
运行app,可以看到hook方法成功
Demo地址