嘟嘟牛在线登陆加密分析-RPC调用
声明
以下分析仅供学习交流,切勿以非法目的对该应用非法入侵.
分析
APP抓包后会发现请求体有一个加密的数据
JADX反编译后通过登陆的接口user/login搜索定位到关键函数
基本可以确定就是从这里发起网络请求
跟进**addRequestMap**方法分析
这一看逻辑就清晰了
先添加一个时间戳,在对sign进行加密后在调用encodeDesMap进行加密
最后put到请求中
先分析**encodeDesMap**
有KEY和IV,不是AES就是DES加密
encrypt64
DES加密后在Base64加密
那么data就是明文了,hook这个方法取到参数
let RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
RequestUtil["encodeDesMap"].overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (data, desKey, desIV) {
console.log("**********获取DES明文**********");
console.log(`参数明文----> ${data}, desKey= ${desKey}, desIV= ${desIV}`);
let result = this["encodeDesMap"](data, desKey, desIV);
console.log(`参数加密结果----> ${result}`);
return result;
};
与抓包结果一样,这样明文就拿到了。
sign分析,回到刚刚那个传递sign参数的那个函数
字符串最后拼接了一个key后在进行md5加密,
hook一下md5这个函数
很明显,拼接除了sign参数其余全部在添加一个key=sdlkjsdljf0j2fsjk 的最终字符串在进行md5加密。
这样sign与参数加密都分析完了。
再使用java模拟加密过程,反写解密就OK了。
RPC调用
基于以上分析后可以写RPC进行远程调用快速对数据进行解密
from fastapi import FastAPI, Query
from fastapi.responses import JSONResponse
import frida
import uvicorn
app = FastAPI()
FIXED_KEY = "65102933"
FIXED_IV = "32028092"
# 定义一个GET请求的路由:/decrpyt
@app.get("/decrypt")
def decrypt(
encryptedData: str = Query(..., description="The encrypted data to be decrypted")
):
encryptedData = encryptedData.replace(" ", "").replace("\\n", "")
def on_message(message, data):
if message["type"] == "send":
print("[* message]", message["payload"])
elif message["type"] == "error":
print("[!] error:", message["stack"])
jsCode = """
rpc.exports = {
getDecryptInfo: function(encryptedData, key, iv) {
var result = '';
Java.perform(function(){
var RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
var instance = RequestUtil.$new();
try {
console.log("encryptedData: " + encryptedData);
var decodedResult = instance.decodeDesJson(encryptedData, key, iv);
try {
result = JSON.parse(decodedResult);
} catch (e) {
console.log("Result is not valid JSON:", decodedResult);
result = decodedResult;
}
} catch (e) {
console.log("调用 decodeDesJson 失败: " + e);
}
});
return result;
}
};
"""
process = frida.get_usb_device().attach("嘟嘟牛在线")
script = process.create_script(jsCode)
script.on("message", on_message)
script.load()
getDecryptData = script.exports.get_decrypt_info(encryptedData, FIXED_KEY, FIXED_IV)
return JSONResponse({"result": getDecryptData})
# 主入口,运行FastAPI应用
if __name__ == "__main__":
uvicorn.run(app, host="127.0.0.1", port=50000)
License:
CC BY 4.0