【APP_汽修宝】数据采集案例APP_数据解密分析


如果不会写代码,那就出书、写博客、做视频、录播客。
                     📚 S35赛季末王者昭君罗


关键代码定位

  • 使用方法【逆向-快速定位关键代码】通过hook常用函数HashMap方法

动态分析

  • 下面是我们通过访问目标页面时 Frida hook 捕获HashMap的调用堆栈:
    在这里插入图片描述
a: username b: AI爱答题
java.lang.Throwableat java.util.HashMap.put(Native Method)at org.json.JSONObject.put(JSONObject.java:267)at org.json.JSONTokener.readObject(JSONTokener.java:384)at org.json.JSONTokener.nextValue(JSONTokener.java:100)at com.qp333.car.api.DecodeInterceptor.intercept(DecodeInterceptor.java:86)  ## 解码拦截器at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)at com.qp333.car.api.ParamsInterceptor.intercept(ParamsInterceptor.java:60)at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:109)...

分析该堆栈后,我们定位到了com.qp333.car.api.DecodeInterceptor.intercept目标代码如下:
在这里插入图片描述
其中通过hookaesDecryptString方法得知,通过此方法可以将http响应中的密文转化成明文
在这里插入图片描述

关键代码分析

这段代码展示了如何在 Java 中使用一些工具和方法来解密 JSON 数据,并将解密后的数据放回到 JSON 对象中。让我们逐步解析这段代码:

jSONObject.put("data", new JSONTokener(aesDecryptString(jSONObject.getString("data"),StringUtils.MD5(String.format(Locale.getDefault(), "%s%s", UserManager.get().sessionid, str)),String.format(Locale.getDefault(), "%s%s%s%s", str + "000", Character.valueOf(str.charAt(1)), Character.valueOf(str.charAt(3)), Character.valueOf(str.charAt(7))))
).nextValue());
获取原始加密数据:
jSONObject.getString("data")

这是从 jSONObject 中获取名为 data 的字段的值,该值是一个加密的字符串。

生成解密密钥:
StringUtils.MD5(String.format(Locale.getDefault(), "%s%s", UserManager.get().sessionid, str)
)

这里生成了一个解密密钥。具体步骤是:

使用String.format方法将 UserManager.get().sessionidstr 拼接成一个字符串,Locale.getDefault() 确保格式化时使用默认的区域设置。
将拼接后的字符串传递给 StringUtils.MD5 方法,计算其 MD5 哈希值。这个哈希值将作为解密的密钥。

生成初始向量(IV):
String.format(Locale.getDefault(), "%s%s%s%s", str + "000", Character.valueOf(str.charAt(1)), Character.valueOf(str.charAt(3)), Character.valueOf(str.charAt(7))
)

这里生成了解密过程中的初始向量(IV),具体步骤是:

使用 String.format 方法将 str 的第一个字符加上 “000”、str 的第 1、3、7 个字符拼接成一个字符串。
Locale.getDefault() 确保格式化时使用默认的区域设置。
解密数据:

aesDecryptString(jSONObject.getString("data"), StringUtils.MD5(String.format(Locale.getDefault(), "%s%s", UserManager.get().sessionid, str)), String.format(Locale.getDefault(), "%s%s%s%s", str + "000", Character.valueOf(str.charAt(1)), Character.valueOf(str.charAt(3)), Character.valueOf(str.charAt(7)))
)

调用aesDecryptString方法,使用从 jSONObject 获取的加密数据、生成的密钥和 IV 进行解密。aesDecryptString 方法返回解密后的字符串。

解析解密后的 JSON 数据:

new JSONTokener(aesDecryptString(...)).nextValue()

将解密后的字符串传递给 JSONTokener,并调用nextValue方法解析解密后的 JSON 数据。

将解密后的数据放回 JSON 对象中:

jSONObject.put("data", new JSONTokener(...).nextValue())

将解析后的 JSON 数据放回 jSONObject 中 data 字段。

整体流程

这段代码的目的是:

  1. 从 JSON 对象中获取加密的 data 字段。
  2. 生成解密密钥和初始向量(IV)。
  3. 使用这些密钥和 IV 通过 aesDecryptString 方法解密数据。
  4. 将解密后的 JSON 数据解析并放回到原来的 jSONObject 中。

代码重构

import base64
import hashlibfrom Crypto.Cipher import AESdef md5_string(s):return hashlib.md5(s.encode('utf-8')).hexdigest()def pad(data):block_size = AES.block_sizepad_len = block_size - (len(data) % block_size)return data + chr(pad_len) * pad_lendef unpad(data):pad_len = ord(data[-1])return data[:-pad_len]def aes_decrypt(data, key, iv):cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))decrypted = cipher.decrypt(base64.b64decode(data))return decrypted.decode('utf-8', 'ignore')def parse_result(data, session_id, time_str):# 生成动态MD5密钥md5_key = md5_string(f"{session_id}{time_str}")# 生成动态IViv_dynamic = f"{time_str}000{time_str[1]}{time_str[3]}{time_str[7]}"print(f"MD5 Key: {md5_key}")print(f"Dynamic IV: {iv_dynamic}")try:decrypted_data = aes_decrypt(data, md5_key, iv_dynamic)print(f"Decrypted data (raw): {decrypted_data}")return decrypted_dataexcept Exception as e:print(f"Error during decryption: {e}")return Nonedef main():session_id = '请求参数中获取'encrypted_message = "加密数据"timestamp = "1718554525"  # URL请求发起时间戳# 解密decrypted_data = parse_result(encrypted_message, session_id, timestamp)print("Decrypted Data:", decrypted_data)if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux下手动修改服务器时间(没网环境下)

在客户服务器上更新程序时,发现服务器时间不对,现在应该是下午13:44:00,但服务器却显示为:21:40:53,所有是不对的。 date解决办法: 1、由于服务器是没有网的,只能手动设置时间,输入…

idea-Spring框架与ioc容器

Sping是轻量级的开源J2EE框架,可以解决企业应用开发的复杂性 Spring有两个核心部分为Ioc和AOP Ioc:控制反转,吧创建对象过程交给Sping进行管理 AOP:面向切面,不修改代码进行功能增强 创建Maven项目 IDEA-2024 就直接创建java项目即可 创…

Android WebSocket长连接的实现

一、为什么需要 WebSocket 初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客…

SpringBoot引入外部依赖包

将需要引入的文件放置到与src同级别的目录下 如上&#xff0c;在src的同级&#xff0c;新建了一个lib目录&#xff0c;将jar包放置其中 在POM文件下&#xff0c;加入如下配置 <dependency><groupId>com.aliyun</groupId><artifactId>com.aliyun.filed…

搭建取图系统app源码开发,满足广泛应用需求

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 图片已成为信息传递的重要媒介&#xff0c;广泛应用于各个领域。为满足日益增长的图片需求&#xff0c;搭建一款高效的取图系统&#xff0c;可以为用户提供便捷、全面的…

windows服务器下jenkins c语言打包的一些经验share

前言 因为一些原因&#xff0c;需要从linux环境下的jenkins 打包c语言转移到使用windows环境下的jenkins打包c语言&#xff0c;从转移的过程中&#xff0c;发现了一些问题和解决方案&#xff0c;故在此和各位运维工程师分享一下。 一、windows 下的c语言编译环境配置 这边就…

中国最全的hive sql 函数集合(持续更新)

#6/20/24 增加greatest函数&#xff1a; select greatest(1,2,3,4,5,2) 结论&#xff1a;可以用hive presto spark得出正确的结果值 #6/20/24 增加last_value(cl1) ignore nulls over(order by ts ) as dt 函数&#xff1a; 有数据集&#xff1a; 1 1 1 2 2   3 3 …

模拟算法:代码世界的生活模拟器

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 模拟算法的总结 二. 模拟算法题目 2.1 替换所有的问号 2.2 提莫攻击 2.3 Z字形变换 2.4 外观数列 2.5 数青蛙 总结 前言 本篇详细介绍了模拟算法的使用&#xff0c;让…

自动化办公04 使用pyecharts制图

目录 一、柱状图 二、折线图 三、饼图 四、地图 1. 中国地图 2. 世界地图 3. 省会地图 五、词云 Pyecharts是一个用于数据可视化的Python库。它基于Echarts库&#xff0c;可以通过Python代码生成各种类型的图表&#xff0c;如折线图、柱状图、饼图、散点图等。 Pyecha…

【腾讯云智笔试题——分苹果时间复杂度和空间复杂度都是O(1)】

文章目录 题目描述解题思路&#xff1a;思路讲解&#xff1a; 题目描述 有m个苹果&#xff0c;n个小孩。每个小孩都有一个编号&#xff0c;小明的编号是。要尽量公平的分苹果&#xff0c;相邻编号的小孩分到的苹果数目差距不能大于1。 请问如何在满足相邻编号的小孩分到的苹果…

wsl2平台鸿蒙全仓docker编译环境快速创建方法

文章目录 1 文章适用范围&#xff1a;2 WSL环境安装3 镜像迁移非C盘4 Docker环境准备4.1 docker用户组和用户创建4.2 Docker环境配置4.2.1 Ubuntu下安装docker工具4.2.2 鸿蒙Docker环境安装4.2.3 鸿蒙全仓代码拉取编译 5 鸿蒙全仓代码的更新策略6 参考文献7 FAQ7.1 缺头文件xcr…

【0基础学爬虫】爬虫基础之自动化工具 Appium 的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…

CentOS 5(CentOS 6、Redhat 6)服务器配置VNC

一、配置服务器yum源 yum源&#xff08;本地、华为云、阿里云、网易&#xff09; 二、使用yum安装vnc服务 1、检查系统是否安装了vnc 和 vncserver&#xff0c; rpm -qa | grep vnc如果没有安装那就行自行下载安装&#xff08;我这里用yum安装了&#xff0c;vncserver安装需…

设计程序,实现高精度圆周率的计算和存储,使用线性表突破程序设计语言内置变量的数值和有效数字范围限制

一、使用线性表突破程序设计语言内置变量的数值和有效数字范围的限制&#xff0c;为了实现高精度圆周率的计算&#xff0c;先根据数学公式进行对PI高精度运算&#xff0c;如图1-1。根据这个数学公式 π2 0nn!2n1‼ 即 Rn1Rn*n2n1&#xff0c;R11&#xff0c;sum π2* n1∞Rn 来…

Redis学习|Redis基础知识、Redis五大数据类型、Redis三种特殊数据类型、Redis事务

Redis基础知识 redis默认有16个数据库&#xff0c;并且这个数量可以在conf配置文件中更改 默认使用的是第0个 可以使用 select 进行切换数据库! key *查看数据库所有的key 清除当前数据库 flushdb 清除全部数据库的内容FLUSHALL 为什么redis是6379!(了解一下即可!) Redis 是…

【算法】Graham 凸包扫描算法 ( 凸包概念 | 常用的凸包算法 | 角排序 | 叉积 | Python 代码示例 )

文章目录 一、Graham 凸包扫描算法1、凸包概念2、常用的凸包算法3、Graham 凸包扫描算法 二、Graham 算法前置知识点1、角排序2、叉积3、算法过程分析 三、代码示例1、完整代码示例2、执行结果 使用 Graham 算法绘制的凸包效果 : 博客代码下载 : https://download.csdn.net/d…

大模型之-Seq2Seq介绍

大模型之-Seq2Seq介绍 1. Seq2Seq 模型概述 Seq2Seq&#xff08;Sequence to Sequence&#xff09;模型是一种用于处理序列数据的深度学习模型&#xff0c;常用于机器翻译、文本摘要和对话系统等任务。它的核心思想是将一个输入序列转换成一个输出序列。 Seq2Seq模型由两个主…

企业微信,机器人定时提醒

场景&#xff1a; 每天定时发送文字&#xff0c;提醒群成员事情&#xff0c;可以用机器人代替 人工提醒。 1&#xff09;在企业微信&#xff0c;创建机器人 2&#xff09;在腾讯轻联&#xff0c;创建流程&#xff0c;选择定时任务&#xff0c;执行操作&#xff08;企业微信机…

未登录也能知道你是谁?浏览器指纹了解一下!

引言 大多数人都遇到过这种场景&#xff0c;我在某个网站上浏览过的信息&#xff0c;但我并未登录&#xff0c;可是到了另一个网站发现被推送了类似的广告&#xff0c;这是为什么呢&#xff1f; 本文将介绍一种浏览器指纹的概念&#xff0c;以及如何利用它来判断浏览者身份。…

FIddler+Proxifer 实现PC客户端抓包详细教程

文章目录 前言1、Proxifer下载和配置1.1、下载Proxifer1.2、Proxifier配置 2、FIddler下载和配置2.1、FIddler下载2.2、FIddler配置 3、三、为什么抓不到有些应用程序的HTTP(s)的包&#xff1f; 前言 一般在浏览器场景下&#xff0c;我们可以利用Fiddler很好的完成抓包&#x…