加密参数

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与参数加密都分析完了。

RPC

from fastapi import FastAPI, Query
from fastapi.responses import JSONResponse
import frida
import uvicorn # 创建FastAPI实例
app = FastAPI() # 定义固定的 key 和 iv
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', '') # 定义处理frida消息的回调函数
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() # 调用 Frida 的 RPC 方法,将 API 请求者传递的 jsonData 和固定的 key, iv 发送到 Frida
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)

嘟嘟牛在线登陆加密分析-RPC调用的更多相关文章

  1. 37.前台js登陆加密分析

    开篇 由于现在的登陆接口如果明文传输的话,容易被暴力破解,越来越多的网站选择了前台js加密的方式,像这样: 或者这样: 枯了,对渗透造成一定的影响 本篇文章将系统的讲述使用Python对前台js加密爆 ...

  2. RPC调用框架比较分析--转载

    原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90 什么是RPC: RPC(Remote Pr ...

  3. Openstack Nova 源码分析 — RPC 远程调用过程

    目录 目录 Nova Project Services Project 的程序入口 setuppy Nova中RPC远程过程调用 nova-compute RPC API的实现 novacompute ...

  4. Dubbo 源码分析 - 服务调用过程

    注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...

  5. RPC调用与GC垃圾回收

    RPC调用 多个服务协同完成一次业务时,由于业务约束(如红包不符合使用条件.账户余额不足等).系统故障(如网络或系统超时或中断.数据库约束不满足等),都可能造成服务处理过程在任何一步无法继续,使数据处 ...

  6. pomelo RPC调用时新增字段缺失

    接触pomelo开发一个月,正式开始参与项目开发有10天,遇到很多细节的坑,今天讲讲标题:后端服务器节点之间的rpc调用过程中,返回的数据中新增字段缺失问题. 先讲结果:原因是该rpc调用已经采用了p ...

  7. alluxio源码解析-rpc调用概述(1)

    alluxio中几种角色以及角色之间的rpc调用: 作为分布式架构的文件缓存系统,rpc调用必不可少 client作为客户端 master提供thrift rpc的服务,管理以下信息: block信息 ...

  8. Dubbo系列(三)dubbo的核心技术--RPC调用

    dubbo的核心技术--RPC调用:分为俩部分RPC协议Protocol和方法调用Invoke: 一.RPC协议Protocol(Remote Procedure Call)远程过程调用协议 1.我们 ...

  9. Solon rpc 之 SocketD 协议 - RPC调用模式

    Solon rpc 之 SocketD 协议系列 Solon rpc 之 SocketD 协议 - 概述 Solon rpc 之 SocketD 协议 - 消息上报模式 Solon rpc 之 Soc ...

  10. 闲话RPC调用

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com 自SOA架构理念提出以来,应用程序间如何以最低耦合度通信的问题便呈现在所有架构师面前. 互联网系统的复杂度让我们不 ...

随机推荐

  1. LVM综合实验

    实验目标 创建并管理一个 LVM 卷组 (VG). 在卷组中创建.扩展和缩小逻辑卷 (LV). 创建和使用快照. 实验环境 Linux 服务器 三个可用的磁盘分区: /dev/sdb1, /dev/s ...

  2. Jmeter循环控制器

    循环控制器(Loop Controller),循环控制器会将该控制器里面所有请求循环运行指定次数 循环次数:勾选"永远"则程序会一直循环运行不会停止,不勾选"永远&quo ...

  3. 【H5】13 表单 其二 如何构造

    有了基础知识,我们现在更详细地了解了用于为表单的不同部分提供结构和意义的元素. 前提条件: 基本的计算机能力, 和基本的 对HTML的理解. 目标: 要理解如何构造HTML表单并赋予它们语义,以便它们 ...

  4. 【Java】爬资源案例

    也不知道为什么喜欢叫爬虫 搞明白原理之后原来就是解析网页代码获取关键字符串 现在的网页有很多解析出来就是JS了,根本不暴露资源地址 依赖一个JSOUP,其他靠百度CV实现 <!-- https: ...

  5. 实用英语:英文中经常出现“ i.e.、e.g.、etc."缩写究竟啥意思?

    地址: https://mp.weixin.qq.com/s?__biz=MzIyMzU5NDE1Mw==&mid=2247487840&idx=1&sn=013992683c ...

  6. 工业AI制造:铝合金冲压、压铸工艺流程 —— 模具参数调整,以满足所需的规格和质量要求

    压铸操作工艺流程作步骤: 模具安装 → 调试 →清理预热模具 → 喷刷涂料 → 合模 → 涂料准备 → 涂料配制 → 压铸 → 冷却与凝固 → 开模 → 顶出铸件 → 质量检验 → 成品 → 废品 → ...

  7. pytorch报错----------- ***ValueError: some of the strides of a given numpy array are negative.

    最近遇到的一个pytorch报错: 然后报错了,这个几行代码就是从一个图片中读入数据,把bgr模式图片矩阵转换为rgb模式,这里采用的是改变矩阵索引,索引倒排     [..., ::-1]   . ...

  8. Unreal使用GooglePAD生成AAB包,并加在fast-follow资源

    1.修改obbfilter,设置需要添加到obb的pak文件 2.修改项目设置,打AAB包 3.cook stage生成所有Paks文件 4.将部分pak文件拷贝到Intermediate/Andro ...

  9. 如何切换git的HEAD分支

    git remote set-head origin some_branch  

  10. Linux库概念,动态库和静态库的制作,如何移植第三方库

    一.什么是库? 在windows平台和linux平台下都大量存在着库.一般是软件作者为了发布方便.替换方便或二次开发目的,而发布的一组可以单独与应用程序进行compile time或runtime链接 ...