Hook框架之Frida
Frida是一款轻量级HOOK框架,可用于多平台上,例如android、windows、ios等。
frida分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在系统机器上。
frida上层接口支持js、python、c等。
Frida官方github地址为:frida官方github地址
安装
[电脑端]
pip install frida --upgrade # 16.3.3
pip install frida-tools --upgrade # 12.4.3
[手机端]
# 1 查看手机架构
adb shell getprop ro.product.cpu.abi
# arm64-v8a # 2 下载frida-server
https://github.com/frida/frida/releases
# 3 根据平台下载:
https://github.com/frida/frida/releases/download/16.3.3/frida-server-16.3.3-android-arm64.xz # 4 解压 # 5 推送到手机【真机】 :跟我一样的目录
adb push ./frida-server-16.3.3-android-arm64 /data/local/tmp/ # 6 给软件赋予执行权限:打开cmd
adb shell # 进入到手机
su # 获取超级用户权限--》第一次--》手机上有提示:允许root权限 (需要再面具上,超级用户 > 开启Shell)
cd /data/local/tmp # 进入到手机的文件夹下
ls # 没有文件,原来是空的,推动过来后,就有frida-server-16.3.3-android-arm64
ls -al # 查看文件详情,发现没有x权限
chmod +x ./frida-server-16.3.3-android-arm64 # 给它加x权限
ls -al # 查看文件详情,有x权限了,ok了 # 启动服务
./frida-server-16.3.3-android-arm64
3) 电脑端开启端口转发(并不是必须)
# 方式一:使用命令【cmd中】
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043 # 方式二:使用python命令【python调用系统命令--本质和上面一模一样】
import subprocess
subprocess.getoutput("adb forward tcp:27042 tcp:27042")
subprocess.getoutput("adb forward tcp:27043 tcp:27043")
Frida两种启动方式
# Spawn 方式适应场景:Spawn 方式是在目标应用程序启动时直接注入 Frida 的 Agent 代码 需要在应用程序启动的早期阶段进行 Hook。
需要访问和修改应用程序的内部状态,例如应用程序的全局变量、静态变量等。
需要 Hook 应用程序的初始化过程,以实现对应用程序的自定义初始化逻辑。
需要在应用程序的上下文中执行代码,并与其他模块或库进行交互。 # Attach 方式适应场景:Attach 方式是在目标应用程序已经运行的过程中动态地连接并注入 Frida 的 Agent 代码
需要对已经运行的应用程序进行 Hook,即动态地连接到正在运行的进程。
需要在应用程序运行时拦截和修改特定的方法调用。
需要实时监视和修改应用程序的行为,例如参数修改、返回值篡改等。
需要对应用程序进行调试和分析,以查找潜在的问题和漏洞。 # spawn:app不用运行,就可以,想hook,app就会执行的函数,就用这种方案
# attach:app要先运行,才可以,想hook,app启动后,点击某个按钮,才执行的,就用这种方案
使用
1.以attach的方式定位加密方法
[JS]
function login() {
Java.perform(function () {
// 找到包名
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil") // 包名 . 类名
// 对方法进行重新实现
SecurityUtil.encodeMD5.implementation = function (str) {
console.log('未加密之前的字符串:', str)
var res = this.encodeMD5(str) // 执行原来的逻辑
console.log('加密之后的字符串:', res)
return res
}
})
}
function main() {
login()
}
setImmediate(main())
执行命令:
frida -UF -l chezhiying_pwd_hook.js // 参数说明:
// -U: 通过USB链接的设备
// -F: 以attach的方式注入
// -l: 加载的脚本
[Python]
基本使用:
import frida, sys jsCode = """ ...... """
process = frida.get_usb_device().attach('com.dodonew.online') //
script = process.create_script(jsCode)
script.load()
sys.stdin.read()
// pid方式
process = frida.get_usb_device().attach(1234) # 1234 pid
示例:
import frida
import sys # 获取链接设备
device = frida.get_remote_device()
# sess = device.attach('车智赢+') # APP应用名称
sess = device.attach(14520) # 进程pid # 添加JS代码
src = '''
Java.perform(function(){
// 1.找到类
var util = Java.use("com.autohome.ahkit.utils.SecurityUtil");
// 2. 替换类中方法
util.encodeMD5.implementation = function(str){
console.log('传入的参数:', str);
var res = this.encodeMD5(str);
console.log('加密后的参数:', res);
return res;
};
});
''' script = sess.create_script(src) def on_message(msg, data):
print(msg, data) script.on('message', on_message)
script.load() sys.stdin.read()
2.spawn方式
基本使用:
device = frida.get_usb_device()
pid = device.spawn(["com.dodonew.online"]) # 以挂起方式创建进程(这里是跟attach的方式不同)
process = device.attach(pid)
script = process.create_script(jsCode)
script.load()
device.resume(pid) # 加载完脚本, 恢复进程运行
sys.stdin.read()
示例:
import frida
import sys
rdev = frida.get_remote_device()
pid = rdev.spawn(["com.che168.autotradercloud"]) # 需要写app包名
session = rdev.attach(pid) scr = """
Java.perform(function () {
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
SecurityUtil.encodeMD5.implementation = function(str){
console.log("明文:",str);
var res = this.encodeMD5(str);
console.log("md5加密结果=",res);
return res;
}
});
""" script = session.create_script(scr)
def on_message(message, data):
print(message, data) script.on("message", on_message)
script.load()
# 唤起应用程序
rdev.resume(pid)
sys.stdin.read()
3.连接非标准端口
process = frida.get_device_manager().add_remote_device('192.168.3.68:8888').attach('com.dodonew.online')
连接多个设备:
process = frida.get_device_manager().add_remote_device('192.168.3.68:8888').attach('com.dodonew.online')
script = process.create_script(jsCode)
script.load()
process1 = frida.get_device_manager().add_remote_device('192.168.3.69:8888').attach('com.dodonew.online')
script1 = process.create_script(jsCode)
script1.load()
sys.stdin.read()
数据通信:
在 jscode 中可以使用send(data),将数据传入到 onMessage 回调函数中处理
在 js 端中可以通过 send 向 python 发送数据,而 python 要向 js 发送数据则需要使用 script.post,js 中使用 recv 来接收,演示代码如下
jsCode = """
Java.perform(function(){
var Utils = Java.use('com.dodonew.online.util.Utils');
Utils.md5.implementation = function(a){
console.log('MD5 string: ', a);
var retval = this.md5(a);
send(retval);
recv(function(obj){
console.log(JSON.stringify(obj));
retval = obj.data;
}).wait();
return retval;
}
});
""" def onMessage(message, data):
print(message)
if message["type"] == 'send':
print(u"[*] {0}".format(message['payload']))
time.sleep(10)
script.post({"data": "a123456"})
else:
print(message)
这样就实现了, 有些运算可以在Python中实现之后,再回传回JS中继续执行后续的逻辑
辅助工具:
1.frida-gum: JS代码提示
npm install --save @types/frida-gum
常见问题:
1.frida.TransportError: timeout was reached
解决: 重启手机端的frida-server服务即可
Hook框架之Frida的更多相关文章
- Android Hook框架adbi源码浅析(二)
二.libbase 其实上面加载完SO库后,hook的功能我们完全可以自己在动态库中实现.而adbi作者为了方便我们使用,编写了一个通用的hook框架工具即libbase库.libbase依然在解决两 ...
- Android Hook框架adbi源码浅析(一)
adbi(The Android Dynamic Binary Instrumentation Toolkit)是一个Android平台通用hook框架,基于动态库注入与inline hook技术实现 ...
- android免root hook框架legend
一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...
- Android中免root的hook框架Legend原理解析
一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...
- android hook 框架 ADBI 如何实现dalvik函数挂钩
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 libinject 如何实现so注入
前面两篇 android hook 框架 libinject2 简介.编译.运行 android hook 框架 libinject2 如何实现so注入 实际运行并分析了 Android中的so注入( ...
- android hook 框架 libinject2 如何实现so注入
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- android hook 框架 libinject2 简介、编译、运行
Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2 如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...
- 基于 VirtualApp 结合 whale hook框架实现hook第三方应用
要点 1. whale hook framework 使用示例: 2. 参考项目:VirtualHook: 3. 按照 VirtualHook 修改 VirtualApp: 4. 编写 hook pl ...
- Android平台下Dalvik层hook框架ddi的研究
通过adbi,可以对native层的所有代码进行hook.但对于Android系统来说,这还远远不够,因为很多应用都还是在Dalvik虚拟机中运行的. 那么,有没有什么办法可以对Dalvik虚拟机中跑 ...
随机推荐
- OpenCV开发笔记(八十):基于特征点匹配实现全景图片拼接
前言 一个摄像头视野不大的时候,我们希望进行两个视野合并,这样让正视的视野增大,从而可以看到更广阔的标准视野.拼接的方法分为两条路,第一条路是Sticher类,第二条思路是特征点匹配. 本篇使用 ...
- hook拼多多客服软件发消息,拼多多客服机器人代码,拼多多发消息代码
最近由于工作需要,逆向了拼多多客服平台,能调用消息监听.消息发送.根据订单号发起会话,是纯hook实现的,demo包括c++调用demo,c#调用demo.hook 的dll是c++编写的,有需要的人 ...
- C# WebSocket高并发通信阻塞问题
项目上遇到使用WebSocket超时问题,具体情况是这样的,OTA升级过程中,解压zip文件会有解压进度事件,将解压进度通过进程通信传给另一进程,通信提示超时异常 小伙伴堂园发现大文件使用Zip解压, ...
- GRLSTM: 基于图的残差LSTM轨迹相似性计算《GRLSTM: Trajectory Similarity Computation with Graph-Based Residual LSTM》(轨迹路网融合、知识图谱嵌入、图神经网络、残差网络、点融合图、多头图注意力网络GAT、残差LSTM、点感知损失函数(图的点损失函数、轨迹的点损失函数))
2023年10月18日,14:14. 来不及了,这一篇还是看的翻译. 论文:GRLSTM: Trajectory Similarity Computation with Graph-Based Res ...
- Angular 18+ 高级教程 – Prettier, ESLint, Stylelint
前言 不熟悉 Prettier, ESLint, Stylelint 的朋友可以先看这篇 工具 – Prettier.ESLint.Stylelint. 首先,Angular 没有 built-in ...
- QT硬件异构计算
QT硬件异构计算 使用AI技术辅助生成 1 QT硬件异构计算概述 1.1 硬件异构计算概念 1.1.1 硬件异构计算概念 硬件异构计算概念 <QT硬件异构计算>正文 硬件异构计算概念 在进 ...
- 三大硬核方式揭秘:Java如何与底层硬件和工业设备轻松通信!
大家好,我是V哥,程序员聊天真是三句不到离不开技术啊,这不前两天跟一个哥们吃饭,他是我好多年前的学员了,一直保持着联系,现在都李总了,在做工业互联网相关的项目,真是只要 Java 学得好,能干一辈子, ...
- jpa 多条件模糊查询,分页并排序
jpa 多条件模糊查询,分页并排序很难吗,这样写不就几行代码的事吗?搞不明白你们写的怎么长篇大论花里胡哨的,看的一脸懵逼. jpa多字段模糊查询,持久层字段还是要一一对应的,但是你可以在service ...
- 可视化U-Net编码器每层的输出(在已经训练好的模型下展示,并不是初始训练阶段展示)
想看一下对于一个训练好的模型,其每一层编码阶段的可视化输出是什么样子的.我以3Dircabd肝脏血管分割为例,训练好了一个U-Net模型.然后使用该模型在推理阶段使用,并可视化了每一层编码器. 分割结 ...
- 封装大屏组件 screenfull
错误场景:使用大屏插件 screenFull 报错:in ./node_modules/screenfull/index.js Module parse failed: Unexpected tok ...