准备工作
#以python3.7为列,frida版本12.8.0(据说是最稳定的版本)
#创建虚拟环境
conda create --name frida-object python=3.7.0
#查询conda的环境列表
conda env list
#进入虚拟环境
conda activate frida-object
#安装fida
pip install frida==12.8.0
#安装frida-tools
pip install frida-tools==5.3.0
#注意安装顺序,一定要安装frida,因为frida-tool包括frida,如果先安装frida-tools那么frida的版本会不正确。
#安装objection
pip install objection==1.8.4
服务器配置:
#查询手机CUP类型
adb shell
getprop ro.product.cpu.abi
#arm64-v8a
#下载arm
https://github.com/frida/frida/releases/download/12.8.0/frida-server-12.8.0-android-arm64.xz
#移到指定目录
mv /sdcard/frida-server-12.8.0-android-arm64 /data/local/tmp/frida
#授权
chmod 777 frida
#启动
./frida
定位关键代码
#注入应用
objection -g com.sichuanol.cbgc explore
#hook java的string
android hooking watch class_method java.lang.String.getBytes --dump-args --dump-backtrace --dump-return
frida注入
function sign(){
Java.perform(function (){
var sign = Java.use("com.sichuanol.cbgc.util.SignManager")
sign.getSign.implementation=function(a,b,c){
console.log("参数1:"+a);
console.log("参数2:"+b);
console.log("参数3:"+c);
var result = this.getSign(a,b,c);
console.log("返回值:"+result);
return result;
}
})
}
setImmediate(sign)
//主动调用
function call(){
Java.perform(function (){
var sign = Java.use("com.sichuanol.cbgc.util.SignManager")
var result = sign.getSign("","","1646138183436")
console.log(result)
})
}
#frida -UF -l hook.js
#注入到当前的进程
-F、 --attach-frontmost. 附加到最前面的应用程序
-U, --usb connect to USB device
//hook so
var soAddress = Module.findBaseAddress("libwtf.so")
var funcAddress = soAddress.add(0xC90 +1);
//ida打开so文件,F5查防伪C代码,按tab键进入,再按下空格,左边就能看到地址了.text:00000C90
Interceptor.attach(funcAddress,{
onEnter:function(args){
console.log("args1:"+hexdump(args[0]))
console.log("arg2:"+args[1].toInt32())
},
onLeave:function (retval) {
}
})
var funcAddress = soAddress.add(0x8BC +1);
Interceptor.attach(funcAddress,{
onEnter:function(args){
this.arg = args[1]
this.arg1 = args[0]
},
onLeave:function (retval) {
console.log("args1:"+hexdump(this.arg))
console.log("args2:"+hexdump(this.arg1))
}
})
#frida 特俗写法
#构建StringBuilder对象
Java.use("java.lang.StringBuilder").$new("111")
#java强转
Java.cast(str,Java.use("java.lang.Object"));
#查看数据类型
str.$className