使用Frida进行 hook
Frida 环境搭建介绍
1、首先需要去github下载frida server文件,下载链接如下https://github.com/frida/frida/releases,根据Android手机不同的CPU架构选择合适的frida-server文件
2、通过adb push 命令将下载好的frida-server文件传到手机设备中,设置frida-server文件的执行权限
3、电脑安装python pip
4、使用pip安装frida (pip install frida== versin name/python -m pip install frida== version name)
使用frida对Android java 方法进行hook
写了一个Android Demo程序,进行演示,Demo代码截图:
TestgetString是一个重载函数,对重载函数进行hook时需要指定参数的类型,hook代码如下所示:
import frida,sys
check_hook_code = “”" send(“Running Script”);
Java.perform(function(){
var MainActivity = Java.use(“com.bluetooth.myapplication.MainActivity”);
MainActivity.TestgetString.overload(“int”).implementation = function(v){
send(“TestDStringValu:”+arguments[0]);
send(this.TestgetString(v));
}
}); “”"
def on_message(message, data):
if message[‘type’] == ‘send’:
print("[*] {0}".format(message[‘payload’]))
else:
print(message)
process = frida.get_device_manager().enumerate_devices()[-1].attach(“com.bluetooth.myapplication”)
script = process.create_script(check_hook_code)
script.on(‘message’, on_message)
script.load()
sys.stdin.read()
运行frida hook脚本,打印结果如下所示:
成功获取到TestgetString传递的参数以及返回值
有时候我们进行hook的话,参数和结果不一定时字符串类型,如果我们遇到复杂参数的话该如何进行打印呢。如下将列举几种复杂参数的打印方法。
打印hashmap类型:
var Map = Java.use(‘java.util.HashMap’);
var args_x = Java.cast(x, Map);
send(args_x.toString());
打印byte[]类型:
var arr = Java.use(“java.util.Arrays”);
var JavaString =Java.use(“java.lang.String”);
send(“参数对应数组:” + arr.toString(x))
send(“参数对应字符串:” + JavaString.$new(x))
有时候我们需要hook函数,并查看函数的调用栈,那么我们可以通过如下方法获取函数的调用栈:
send(Java.use(“android.util.Log”).getStackTraceString(Java.use(“java.lang.Throwable”).$new());
以上是常用的打印Java函数的方法,但是frida不仅能够对Java层函数进行hook,还能够对native层函数进行hook。
使用frida对Android Native方法进行hook
如下是一个应用的native方法:
加载的lib库名称为smart_connection_jni,然后Native方法有StartSmartConnection,InitSmartConnection,GetProtoVersion等。
我们以InitSmartConnection方法为例进行示范:
首先还是在设备中运行frida_server应用,然后进行端口转发,最后进行frida hook脚本的编写并运行。
首先使用IDA工具对libsmart_connection_jni.so进行反汇编,寻找该库中的导出函数,如下所示:
可以发现InitSmartConnection函数是导出的,如果函数是导出的话,那么我们frida hook脚本可以如下所示:
如果函数是未导出的话,那么我们得获取到函数的偏移,然后通过so基址加上函数的偏移来找到对应的函数,如下所示是一个未导出的函数:
在ida中我们发现他的便宜是0x76A4,所以我们hook脚本如下所示:
参考资料:
https://blog.csdn.net/weixin_35762183/article/details/106802647
https://blog.csdn.net/weixin_33836874/article/details/93088328