安卓逆向 - 某严选app sign算法还原
本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!
目标app: 5ouN5ouN5Lil6YCJMy45LjY=
目标接口:aHR0cHM6Ly9hcGkubS5qZC5jb20vYXBp
一、引言
1、本篇分析某二手交易平台 pp严选关键词搜索涉及的加密 sign,body
二、抓包分析
1、安装app至模拟器上,开启Fiddler,按下图配置代理
2、成功抓到包,发现请求body中sign,body字段存在加密字符串。
三、sign参数
1、使用Jadx反编译apk,全局搜索sign。我们会发现出来太多行代码,不太好分析。推荐一个搜索小技巧,改为搜索 put("sign" ,"sign" 等字段,刷选有用信息。
调整搜索后,出来几条关键信息:
我们跟进去,定位到关键代码:
hashMap2.put("sign", xu2.b(hashMap2, "6ab527a5d7f643728bac669543b92727"));
hook验证:
function hook() {var xu2 = Java.use("com.jd.paipai.ppershou.xu2");xu2["b"].implementation = function (hashMap, str) {// console.log(`xu2.b is called: hashMap=${hashMap}, str=${str}`);console.log("hashMap: " + hashMap)var result = this["b"](hashMap, str);console.log("result: " + result);return result;};
}
hook到结果,发现和我们抓包中的sign一模一样。说明成功找到生成位置!
hashMap: {loginType=4, networkType=wifi, screen=720x1280, functionId=pp.own.channel.biz.inspect.search.list, uuid=1682eadfa03390e9, appid=ppershou, body={"query":{"latitude":"y5Oa2ZqV2qDqdXdnpqHFSA==","recheck":1,"pageNo":1,"longitude":"rvV+ggPmeJQ53yaoJh+lyQ==","key":"iPhone13","pageSize":16}}, ext={"privacyAgreed":1,"referer":"paipai\/android\/3.9.6\/SearchIndexActivity"}, t=1692082902668, build=309060, client=paipai_android, clientVersion=309060, osVersion=Android 7.1.2, partner=ppershou, channel=QIHOO}
result: 05f61ee02e05db33f4a2a6358f07a7a8668cc7992256548d23153199e1b5c83e
2、sign算法还原,观察生成代码,非常明显的HmacSHA256加密特征,遍历Map, 填充&字符后拼装在一起,做HmacSHA256加密,key是 6ab527a5d7f643728bac669543b92727。
我们将代码抠出来执行,缺啥补啥。
/*** HmacSHA256加密* @param hashMap 请求体中的值* @param str 秘钥* @return 加密后的字符串*/public static String b(HashMap<String, String> hashMap, String str) {if (hashMap.isEmpty() || TextUtils.isEmpty(str)) {return null;}TreeSet<String> treeSet = new TreeSet<>(hashMap.keySet());StringBuilder stringBuffer = new StringBuilder();for (Object o : treeSet) {String str3 = hashMap.get(o.toString());if (!TextUtils.isEmpty(str3)) {stringBuffer.append(str3);stringBuffer.append(FIELD_DELIMITER);}}String stringBuffer2 = stringBuffer.toString();if (stringBuffer2.endsWith(FIELD_DELIMITER) && stringBuffer2.length() > 1) {stringBuffer2 = stringBuffer2.substring(0, stringBuffer2.length() - 1);}byte[] bytes = stringBuffer2.getBytes();try {SecretKeySpec secretKeySpec = new SecretKeySpec(str.getBytes(), "HmacSHA256");Mac mac = Mac.getInstance("HmacSHA256");mac.init(secretKeySpec);return a(mac.doFinal(bytes));} catch (InvalidKeyException | NoSuchAlgorithmException e) {e.printStackTrace();return null;}}
直接执行,得到结果,还原成功!
四、body参数
1、body参数为如下这一串,经过我调试验证 hdid是写死的。
body={"hdid":"JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=","ts":1692081460878,"ridx":-1,"cipher":{"body":"oyTndWVyoIS6oyTiYXHfdRVuZIS6Sxu1J2OyWxPWCxPOcWHYZQ5mcUrQU0O9FISiSxTvY2rvY2isEtOiSxLrZ2VEbyS6CImsbQ9kZ2v0dWHvStescxZWA2dxUQ1vIvO1C3vrb0feA2n5UJ09Ssmsa2V5StesaVLeb25vCJCsBMTmYWdvU2v6ZIS6CJZ9pG=="},"ciphertype":5,"version":"1.2.0","appname":"com.jd.paipai.ppershou"}
2、回到sign的位置,上面一行是body的赋值。我们可以根据这个打出堆栈往上分析。
hashMap2.put("body", new JSONObject(map).toString());
或者直接搜索JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw= 这个固定值,很快能定位到关键位置。
往上找到算法是个native方法,时间紧张,我们直接hook上层方法:
function hook9() {var dc2 = Java.use("com.jd.paipai.ppershou.dc2");dc2["a"].implementation = function (map) {var jsonObj = Java.use('org.json.JSONObject').$new(map);console.log("map : " + jsonObj.toString())var result = this["a"](map);console.log("result: " + result);return result;};
}
返回结果就是我们想要的!!!
入参:{"body":"{\"query\":{\"latitude\":\"cwLVo6aFXtB6JuOJauet+Q==\",\"recheck\":1,\"pageNo\":1,\"longitude\":\"Ex5uLAbq5hktzPkRkng\\\/vw==\",\"key\":\"小米\",\"pageSize\":16}}"}result:{"hdid":"JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=","ts":1691647002731,"ridx":-1,"cipher"
搭建RPC主动调用。收工收工!
相关文章:

安卓逆向 - 某严选app sign算法还原
本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除! 目标app: 5ouN5ouN5Lil6YCJMy45LjY 目标接口:aHR0cHM6Ly9hcGkubS5qZC5jb20vYXBp 一、引言 1、本篇分析某二手交易平台 …...

arcgis数据采集与拓扑检查
1、已准备好一张配准好的浙江省行政区划图,如下: 2、现在需要绘制湖州市县级行政区划。需要右击文件夹新建文件地理数据库,如下: 其余步骤均默认即可。 创建好县级要素数据集后,再新建要素类,命名为县。 为…...
【前端 | CSS】滚动到底部加载,滚动监听、懒加载
背景 在日常开发过程中,我们会遇到图片懒加载的功能,基本原理是,滚动条滚动到底部后再次获取数据进行渲染。 那怎么判断滚动条是否滚动到底部呢?滚动条滚动到底部触发时间的时机和方法又该怎样定义? 针对以上问题我…...
word将mathtype公式批量转为latex公式
最近,由于工作学习需要,要将word里面的mathype公式转为latex公式。 查了查资料,有alt\的操作,这样太慢了。通过下面链接的操作,结合起来可以解决问题。 某乎:https://www.zhihu.com/question/532353646 csd…...

docker-compose部署nacos 2.2.3
1、编写docker-compose.yml文件 version: "3.1" services:nacos:restart: alwaysimage: nacos/nacos-server:v2.2.3container_name: nacosenvironment:- NACOS_AUTH_ENABLEtrue- MODEstandalone- NACOS_AUTH_TOKEN8b92c609089f74db3c5ee04bd7d4d89e8b92c609089f74db…...

软件测试52讲-学习笔记
测试基础知识篇(11讲) 01 你真的懂测试吗?从“用户登录”测试谈起 测试用例设计框架 基于功能性需求和非功能性需求思考: 功能性需求使用等价类划分、边界值分析、错误推断法设计用例 非功能性需求考虑安全(信息的保存…...
【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】
文章目录 __read_mostly 介绍__read_mostly 在 linux 中的使用.data.read_mostly 介绍 __read_mostly 介绍 __read_mostly 是一个在Linux内核编程中用到的宏定义,这是一个gcc编译器的属性,用于告诉编译器此变量主要用于读取,很少进行写入&am…...

Maven在IDEA2021版本中全局配置(一次配置处处生效)
前言 我们在开发中,Maven是必不可少的,但是每次都需要设置一遍Maven的仓库和settings.xml。真的是心累,今天教大家全局配置一下。再也不要每次项目都配了,Maven还经常出问题。 解决方案 友情提示:小编的IDEA版本为2…...

名侦探番外——Arduino“炸弹”引爆摩天大楼
名侦探番外——Arduino“炸弹”引爆摩天大楼 硬件准备1.材料准备2.模块介绍 电路设计1.硬件接线 程序设计1.设计思路2.部分程序3.功能优化 总结 好久不见,童鞋们!小编突然想到很久以前看的柯南剧场版——计时引爆摩天大楼的情景,对剧里的“炸…...

自适应AI chatgpt智能聊天创作官网html源码
我们致力于开发先进的自适应AI智能聊天技术,旨在为用户提供前所未有的聊天体验。通过融合自然语言处理、机器学习和深度学习等领域的顶尖技术,我们的智能聊天系统能够准确理解用户的需求并给出相应的回应。 我们的自适应AI智能聊天系统具备以下核心特点…...
防抖,节流
概念 防抖(debounce):类似法师技能读条,读条没完再按技能就会重新读条,在触发后的n秒内只会执行一次,若在这n秒内重复触发则重新计算 节流(throttle):连续发生的事件在n秒内只执行一次函数 参考 【前端面试必问】—…...

【Linux】多线程1——线程概念与线程控制
文章目录 1. 线程概念什么是线程Linux中的线程线程的优点线程的缺点线程的独立资源和共享资源 2. 线程控制Linux的pthread库用户级线程 📝 个人主页 :超人不会飞)📑 本文收录专栏:《Linux》💭 如果本文对您有帮助&…...

【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包
SpringBoot项目使用maven-assembly-plugin插件多环境打包 1.创建SpringBoot项目并在pom.xml文件中添加maven-assembly-plugin配置 <!-- 多环境配置 --><profiles><!-- 开发环境 --><profile><id>dev</id><properties><prof…...
指令集_基础
指令集-基础 一、提示过程1,文章摘要2,数学问题求解 二、角色提示三、多范例提示 一、提示过程 指导人工智能,执行任务的过程,称为提示过程。向AI 提供一组指令(提示),然后它执行任务 1,文章摘要 例如&a…...
学习Vue:数据绑定的基本概念
在 Vue.js 中,Vue 实例是您构建应用程序的核心。它允许您将数据和界面连接起来,实现动态的数据绑定,使您的应用程序能够根据数据的变化自动更新界面。让我们来深入了解 Vue 实例与数据绑定的基本概念。 Vue 实例与数据绑定 什么是 Vue 实例&…...
Python 装饰器 - 推导式(列表推导式) - 迭代器 - 生成器 - 闭包
目录 推导式 1、列表推导式(用得最多的) 给你一个列表,求所有数据的绝对值 列表推导式跟if运算 打印50以内能被3整除的数的平方(filter)(if的使用) 找到1000以内开平方的结果是整数的数&am…...

【大数据】Flink 详解(二):核心篇 Ⅲ
Flink 详解(二):核心篇 Ⅲ 29、Flink 通过什么实现可靠的容错机制? Flink 使用 轻量级分布式快照,设计检查点(checkpoint)实现可靠容错。 30、什么是 Checkpoin 检查点? Checkpoint …...

Jmeter性能测试系列-性能测试需求分析
性能测试需求分析 性能测试需求分析与传统的功能测试需求有所不同,功能测试需求分析重点在于从用户层面分析被测对象的功能性、易用性等质量特性,性能测试则需要从终端用户应用、系统架构设计、硬件配置等多个纬度分析系统可能存在性能瓶颈的业务。 性…...

Syncfusion Essential Studio JavaScrip Crack
Syncfusion Essential Studio JavaScrip Crack 数据透视表 添加了在将数据透视表导出到PDF文档时自定义列宽的支持。 签名 添加了对在特定位置绘制文本的支持。 Syncfusion Essential Studio for JavaScript在一个包中包含80多个高性能、轻量级、模块化和响应式UI组件。包括Jav…...

8.13黄金是否进入下行通道?下周开盘如何布局
近期有哪些消息面影响黄金走势?黄金多空该如何研判? 黄金消息面解析:周五(8月11日)现货黄金小幅收低,受累于美元走强和美国国债收益率上升,本周录得6月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...