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

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


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


用到工具如下:


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.xdnf.cn/news/142752.html

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

相关文章

Android存储权限完美适配(Android11及以上适配)

一、Bug简述 一个很普通的需求&#xff0c;需要下载图片到本地&#xff0c;我的三个测试机&#xff08;荣耀Android10&#xff0c;红米 11 和小米Android 13都没有问题&#xff09;。 然后&#xff0c;主角登场了&#xff0c;测试的三星Android 13 死活拉不起存储权限弹窗。 …

深入理解红黑树

小白慎入&#xff01;本文难度比较高&#xff0c;需要对红黑树有一定的了解再来看&#xff01; 红黑树 红黑树是一种高级数据结构&#xff0c;是平衡树大家族中的一员&#xff0c;并且听名字就知道这个玩意不是凡物&#xff0c;可能你从未听过&#xff0c;但是你一定会为这样的…

华为OD七日集训第6期 十一特辑 - 按算法分类,由易到难,循序渐进,玩转OD

目录 专栏导读华为OD机试算法题太多了&#xff0c;知识点繁杂&#xff0c;如何刷题更有效率呢&#xff1f; 一、逻辑分析二、数据结构1、线性表① 数组② 双指针 2、map与list3、优先队列4、滑动窗口5、二叉树6、并查集7、栈 三、算法1、基础算法① 贪心算法② 二分查找③ 分治…

大咖共探AGI时代机遇,腾讯云助力大模型规模化应用提速

引言 2023 年&#xff0c;科技圈的“顶流”莫过于大模型。自 ChatGPT 的问世拉开大模型与生成式 AI 产业的发展序幕后&#xff0c;国内大模型快速跟进&#xff0c;已完成从技术到产品、再到商业的阶段跨越&#xff0c;并深入垂直行业领域。 新技术的爆发&#xff0c;催生新的应…

mdobus ASCII转CAN OPEN JAE1939协议网关

Modbus RTU协议转换网关是一种常见的设备&#xff0c;用于将Modbus RTU协议转换为其他通信协议。而CANopen是一种基于CAN总线的通信协议&#xff0c;主要用于工业自动化和控制系统中。本文将介绍Modbus RTU协议转换网关如何支持CANopen协议&#xff0c;以及该功能的应用场景和优…

洗地机哪个牌子好用又实惠?口碑最好的洗地机推荐

智能技术飞速发展的时代&#xff0c;扫地机器人这类智能家电其实也在顺应潮流和用户需求&#xff0c;不断更新迭代。暂且不说市面上现有多少个洗地机品牌&#xff0c;单单一个洗地机品牌旗下&#xff0c;其实每年都会有多个系列的新品亮相&#xff0c;我们面对的选择多了&#…

javaee之黑马乐优商城6

商品品牌的查询 上面就是我们需要根据分类id去找品牌 假设我们现在拿到的是 商品的分类id&#xff0c;我们需要根据分类id查询出对应的品牌即可 下面我们拿到上面的接口&#xff0c;直接撸代码 这个是和品牌相关联的操作&#xff0c;因为先去看一下BrandMapper,这个mapper是…

OpenCV显示10bit Raw数据

参考&#xff1a;10 12 14bit图像存储格式&#xff0c;利用Opencv显示10bit Raw数据,并根据鼠标的移动显示对应位置的灰度值。其他bit位数的Raw数据方法类似。 代码实现&#xff1a; #include<opencv2/opencv.hpp> #include<iostream> #include<opencv/highgu…

Qt扩展-QCustomPlot 简介及配置

QCustomPlot 简介及配置 一、概述二、安装教程三、帮助文档的集成 一、概述 QCustomPlot是一个用于绘图和数据可视化的Qt 控件。它没有进一步的依赖关系&#xff0c;并且有良好的文档记录。这个绘图库专注于制作好看的、发布质量的2D绘图、图形和图表&#xff0c;以及为实时可…

中间相遇法(分治类问题非等大分治的平衡做法)

分治&#xff0c;如果分成两半大小不一样&#xff0c;很容易被卡到 O ( n 2 ) O(n^2) O(n2) 在某些题目中&#xff0c;利用中间相遇法&#xff0c;我们可以优化这个过程 其优化的前提是分治的大头在找分界点 复杂度不用证&#xff0c;很好理解吧 这层找地越久&#xff0c;下…

一维卷积神经网络

假设输入数据维度为8&#xff0c;filter维度为5&#xff1b; 不加padding时&#xff0c;输出维度为4&#xff0c;如果filter的数量为16&#xff0c;那么输出数据的shape就是4*16. 一维卷积不代表卷积核只有一维&#xff0c;也不代表被卷积的feature也是一维。一维的意思是说卷…

regexp 应用

今天同事拿出个小栗子 1 如果用like的话 1,22 的情况会被字符串2匹配到这样会有问题 这里需要用concat将uids处理下 比如第一条处理成&#xff0c;1,2&#xff0c;3&#xff0c; 的形式 去模糊匹配 ‘%,1,%’ 当然like这种模糊匹配不太建议使用 2 regexp 用法 单个值 &#x…

MySQL作业1

目录 一.创建一张表&#xff0c;包含以下所有数据类型 建表&#xff1a;​编辑 二.使用以下六种约束 1.非空约束 2.唯一约束 3.主键约束 4.外键约束 5.检查约束 6.默认值约束 一.创建一张表&#xff0c;包含以下所有数据类型 Text 类型&#xff1a; Number 类型&#…

2023-9-26 JZ 复杂链表的复制

题目链接&#xff1a;复杂链表的复制 import java.util.*; /* public class RandomListNode {int label;RandomListNode next null;RandomListNode random null;RandomListNode(int label) {this.label label;} } */ public class Solution {public RandomListNode Clone(Ra…

【ComfyUI】Pytorch预训练模型(torch.hub)缓存地址修改

序言 最近玩ComfyUI时&#xff0c;每次生成图片&#xff0c;总是会下载一些东西&#xff0c;时间长了&#xff0c;C盘就不够用了&#xff0c;今天清理C盘发现&#xff0c;总是会在C:\Users\yutao\.cache\torch\hub\checkpoints这个路径下&#xff0c;下载大模型文件&#xff0…

适合零基础小白学的 Python 教程,视频或者书籍都可以?

Python 有很多衍生方向&#xff0c;比如 web 开发、网络爬虫、数据分析、数据挖掘、机器学习、人工智能等等&#xff0c;就业范围是很广的&#xff0c;Python 相较于别的编程语言对小白入门还是很友好的&#xff0c;Python 入门推荐这份书籍&#xff1a;PYTHON全案例实践 【PD…

6.wifi开发【智能家居:下】,正式开发:智能开关灯,智能采集温湿度,智能调彩灯

一。WEB Server开发 1.需求分析 用户通过页面操作插座彩灯温湿度 【开发前端1】&#xff1a;智能插座网页设计 智能插座网页设计需求 1.通过浏览器访问ESP8266 webserver 2.显示“创客学院-WiFi-智能家居” 3.显示“智能插座” 4.显示当前插座工作状态 5.按键触发插座动作 2.…

新手必看:Android studio 侧边栏实现,带源码

文章目录 前言效果图正文toolbar 用于定义应用程序的导航栏app_bardrawer_layout 用于创建侧边栏导航nav_header_draw app:menu"menu/activity_main_drawer" 前言 本篇内容主要是自己实现侧边栏后的一些总结&#xff0c;部分理论来着网络和ai助手&#xff0c;如有错…

根据文章段落内容自动插入图片php版

每篇内容根据段落判断插入图片代码附上&#xff1a; $chatd"<table>";if(stripos($content,$chatd)0){//随机输出三张图功能if($moduleid!37 &&$thumb){//判断是否存在图$idrand(1,999999);$midrand(1,9999999);$getimg"http://www.nongpin88.co…

uniapp项目实践总结(二十三)网页和小程序应用打包教程

导语&#xff1a;当你的应用程序开发完成后&#xff0c;在发布到互联网之前&#xff0c;需要进行打包操作&#xff0c;包括网页端、小程序端的打包。 目录 准备工作网页打包小程序打包 准备工作 在打包之前&#xff0c;请保证你的 uniapp 应用程序编译到网页、小程序是可以正…