安卓逆向 - 某严选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月底以来最差单周表现。投资者在评估最新一批通胀报告和消费者信…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
