https://github.com/mr-m0nst3r/Burpy
-
加解密操作:rpc.js 脚本定义了加密和解密的具体方法,它通过调用目标应用中的加密/解密类来实现加解密。
-
Burpy 通过调用 rpc.js 中的加解密方法,将数据传给应用内部的加密或解密函数,获取处理后的结果。
-
数据处理:Burpy 会调用 rpc.js 提供的加密或解密接口,传递数据并返回加密后的密文或解密后的明文。
-
简单来说,Burpy 是一个 Python 脚本,用于通过 Frida 与应用进行交互,调用 rpc.js 中的加解密方法,实现对应用数据的加密和解密处理。
com.app.utils.postServer
反编译dex文件定位com.app.utils类的方法:postServer方法发起HTTP POST请求 当请求体str2非空且请求地址str不以AppConstant.HOST开头时 对数据加密并转为十六进制 否则使用明文 实际Hook 输出明文可能因为str满足明文逻辑或加密方法未执行
编写HOOK.js脚本如下
Java.perform(function () {
varEncrypDecrypUtils = Java.use('com.util.EncrypDecrypUtils');
EncrypDecrypUtils.encrypt.overload('java.lang.String').implementation = function (str) {
console.log('明文数据: ' + str);
var result = this.encrypt(str);
if (result != null) {
var resultByteArray = result;
var hexString = byteArrayToHex(resultByteArray);
console.log('加密后的数据 (HEX, 小写): ' + hexString);
} else {
console.log('加密结果为 null');
}
return result;
}
functionbyteArrayToHex(byteArray) {
var hexString = '';
for (var i = 0; i < byteArray.length; i++) {
var hex = (byteArray[i] & 0xFF).toString(16);
if (hex.length === 1) {
hex = '0' + hex;
}
hexString += hex;
}
return hexString.toLowerCase();
}
});
Java.perform(function () {
varEncrypDecrypUtils = Java.use('com.util.EncrypDecrypUtils');
EncrypDecrypUtils.decrypt.overload('java.lang.String').implementation = function (str) {
console.log('密文数据: ' + str);
var result = this.decrypt(str);
if (result != null) {
var resultByteArray = Java.array('byte', result);
var resultUtf8String = Java.use('java.lang.String').$new(resultByteArray);
console.log("解密后的明文数据: " + resultUtf8String);
} else {
console.log("解密结果为空");
}
return result;
};
});
frida -U-f xxxx -l hook.js
# 调用加密函数并打印结果
res = script.exports_sync.encrypt('{"jgRnId":"190e315b","mobile":"13666666666","mobileCheckCode":"1111","preRegisterDataCode":"","sm_fingerprintId":"BS7cjKGn05SfJinFYjV6yiypRToB0pRcTsqqlADTCkxgvajdJ0LcC9A98ke1CROkxllub1Nmt6tzJ0cYY3+jRZQ=="}')
print(res)
# 调用解密函数并打印结果
res = script.exports_sync.decrypt('14b31ec575f1b35cba59948ee16052cde96cc400eb53c84f75e7174cee1958d19930')
print(res)
# -*- coding: UTF-8 -*-
import frida
import json
import re
import time
classBurpy:
def__init__(self):
self.apicode = ""
self.key = ""
self.package = "xxxxx"
self.json = 'C:\Users\小白\Desktop\APPrpc\fy\rpc.js'
self.device = frida.get_usb_device()
self.process = self.device.attach(self.package)
def load_rpc(self):
with open(self.json, encoding='utf-8') as f:
script = self.process.create_script(f.read())
script.load()
return script.exports
def encrypt(self, header, body):
api = self.load_rpc()
try:
encrypted_data = api.encrypt(body)
body = encrypted_data
except Exception as e:
print(f"无法找到encrypt方法: {str(e)}")
body = body
return header, body
def decrypt(self, header, body):
api = self.load_rpc()
try:
decrypted_data = api.decrypt(body)
body = decrypted_data
except Exception as e:
print(f"无法找到decrypt方法: {str(e)}")
body = body
return header, body
声明:
原文始发于微信公众号(小白安全记录):自定义加解密算法让Burp支持APP RPC加解密报文重放
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论