作者 | 原文传送 |
---|---|
littley | www.littley.top |
Frida是一款基于python + javascript 的hook框架,可运行在android ios linux windows osx等各平台,主要使用动态二进制插桩技术;由于是基于脚本(javascript)的交互,因此相比xposed和substrace cydia更加便捷
官网址址:https://frida.re/
github地址:https://github.com/frida/frida
Frida的安装很简单,需要在windows安装frida客户端和在安卓安装frida服务端。
pip install frida-tools
pip install frida
下载 : https://github.com/frida/frida/releases相应的版本
我用的是mumu模拟器所以下载的是frida-server-12.8.6-android-x86.xz
下载后解压(主意下载是压缩包,要解压一下)
使用adb连接mumu模拟器(注意打开root权限及usb调试模式)
adb connect 127.0.0.1:7555
关闭指令为
adb disconnect 127.0.0.1:7555
将上面的解压得到的文件传送至模拟器上到/data/local/tmp 目录,并命名为frida-server
adb push frida-server-12.8.6-android-x86 /data/local/tmp/frida-server
进入adb shell并设置frida-server的权限
使用./frida-server启动服务
之后另外开启一个命令窗口运行命令:frida-ps -U(查看运行的进程)
最后将手机端的端口转发到PC端进行通信
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043
使用jdax-gui工具打开nice-main-5.4.29-release.apk(反编译时间过长,耐心等待…),反编译完点击jdax-gui的File—> Save as gradle project将源码保存在本地,并使用vscode打开
本次实战hook点是使用已有账登录,输入账号密码后,点登录获取账号密码信息
Fiddler代理设置请自行百度
通过Fiddlert查看,每获次登录的请求响应如下
由上图片得出请求路径:/account/login
vscode中全文搜索/account/login
在bil.java中a方法中找到
由此得见,我们从a方法就是我们的hook点,a方法的参数jsonObject str即是我们要获取的内容
import frida
import sys
# hook逻辑脚本
jscode = """
Java.perform(function () {
//获取bli类型,使用js将其包状成代理对象
var bil = Java.use('bil');
var function_a = bil.a;
//重写方法a
function_a.overload("org.json.JSONObject","java.lang.String").implementation = function (obj,str) {
// Show a message to know that the function got called
send('function_a');
send('obj'+obj);
send('str'+str);
// Call the original onClick handler
//调用实际的a方法(即包装之前的a方法,类似于装饰器工能)
return this.a( obj,str);
};
});
"""
# 注入进程,attach传入进程名称(字符串)或者进程号(整数)
rdev = frida.get_remote_device()
session = rdev.attach("com.nice.main")
script = session.create_script(jscode)
#int()函数把字符串表示的16进制数转换成整数
#上面的jscode % int(sys.argv[1], 16)是python格式化字符串的语法
# 接收脚本信息的回调函数
# message是一个对象,type属性为send则表示send函数发送的信息,其内容在payload里
# 下面这个on_message函数可以做固定用法,一般无需改动,当然也可直接打印message看看里边的内容
def on_message(message, data):
if message['type'] == 'send':
print(message['payload'])
elif message['type'] == 'error':
print(message['stack'])
# 应该是设置message事件的回调函数
script.on('message', on_message)
# 加载hook脚本
script.load()
# 保持主线程不结束(也可以使用time.sleep循环)
sys.stdin.read()
#在反编译的文件中有些类没有包名如:
package defpackage;说明没有包名,在使用Java.use();方法时
直接使用类名就可以了如Java.use(‘bil’);
参考:https://blog.csdn.net/chifu5720/article/details/102861359
运行脚本前一定要先在模拟器中将nice app运行起来
然后在cmd中运行
python my_script.py
然后输入账号密码即可获取到账号与密码(此处密码是加密后的)等相关内容
成功hook!!!
相关资料:
https://blog.csdn.net/qq_44906504/article/details/89672518
https://blog.csdn.net/u014476720/article/details/83537843
https://blog.csdn.net/qq_44906504/article/details/89672518
https://blog.csdn.net/jinangl_vsnake/article/details/72919329
https://www.cnblogs.com/tjp40922/p/11353808.html
https://www.52pojie.cn/forum.php?mod=viewthread&tid=931872
在使用frida过程中发现有些app会对27042 /27043端口或frida-server服务名称进行检测,导制一运行frida注入app就闪退,解决方法如下:
1.重命名服务frida-server为不fs64或其他名字
2.frida服务默认启动端口为27042可指定端口端启动如:
chmod 777 fs64
fs64 -l 0.0.0.0:1234
然后转发
adb forward tcp:1234 tcp:1234
客户端使用方式:
frida-cli的使用自定端口的方式:
frida -H 127.0.0.1:1234 package_name -l hook.js
python脚本使用自定义端口的方式:
host = '127.0.0.1:1234'
manager = frida.get_device_manager()
device= manager.add_remote_device(host)
备注:get_remote_device()方法,后来发现这个函数默认连接的是127.0.0.1:27042,使用上面代码代替即可
相关资料:
https://bbs.pediy.com/thread-254974.htm
https://wrlu.cn/cyber-security/mobile-security/android-frida/
作者 | 原文传送 |
---|---|
littley | www.littley.top |