安卓逆向 - 某严选app sign算法还原

news2024/11/25 14:46:15

本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!

目标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主动调用。收工收工!

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

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

相关文章

常见的功耗曲线预处理方法

滤波 电子设备的功耗信息可以由电路运行时的电压、电流和电路的阻抗联合计算得到&#xff0c;而且纯电阻运行期间的功耗会转换为热能。在研究中&#xff0c;一个器件的功耗与整个加密设备的功耗成正相关&#xff1b;若该期间的功耗增加&#xff0c;则整个加密设备的功耗也成一定…

具身智能:融合感知、思考与行动的未来之路

在当今科技飞速发展的时代&#xff0c;具身智能&#xff08;Embodied Intelligence&#xff09;作为一种新兴的概念&#xff0c;引起了广泛的关注和研究。具身智能将感知、思考和行动紧密结合起来&#xff0c;为机器人和智能系统带来了前所未有的能力和潜力。本文将介绍具身智能…

python基础05 循环 变量 函数组合案例

目录 1. 前言: 2. 案例详情: -> 2.1 案例拆解 ---> 2.1.1 主页功能: ---> 2.1.2 查余额: ---> 2.1.3 存钱 ---> 2.1.4 取钱 ---> 2.1.5 返回首页重试[可有可无] ---> 2.1.6 退出 3. 实现代码(python版) 4. 运行结果: -> 4.1 文字式 想写…

okcc对接ASR平台,okcc客户投诉的安全问题

客户投诉: 客户为什么要投诉&#xff1f;实际上分为两种情况&#xff0c;一是客户被冒犯到不能容忍导致的投诉&#xff0c;二是恶意投诉。降低客户被冒犯投诉的概率&#xff0c;无非就是选择客户、规范用语、降低频度&#xff1b;减少恶意投诉&#xff0c;回避是实践证明最有效…

飞行动力学-第16节-part1-机动飞行中的稳定性 之 基础点摘要

飞行动力学-第16节-part1-机动飞行中的稳定性 之 基础点摘要 1. 机动2. 重心位置3. 翼载荷4. 参考资料 1. 机动 法向过载( n L W n\frac{L}{W} nWL​)超过1的飞行轨迹。 铅垂面的拉升机动水平面内的协调转弯 根据叠加原理&#xff0c;分解为&#xff1a; 定常拉升 平飞 …

数字孪生,HDR如何提取

现在有很多的地方使用全景图&#xff0c;这些全景图是动态展示的720图片&#xff0c;无法通过浏览器点击下载到本地。 今天给你们安利一款好用的、免费的、可下载720全景图的网站。 步骤一 打开这个网址https://krpano.scenegram.cn/&#xff08;全景管家&#xff09;&#xf…

十一、避开客户端控件——收集用户数据

文章目录 一、HTML表单1.1 长度限制1.2 基于脚本的确认1.3 禁用的元素 二、浏览器拓展2.1 常见的浏览器拓展技术2.2 攻击浏览器扩展的方法 一、HTML表单 应用程序使用客户端控件限制客户端提交的数据的另一个主要控制对象&#xff0c;是由客户端计算机自己收集的数据。 HTML表单…

win11如何去掉桌面快捷方式的小箭头(原创)

begin 打开注册表,Windows搜索框里搜 注册表编辑器(register editor),打开.. 找到 接着跟进.. 新建一个项名, Shell Icons 继续.... 值设为29 双击开页面 输入数据 %windir%\System32\shell32.dll,-51 到此,保存,到桌面,小箭头还是没有消失 ctrl shift esc 打开 任务管理…

Java课题笔记~ SpringMVC注解式开发

2.1 Controller 传统的配置式开发中的控制器Controller类必须实现Controller接口&#xff0c;并实现接口中的HandleRequest()方法&#xff0c;还需要再配置文件中配置处理器映射&#xff0c;且一个处理器&#xff08;控制器&#xff09;只能有一个方法&#xff0c;为了实现程序…

创建预留成本中心与指定工厂不一致

创建预留成本中心与指定工厂不一致 这种情况SAP会警告提示&#xff0c;可以强制通过。 如果公司不允许跨公司领料&#xff0c;可以将消息号 M7517的类型从W改为为E tcode&#xff1a;OMCQ SPRO->物料管理->库存管理和实际库存->定义系统消息的属性->系统信息设置

如何快速便捷收集市场信息?电商API来帮你

电商API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是为了促进不同电商平台之间数据共享和交互而设计的一种技术。通过使用电商API&#xff0c;可以快速便捷地收集市场信息&#xff0c;提升电商运营效率&#xff0c;增加竞争力。 …

根据指定日期获取周,月,季度,年的第一天和最后一天

1. 根据指定日期获取周&#xff0c;月&#xff0c;季度&#xff0c;年的第一天和最后一天 import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 根据给定时间获取周、月度、季度、年度开始结束时间*…

OSPF在广播类型的网络拓扑中DR和BDR的选举

指定路由器&#xff08;DR&#xff09;&#xff1a; 一个网段上的其他路由器都和指定路由器&#xff08;DR&#xff09;构成邻接关系&#xff0c;而不是它们互相之间构成邻接关系。 备份指定路由器&#xff08;BDR&#xff09;&#xff1a; 当DR出现问题&#xff0c;由BDR接…

数字化转型能带来哪些价值?

数字化转型可以为个人、企业和整个社会带来广泛的价值。以下是数字化转型的一些主要优势&#xff1a; 1.提高效率和生产力&#xff1a;重复任务的自动化和简化流程可以提高效率和生产力。这使员工能够专注于更具战略性和增值性的活动。 2.增强的客户体验&#xff1a;数字化转…

荣耀X40 GT真机调试APP,HBuilder X刷新不到设备

今天使用荣耀X40GT进行真机调试App的时候&#xff0c;hbuilder怎么都刷不出来设备&#xff0c;经历一番风雨最终连接成功&#xff0c;特此记录一下。 我的设备Android版本12&#xff0c;MagicOS版本7.0&#xff0c;进行了如下配置&#xff1a; 1、打开“设置”-》“系统和更新”…

视频批量处理利器,轻松实现高效倒放功能

亲爱的视频编辑者们&#xff0c;您是否曾遇到需要将大量视频进行倒放处理的情况&#xff1f;但是手动一个个倒放操作繁琐又耗时&#xff0c;让您感到头疼&#xff1f;现在&#xff0c;我们为您推出一款全新的视频批量处理利器&#xff0c;让您的倒放操作变得轻松高效 第一步。…

深入源码分析kubernetes informer机制(四)DeltaFIFO

[阅读指南] 这是该系列第四篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 client-go中的存储结构DeltaFIFOdelta索引 keyqueue push操作delta push 去重 queue pop操作 总结 client-go中的存储结构…

雷军的代码,成为金山火苗,WPS的逆风翻盘,却要靠工具

苦练内功 “雷军写代码”冲上热搜。 作为中国科技界的大佬&#xff0c;一直享有“雷布斯”的称谓。 早年的成长经历也激励着一批批年轻人&#xff0c;挥洒青春&#xff0c;艰苦奋斗。 雷军在今年的演讲上一张海报&#xff0c;让很多再次看到了雷军早年写的“代码”&#xf…

CRMEB商城系统:便捷、安全、多样化的购物方式

商城系统是当今社会商业发展的重要组成部分&#xff0c;它以数字化、网络化的方式提供商品和服务。商城系统通过互联网技术&#xff0c;将商品和消费者紧密连接&#xff0c;方便了购物的流程和效率。 商城系统的特点之一是无国界化。传统实体商店通常受限于地理位置和时间&…

4.文件操作和IO

文章目录 1.认识文件1.1树型结构组织 和 目录1.2文件路径&#xff08;Path&#xff09;1.3其他知识 2.Java 中操作文件2.1File 概述2.1.1属性2.1.2构造方法2.1.3方法 2.2代码示例2.2.1示例1-get 系列的特点和差异2.2.2示例2-普通文件的创建、删除2.2.3示例3-普通文件的删除2.2.…