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 实现步骤

  1. 在Yakit的MITM界面找到热加载脚本模板
  2. 编写Hook代码,主要针对以下时机:
    • 请求发送前:可对请求进行加密
    • 响应接收后:对响应进行解密
    • 数据存储前:对数据进行处理

3.2 Fuzzer界面热加载脚本

3.2.1 实现要点

  1. 在发送请求前自动加密请求参数
  2. 在接收响应后自动解密响应内容
  3. 与MITM界面类似,但需要处理更复杂的请求构造场景

4. 完整工作流程

  1. 启动Python RPC服务:运行Python脚本启动Flask服务(端口5001)
  2. 注入Frida脚本:Python脚本会自动注入JavaScript到目标APP进程
  3. 配置Yakit
    • 设置MITM代理
    • 加载热加载脚本
  4. 流量处理流程
    • 请求流程:明文 → Yakit加密 → 发送到服务器
    • 响应流程:服务器密文 → Yakit解密 → 展示明文
  5. 数据存储:解密后的数据存入Yakit数据库

5. 关键点与注意事项

  1. 密钥处理:确保JavaScript中的密钥与APP使用的密钥一致
  2. 错误处理:在Python和JavaScript中添加适当的错误处理
  3. 性能考虑:RPC调用有一定开销,避免在高频请求场景使用
  4. 数据一致性:注意数据库存储的是解密后数据,可能影响后续分析
  5. 多线程安全:确保Flask服务能处理并发请求

6. 扩展应用

  1. 动态密钥:可修改脚本支持动态获取密钥
  2. 多种算法:扩展支持RSA等其他加密算法
  3. 自动化测试:结合Yakit的自动化测试功能实现全流程测试
  4. 批量处理:支持批量加解密操作

7. 调试技巧

  1. 使用console.logprint输出调试信息
  2. 在Yakit中查看热加载脚本的执行日志
  3. 使用Frida的message回调处理调试信息
  4. 分阶段测试:先测试单独加解密,再集成到Yakit中

通过以上方案,可以有效解决流量加密APP的安全测试难题,实现流量的可视化分析和测试。

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服务端代码 2.2 JavaScript代码 (1.js) 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的安全测试难题,实现流量的可视化分析和测试。