Yakit针对流量加密APP的Frida rpc解决方案
字数 1308 2025-08-20 18:18:05
Yakit针对流量加密APP的Frida RPC解决方案教学文档
1. 基础知识
1.1 案例APP介绍
本教学使用一个具有登录加密功能的APP作为案例,该APP具有以下特点:
- 功能简单:仅包含用户名密码登录功能
- 加密方式:请求参数和响应报文均使用AES加密
- 加密类:
com.ese.http.encrypt.AesEncryptionBase64 - 加密密钥:
"9876543210123456"
1.2 Frida RPC基础
Frida RPC (Remote Procedure Call) 允许我们从Python代码中调用运行在目标进程中的JavaScript函数,这是实现流量加解密的关键技术。
2. Python RPC接口准备
2.1 Python服务端代码
import frida
import json
from flask import Flask, jsonify, request
def message(message, data):
if message['type'] == 'send':
print(f"[*] {message['payload']}")
else:
print(message)
# 连接到目标APP进程
session = frida.get_usb_device().attach("eseBrida")
# 加载JavaScript代码
with open("1.js") as f:
jsCode = f.read()
script = session.create_script(jsCode)
script.on("message", message)
script.load()
app = Flask(__name__)
# 加密接口
@app.route('/encrypt', methods=['GET'])
def decrypt_class():
plaintext = request.args.get('plaintext')
print("1111", plaintext)
plaintext = plaintext.replace(" ", "")
print("222", plaintext)
res = script.exports.invokemethoden(plaintext)
print(res)
return res
# 解密接口
@app.route('/decrypt', methods=['GET'])
def encrypt_class():
encrypttext = request.args.get('encrypttxt')
print("1111", encrypttext)
encrypttext = encrypttext.replace(" ", "")
print("222", encrypttext)
res = script.exports.invokemethodde(encrypttext)
return res
if __name__ == "__main__":
app.run(port=5001)
2.2 JavaScript代码 (1.js)
// 加密函数
function fridamethod01(cleartext) {
var result = null;
var key = "9876543210123456"
Java.perform(function() {
let AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
result = AesEncryptionBase64.encrypt(key, cleartext)
});
return result;
}
// 解密函数
function fridamethod02(encrypted) {
var result = null;
var key = "9876543210123456"
Java.perform(function() {
let AesEncryptionBase64 = Java.use("com.ese.http.encrypt.AesEncryptionBase64");
result = AesEncryptionBase64.decrypt(key, encrypted)
});
return result;
}
// 导出RPC方法
rpc.exports = {
invokemethoden: fridamethod01, // 加密方法
invokemethodde: fridamethod02, // 解密方法
}
3. Yakit热加载脚本实现
3.1 MITM界面热加载脚本
3.1.1 热加载脚本原理
- 在请求生命周期中的特定点插入Hook
- 选择在服务器响应后、存入数据库前对请求body和响应body进行解密
- 优点:不影响实际通信,仅影响展示
- 注意:数据库中将存储解密后的数据而非原始密文
3.1.2 实现步骤
- 在Yakit的MITM界面找到热加载脚本模板
- 编写Hook代码,主要针对以下时机:
- 请求发送前:可对请求进行加密
- 响应接收后:对响应进行解密
- 数据存储前:对数据进行处理
3.2 Fuzzer界面热加载脚本
3.2.1 实现要点
- 在发送请求前自动加密请求参数
- 在接收响应后自动解密响应内容
- 与MITM界面类似,但需要处理更复杂的请求构造场景
4. 完整工作流程
- 启动Python RPC服务:运行Python脚本启动Flask服务(端口5001)
- 注入Frida脚本:Python脚本会自动注入JavaScript到目标APP进程
- 配置Yakit:
- 设置MITM代理
- 加载热加载脚本
- 流量处理流程:
- 请求流程:明文 → Yakit加密 → 发送到服务器
- 响应流程:服务器密文 → Yakit解密 → 展示明文
- 数据存储:解密后的数据存入Yakit数据库
5. 关键点与注意事项
- 密钥处理:确保JavaScript中的密钥与APP使用的密钥一致
- 错误处理:在Python和JavaScript中添加适当的错误处理
- 性能考虑:RPC调用有一定开销,避免在高频请求场景使用
- 数据一致性:注意数据库存储的是解密后数据,可能影响后续分析
- 多线程安全:确保Flask服务能处理并发请求
6. 扩展应用
- 动态密钥:可修改脚本支持动态获取密钥
- 多种算法:扩展支持RSA等其他加密算法
- 自动化测试:结合Yakit的自动化测试功能实现全流程测试
- 批量处理:支持批量加解密操作
7. 调试技巧
- 使用
console.log或print输出调试信息 - 在Yakit中查看热加载脚本的执行日志
- 使用Frida的
message回调处理调试信息 - 分阶段测试:先测试单独加解密,再集成到Yakit中
通过以上方案,可以有效解决流量加密APP的安全测试难题,实现流量的可视化分析和测试。