嘟嘟牛在线登陆加密分析-RPC调用

打印 上一主题 下一主题

主题 656|帖子 656|积分 1968


加密参数
JADX反编译后搜索代码
user/login

基本可以确定就是从这里发起网络哀求
跟进
addRequestMap
方法分析

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


有KEY和IV,不是AES就是DES加密
encrypt64




DES加密后在Base64加密
那么data就是明文了,hook这个方法取到参数
  1. let RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
  2.         RequestUtil["encodeDesMap"].overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function (data, desKey, desIV) {
  3.             console.log("**********获取DES明文**********");
  4.             console.log(`参数明文----> ${data}, desKey= ${desKey}, desIV= ${desIV}`);
  5.             let result = this["encodeDesMap"](data, desKey, desIV);
  6.             console.log(`参数加密结果----> ${result}`);
  7.             return result;
  8.         };
复制代码


与抓包结果一样,这样明文就拿到了。
sign分析,回到刚刚那个传递sign参数的那个函数


字符串末了拼接了一个key后在进行md5加密,
hook一下md5这个函数


很明显,拼接除了sign参数其余全部在添加一个key=sdlkjsdljf0j2fsjk 的终极字符串在进行md5加密。
这样sign与参数加密都分析完了。
RPC
  1. from fastapi import FastAPI, Query
  2. from fastapi.responses import JSONResponse
  3. import frida
  4. import uvicorn
  5. # 创建FastAPI实例
  6. app = FastAPI()
  7. # 定义固定的 key 和 iv
  8. FIXED_KEY = "65102933"
  9. FIXED_IV = "32028092"
  10. # 定义一个GET请求的路由:/decrpyt
  11. @app.get("/decrypt")
  12. def decrypt(encryptedData: str = Query(..., description="The encrypted data to be decrypted")):
  13.     # 处理掉加密数据中的空格和换行符,不然解密函数无法正常解密
  14.     encryptedData = encryptedData.replace(' ', '').replace('\\n', '')
  15.     # 定义处理frida消息的回调函数
  16.     def on_message(message, data):
  17.         if message['type'] == 'send':
  18.             print('[* message]', message['payload'])
  19.         elif message['type'] == 'error':
  20.             print('[!] error:', message['stack'])
  21.     jsCode = """
  22.     rpc.exports = {
  23.         getDecryptInfo: function(encryptedData, key, iv) {
  24.             var result = '';
  25.             Java.perform(function(){
  26.                 var RequestUtil = Java.use("com.dodonew.online.http.RequestUtil");
  27.                 var instance = RequestUtil.$new();
  28.         
  29.                 try {
  30.                     console.log("encryptedData: " + encryptedData);
  31.                     var decodedResult = instance.decodeDesJson(encryptedData, key, iv);
  32.                 try {
  33.                     result = JSON.parse(decodedResult);
  34.                 } catch (e) {
  35.                     console.log("Result is not valid JSON:", decodedResult);
  36.                     result = decodedResult;
  37.                 }
  38.             } catch (e) {
  39.                 console.log("调用 decodeDesJson 失败: " + e);
  40.             }
  41.             });
  42.             return result;
  43.         }
  44.     };
  45.     """
  46.     process = frida.get_usb_device().attach('嘟嘟牛在线')
  47.     script = process.create_script(jsCode)
  48.     script.on('message', on_message)
  49.     script.load()
  50.     # 调用 Frida 的 RPC 方法,将 API 请求者传递的 jsonData 和固定的 key, iv 发送到 Frida
  51.     getDecryptData = script.exports.get_decrypt_info(encryptedData, FIXED_KEY, FIXED_IV)
  52.     return JSONResponse({'result': getDecryptData})
  53. # 主入口,运行FastAPI应用
  54. if __name__ == "__main__":
  55.     uvicorn.run(app, host="127.0.0.1", port=50000)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表