2023年最新电商某东app端sign签名算法与cipher加解密逆向分析(2023-09-26)

news2024/12/23 11:03:29

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


一.工具的选择(抓包工具的选择,是门学问)


用到工具如下:


1、安卓手机一台,系统版本:android 6.01;型号:小米 MI 4LTE


    之所以要选择android 6 手机,原理如下:
     Android 系统将 CA 证书又分为两种:用户 CA 证书和系统 CA 证书。
    系统 CA 证书存放在 /etc/security/cacerts/ 目录下,名称是 CA 证书 subjectDN 的 Md5 值前四位移位取或,后缀名是 .0,比如 00673b5b.0。考虑到安全原因,系统 CA 证书需要有 Root 权限才能进行添加和删除。
    对于非 Root 的 Android 设备,用户只能安装用户 CA 证书。
    无论是系统 CA 证书还是用户 CA 证书,都可以在设置 → 系统安全 → 加密与凭据 → 信任的凭据中查看:


                                (图1CA证书的位置 用户凭据)
    Android 从 7.0 开始,系统不再信任用户 CA 证书(应用 targetSdkVersion >= 24 时生效,如果 targetSdkVersion <24 即使系统是 7.0 + 依然会信任)。也就是说即使安装了用户 CA 证书,在 Android 7.0 + 的机器上,targetSdkVersion>= 24 的应用的 HTTPS 包就抓不到了。

2、charles的安装与使用


    (1)下载地址:

https://www.charlesproxy.com/download/latest-release/

                             

(图2 charles下载位置)


    按照默认next即可,然后选择路径。


    (2)Charles破解


    破解地址:
    https://www.zzzmode.com/mytools/charles/

   

                             (图3 charles 在线破解)

(3)使用Charles


    在Charles的菜单栏上选择”Proxy”->“Proxy Settings”,填入代理端口8888并且勾上”Enable transparent HTTP proxying”,这样就完成了在Charles上的设置
    在”Help”->”Local IP Address”中可以查看本机的ip地址,当然也可以在cmd中通过ipconfig查看。

                             

                                             (图3 charles 配置与使用)

                                           (图3 charles 配置与使用2)

    设置保存完成后,charles界面会弹出一个连接请求框,点击“Allow”。

                             (3.charles抓包配置1)

                                                              (3.charles抓包配置2)

                                         (3.charles抓包配置3手机设置代理)

3.目标android APP,版本号:10.1.4 (下载地址 ):

https://www.wandoujia.com/apps/279987

   之所以不选用最新版APP,是因为最新版APP不走系统代理(Proxy.NO_PROXY)抓不到包;

4.jadx java逆向工具(下载地址):

https://github.com/skylot/jadx

                                                       (图4 jadx下载)

5.ida逆向工具(下载地址):

https://hex-rays.com/IDA-pro/

6.frida(下载地址):

https://frida.re/

7.unidbg(下载地址):

https://github.com/zhkl0228/unidbg

二.开始抓包分析


    打开手机app,然后再点击某个商品,可以看到已经抓到明文数据了:


                                          (图5.charles抓包成功)

参数分析


1、url分析

https://api.m.jd.com/client.action?functionId=wareBusiness&clientVersion=10.1.4&build=90060&client=android&d_brand=Xiaomi&d_model=MI4LTE&osVersion=6.0.1&screen=1920*1080&partner=ks006&oaid=&eid=eidA0c138122bas4uo1qCosmRnqrZBkTZ+zEF7qNa5UCxrzSE5IyVBHJw4jzuBKyNz0TPXE0oY0j0H/viRPJy5RUE1KWCJuMWV52ufEtPyZiLpXsetVD&sdkVersion=23&lang=zh_CN&eu=8363533373230323933313336333&fv=93D2634303938303363663032626&uuid=d5aada6c69ce7237&aid=d5aada6c69ce7237&area=25_2258_2259_57314&networkType=wifi&wifiBssid=d9077de60f51d1d1d6f228a96f318e0c&uemps=0-2&harmonyOs=0&scval=7929459&st=1695609462872&sign=e684ce9273978b1b9fc14382508e25ca&sv=121
quest参数分析
https://api.m.jd.comapi服务器
functionId=wareBusiness表示请求商品信息
clientVersion=10.1.4表示app版本号
build=90060 固定值

client=android&d_brand=Xiaomi&d_model=MI4LTE&

osVersion=6.0.1&screen=1920*1080

手机基本信息
partner=ks006固定值
oaid=&eid=  并未参与服务器校验,不用管
sdkVersion=23android 版本号
eu=&fv=  并未参与服务器校验,不用管
uuid=  设备标识,参与签名校验
aid=&area=    固定值
networkType=wifi   网络类型
wifiBssid=  固定值
uemps=0-2&harmonyOs=0&scval=7929459固定值

st=1695609462872&

sign=e684ce9273978b1b9fc14382508e25ca&

sv=121

经过多次抓包查看,发现这三个值是变化的。 st,sign,sv为签名字符串,必须,否则采集不到数据。

2、post data分析


发送post请求,携带body数据如下:

body=%7B%22abTest800%22%3Atrue%2C%22avoidLive%22%3Afalse%2C%22brand%22%3A%22Xiaomi%22%2C%22cityId%22%3A2258%2C%22cpsNoTuan%22%3Anull%2C%22darkModelEnum%22%3A3%2C%22districtId%22%3A2259%2C%22eventId%22%3A%22Productdetail_AutoTextViewInitTime%22%2C%22fromType%22%3A0%2C%22isDesCbc%22%3Atrue%2C%22latitude%22%3A%2224.343482%22%2C%22lego%22%3Atrue%2C%22longitude%22%3A%22102.548063%22%2C%22model%22%3A%22MI+4LTE%22%2C%22ocrFlag%22%3Afalse%2C%22pluginVersion%22%3A101040%2C%22plusClickCount%22%3A0%2C%22plusLandedFatigue%22%3A0%2C%22provinceId%22%3A%2225%22%2C%22skuId%22%3A%227929459%22%2C%22source_type%22%3A%22indexMiaoShaArea%22%2C%22source_value%22%3A%2234_1_7929459_0_4_0_0_0%22%2C%22townId%22%3A57314%2C%22uAddrId%22%3A%220%22%2C%22utmMedium%22%3Anull%7D&

body数据为url编码的字符串,解码后如下:

{"abTest800":true,"avoidLive":false,"brand":"Xiaomi","cityId":2258,"cpsNoTuan":null,"darkModelEnum":3,"districtId":2259,"eventId":"Productdetail_AutoTextViewInitTime","fromType":0,"isDesCbc":true,"latitude":"24.343482","lego":true,"longitude":"102.548063","model":"MI 4LTE","ocrFlag":false,"pluginVersion":101040,"plusClickCount":0,"plusLandedFatigue":0,"provinceId":"25","skuId":"7929459","source_type":"indexMiaoShaArea","source_value":"34_1_7929459_0_4_0_0_0","townId":57314,"uAddrId":"0","utmMedium":null}

其中:"skuId":"7929459"为商品ID,其它值可以固定。

3、headers分析

:method	POST
:path	/client.action?functionId=wareBusiness&clientVersion=10.1.4&build=90060&client=android&d_brand=Xiaomi&d_model=MI4LTE&osVersion=6.0.1&screen=1920*1080&partner=ks006&oaid=&eid=eidA0c138122bas4uo1qCosmRnqrZBkTZ+zEF7qNa5UCxrzSE5IyVBHJw4jzuBKyNz0TPXE0oY0j0H/viRPJy5RUE1KWCJuMWV52ufEtPyZiLpXsetVD&sdkVersion=23&lang=zh_CN&eu=8363533373230323933313336333&fv=93D2634303938303363663032626&uuid=d5aada6c69ce7237&aid=d5aada6c69ce7237&area=25_2258_2259_57314&networkType=wifi&wifiBssid=d9077de60f51d1d1d6f228a96f318e0c&uemps=0-2&harmonyOs=0&scval=7929459&st=1695609462872&sign=e684ce9273978b1b9fc14382508e25ca&sv=121
:authority	api.m.jd.com
:scheme	https
cookie	whwswswws=AAgsrKcqKECi7HFAHqcQGCPELbQtKWubWUX3axAAAAAA;unionwsws={"devicefinger":"eidA0c138122bas4uo1qCosmRnqrZBkTZ+zEF7qNa5UCxrzSE5IyVBHJw4jzuBKyNz0TPXE0oY0j0H\/viRPJy5RUE1KWCJuMWV52ufEtPyZiLpXsetVD","jmafinger":"AAgsrKcqKECi7HFAHqcQGCPELbQtKWubWUX3axAAAAAA"};
charset	UTF-8
user-agent	okhttp/3.12.1;jdmall;android;version/10.1.4;build/90060;screen/1080x1920;os/6.0.1;network/wifi;
jdc-backup	whwswswws=AAgsrKcqKECi7HFAHqcQGCPELbQtKWubWUX3axAAAAAA;unionwsws={"devicefinger":"eidA0c138122bas4uo1qCosmRnqrZBkTZ+zEF7qNa5UCxrzSE5IyVBHJw4jzuBKyNz0TPXE0oY0j0H\/viRPJy5RUE1KWCJuMWV52ufEtPyZiLpXsetVD","jmafinger":"AAgsrKcqKECi7HFAHqcQGCPELbQtKWubWUX3axAAAAAA"};
accept-encoding	br,gzip,deflate
cache-control	no-cache
content-type	application/x-www-form-urlencoded; charset=UTF-8
content-length	757

4、返回包含商品信息的json数据(截取一部分):

{
	"code": 0,
	"floors": [{
		"bId": "eCustom_flo_299",
		"cf": {
			"bgc": "#ffffff",
			"spl": "empty"
		},
		"data": {
			"isShowAR": false,
			"threeDSwitch": false,
			"hasNew3d": true,
			"maxSales": {
				"head": "https://m.360buyimg.com/umm/jfs/t1/129759/16/40027/1248/64ca1744Fa4fa92fb/d7e880a19b60e3fd.png"
			},
			"videoControl": {
				"autoPlay": false,
				"masterVideo": {
					"duration": 30,
					"imageUrl": "https://img10.360buyimg.com/videocover/jfs/t1/172698/25/26029/144332/61e12e9dEed51eb34/7491df6c1a6e32ae.jpg",
					"playBackFlag": false,
					"playUrl": "https://jvod.300hu.com/vod/product/4aadfd4b-5cdc-4c8e-9f33-624def0cf178/225dab7defb0493cb062fba090286249.mp4?source=2&h265=h265/18799/902cee167a96463b93fbe4f6fbc5443e.mp4",
					"useCoverPicture": false,
					"videoDuration": "00'30\"",
					"videoId": "687650717",
					"videoShare": {
						"des": "我发现了一个精彩的视频,快来看看吧",
						"microBlog": "我发现了一个精彩的视频,快来看看吧https://h5.m.jd.com/dev/3UmozpxSyHxMaXRXndHbUhwC4iuN/index.html?skuId=7929459",
						"title": "这个小视频不错哦~",
						"url": "https://h5.m.jd.com/dev/3UmozpxSyHxMaXRXndHbUhwC4iuN/index.html?skuId=7929459"
					}
				},
				"optimize": true
			}
		},

三.逆向APP分析源码(Sign-Jadx静态分析)


1.Jadx中查找签名函数


把app导入到jadx,我们要追踪st,sign,sv这三个参数的来源,那么我们搜索一下,先搜索sign的位置,然后一步步查找,最终找到:


                                        (图6sign签名位置1)


sgin签名 计算涉及到了接口的这几个参数
functionId,body,uuid,client,clientVersion
签名函数

String signature = a.XL().XT().signature(a.XL().getApplicationContext(), queryParameter, str, deviceUUID, property, versionName);

                                                           (图6sign签名位置2)

签名函数的位置,可见签名函数位于jdbitmapkit.so文件中。
关键代码:

BitmapkitUtils.getSignFromJni(context, str, str2, str3, str4, str5);

getSignFromJni 这个加密方法 是调用了jdbitmapkit.so里面的代码:

 ReLinker.loadLibrary(JdSdk.getInstance().getApplication(), "jdbitmapkit");

2.Sign-Frida注入验证


注意新版京东有检测frida的,需要改个进程名跟端口。

用frida注入如下函数  BitmapkitUtils.getSignFromJni(context, str, str2, str3, str4, str5);

function HookHandle(clazz) {
    clazz.getSignFromJni.implementation = function (a, b, c, d, e, f) {
        console.log("=======================================")
        var r = this.getSignFromJni(a, b, c, d, e, f);
        console.log("param1: ", a)
        console.log("param2: ", b)
        console.log("param3: ", c)
        console.log("param4: ", d)
        console.log("param5: ", e)
        console.log("param6: ", f)
        console.log("result: ", r)
        return r;
    }
    console.log("HookHandle ok")
}

Java.perform(function () {
    Java.choose("dalvik.system.PathClassLoader", {
        onMatch: function (instance) {
            try {
                var clazz = Java.use('com.jingdong.common.utils.BitmapkitUtils');
                HookHandle(clazz)
                return "stop"
            } catch (e) {
                console.log("next")
                console.log(e)
            }
        },
        onComplete: function () {
            console.log("success")
        }
    })
})

                                     (图7.Frida注入验证)

如上,我们可以看出,st sign sv都是从so来的。

至此,sign的来源已理清。


3.找出jdbitmapkit.so文件


直接压缩软件打开app,搜索,找出文件jdbitmapkit.so


4、IDA逆向


.直接上IDA,把文件拖进去
在方法sub_127E4 找到关键词sign=
方法里面也刚好有uuid,body,st等关键词,确认是这个没错了。


5.将so代码还原成java


    查看ida的代码分析一下算法,并且用java还原,再翻译成python代码。


(图8java测试代码)

四、cipher-Jadx静态分析


继续搜索”cipher“字段,找到cipher加解密位置如下:


(图9.cipher加解密类)

cipher这个直接复制d这个类就包含了加解密。

五、python 调用sign签名返回app端接口商品详情信息


(图10.sign签名采集到商品详情信息)
                             

技术交流 5b6u5L+h77yaYnljNjM1MiAgUVE6Mzk4NDg4NzI=(base64解码)

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

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

相关文章

智能交通RFID设备的实际应用有哪些?

随着RFID应用的不断普及&#xff0c;交通系统中也引入了RFID来用作车辆的识别和监控&#xff0c;如我们常见的车辆前挡风玻璃内侧安装的RFID电子标签进行通信&#xff0c;可以实现对车辆的自动、非接触、不停车识别和监控。下面我们就一起来了解一下&#xff0c;智能交通RFID设…

《学术小白学习之路11》DTM主题动态模型原理与基础构建

《学术小白学习之路》DTM主题动态模型构建 一、LDA与DTM的区别二、代码实操2.1 数据2.2 获取数据向量2.3 参数设置与模型构建2.4 结果的输出一、LDA与DTM的区别 LDA主题模型主要针对一段段的文档 可以得出每个主题,所对应主题词的词语的概率 该模型的主题概率的生成是基于文…

大规模语言模型的模型结构---编码器-解码器结构(GLM,UL2系列)

2020 年 Open AI 发布了由包含 1750 亿参数的神经网络构成的生成式大规模预训练语言模型 GPT-3 (Gener- ative Pre-trained Transformer 3)。开启了大规模语言模型的新时代。由于大规模语言模型的参数量巨大&#xff0c; 如果在 不同任务上都进行微调需要消耗大量的计算资源&a…

单元测试、集成测试、系统测试到底有什么不同?

单元测试、集成测试和系统测试是软件测试开发中不可或缺的部分。 单元测试 范围&#xff1a;单元测试是对软件中最小的可测试单元的测试&#xff0c;通常是函数、方法或类。 目的&#xff1a;它的目标是验证每个单独的单元是否按照预期工作&#xff0c;以增加代码的可靠性和稳…

斩获双奖!人大金仓亮相第六届智慧医疗创新大赛全国总决赛

9月22日&#xff0c;2023数字健康创新大会暨第六届智慧医疗创新大赛全国总决赛圆满结束。凭借在智慧医疗领域的创新成果&#xff0c;人大金仓荣获“最佳原创奖”以及医疗信创赛道“二等奖”&#xff0c;获得业内专家、用户、相关单位领导及医疗伙伴的高度认可。 获奖证书 左右滑…

MySQL的时间差函数、日期转换计算函数

MySQL的时间差函数(TIMESTAMPDIFF、DATEDIFF)、日期转换计算函数(date_add、day、date_format、str_to_date) 时间差函数&#xff08;TIMESTAMPDIFF、DATEDIFF&#xff09; 需要用MySQL计算时间差&#xff0c;使用TIMESTAMPDIFF、DATEDIFF&#xff0c;记录一下实验结果 --0 …

如何学习maya mel语言的经验分享

一、前言 总结一下这十几年来学习和使用mel语言的一些经验&#xff0c;供初学朋参考&#xff0c;哈哈。 这里不说深奥理论&#xff0c;只是朴实经历陈述。 其实&#xff0c;早在2003年&#xff0c;最初接触maya时&#xff0c;就已经涉及到mel的学习&#xff0c;当时在大学里接…

究竟是什么样的讲解二分查找算法的博客让我写了三小时???

版本说明 当前版本号[20230926]。 版本修改说明20230926初版 目录 文章目录 版本说明目录二分查找基础版算法描述分步演示情况一&#xff1a;能在有序数组找到待查值情况二&#xff1a;不能在有序数组找到待查值 翻译成代码基础版代码&#xff08;包括测试类&#xff09;疑惑…

regsvr32 initpki.dll找不到指定模块要怎么解决?教你快速修复initpki.dll文件

当你尝试在 Windows 操作系统中注册 DLL 文件时&#xff0c;可能会遇到错误消息&#xff1a;“regsvr32 initpki.dll找不到指定模块”。它通常是由于一个或多个 DLL 文件缺失或损坏所导致的。这是一个常见的错误&#xff0c;并且可以遇到在 Windows 7、Windows 8 和 Windows 10…

百度实习一面(知识图谱部门)

百度面经&#xff08;知识图谱部&#xff09;一面 1.自我介绍 介绍完了&#xff0c;打开共享&#xff0c;对着简历一点一点问 2.ffmpeg在项目中是怎么使用的 回答了ffmpeg在项目中使用的命令&#xff0c;用来干了什么 3.为什么使用toml配置&#xff0c;了解过yml配置吗&am…

【Vue3 源码解析】computed

export function computed<T>(getter: ComputedGetter<T>,debugOptions?: DebuggerOptions ): ComputedRef<T> export function computed<T>(options: WritableComputedOptions<T>,debugOptions?: DebuggerOptions ): WritableComputedRef<…

SPA项目之主页面--动态树右侧内容管理

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于VueElementUI的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.左侧动态树 1.定义组件 ①样式…

【神印王座】悲啸洞穴之物揭晓,圣采儿差点被骗,幸好龙皓晨聪明

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析神印王座。 神印王座动漫现阶段已经出到龙皓晨等人接取新任务深入魔族地界的阶段&#xff0c;而龙皓晨等人接取的任务想必现在大家都知道了&#xff0c;那就是探索魔族地界中的悲啸洞穴。但是大家知道悲啸洞穴里面藏着什么…

智能的障碍:符号化

基于事实与价值叠加的算计与基于事实的计算有着明显的区别。 基于事实的计算是指根据已有的客观事实和数据进行计算和推理。在这种计算中&#xff0c;只考虑和利用与事实相关的信息和数据&#xff0c;目的是得出合理的、基于客观事实的结论。例如&#xff0c;使用数学公式和逻辑…

python实现全局变量共享,一个全局变量在多个文件中使用

因为业务需求要将抓到的数据进行累加统计&#xff0c;而且还要间隔三秒钟将这个数据推送到服务端&#xff0c;所以就要实现一个全局变量来记录这个数据&#xff0c;而且推送服务要每隔三秒钟就推送一次到服务端。之前使用了一个全局文件common.py&#xff0c;里面存储这个变量t…

【CV学习笔记】tensorrtx-yolov5 逐行代码解析

1、前言 TensorRTx(下文简称为trtx)是一个十分流行的利用API来搭建网络结构实现trt加速的开源库&#xff0c;作者提到为什么不用ONNX parser的方式来进行trt加速&#xff0c;而用最底层的API来搭建trt加速的方式有如下原因: Flexible 很容易修改模型的任意一层&#xff0c;删…

渗透测试——信息收集思路

文章目录 信息收集域名与 IPOSINTCDNCDN的作用如何检测是否存在CDN CDN 绕过多地Ping邮件服务器子域名真实IP寻找国外地址请求查找老域名查找关联域名信息泄露/配置文件网站漏洞DNS记录&#xff0c;证书域名历史 搜索引擎语法WHOIS端口对外开放情况Nmap 网站的三种部署模式网站…

chrome extensions mv3通过content scripts注入/获取原网站的window数据

开发插件的都知道插件的content scripts和top window只共享Dom不共享window和其他数据&#xff0c;如果想拿挂载在window的数据还有点难度&#xff0c;下面会通过事件的方式传递cs和top window之间的数据写一个例子 代码 manifest.json 这里只搞了2个js&#xff0c;content.…

DataX - 在有总bps限速条件下,单个channel的bps值不能为空,也不能为非正数

更新服务器上的datax版本后&#xff0c;发现执行以前的任务全都失败&#xff0c;查看日志都有报 com.alibaba.datax.common.exception.DataXException: Code:[Framework-03], Description:[DataX引擎配置错误&#xff0c;该问题通常是由于DataX安装错误引起&#xff0c;请联系…

ssl证书 阿里的域名,腾讯云的证书

目录 1.腾讯云申请ssl免费证书 2.去阿里云进行解析 3.回到腾讯云 4.nginx的配置 说明&#xff1a;阿里云的免费证书用完了&#xff08;每年可以申请20个&#xff09;&#xff0c;还有个项目要用证书&#xff0c;第三方的证书免费的都是90天的。看了下腾讯云业可以申请免费的…