使用frida工具对Android应用进行Hook

使用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代码截图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200805143021670.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlcHB5c2hvd19teXNlbGY=,size_16,color_FFFFFF,t_70

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值