首页
社区
课程
招聘
[原创]嘟嘟牛在线分析-RPC调用
发表于: 2024-9-24 17:19 1993

[原创]嘟嘟牛在线分析-RPC调用

2024-9-24 17:19
1993

仅供学习交流

分析

图片描述
加密参数
JADX反编译后搜索代码
`user/login
图片描述

基本可以确定就是从这里发起网络请求
跟进addRequestMap方法分析
图片描述

这一看逻辑就清晰了
先添加一个时间戳,在对sign进行加密后在调用encodeDesMap进行加密
最后put到请求中
先分析encodeDesMap
图片描述

有KEY和IV,不是AES就是DES加密
encrypt64
图片描述

图片描述

DES加密后在Base64加密
那么data就是明文了,hook这个方法取到参数

1
2
3
4
5
6
7
8
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

在分析加密数据的时候,看到这个APP还提供了解密的函数,这样就直接RPC调用该函数直接进行解密就好了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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)

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 2
支持
分享
最新回复 (2)
雪    币: 27
活跃值: (1638)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
小肩膀的教学
2024-9-26 00:03
0
雪    币: 836
活跃值: (630)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
bluegatar 小肩膀的教学
是吗?小肩膀的课我还开始没看
2024-10-2 20:25
0
游客
登录 | 注册 方可回帖
返回
//