前言: 本文仅供学习交流,只提供关键思路不会给出完整代码,严禁用于非法用途,若有侵权请联系我删除!技术交流合作请私信!
用到工具如下:
之所以要选择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 包就抓不到了。
(1)下载地址:
(图2 charles下载位置)
按照默认next即可,然后选择路径。
(2)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手机设置代理)
之所以不选用最新版APP,是因为最新版APP不走系统代理(Proxy.NO_PROXY)抓不到包;
(图4 jadx下载)
打开手机app,然后再点击某个商品,可以看到已经抓到明文数据了:
(图5.charles抓包成功)
参数分析
client=android&d_brand=Xiaomi&d_model=MI4LTE&
osVersion=6.0.1&screen=1920*1080
st=1695609462872&
sign=e684ce9273978b1b9fc14382508e25ca&
sv=121
发送post请求,携带body数据如下:
body数据为url编码的字符串,解码后如下:
其中:"skuId":"7929459"为商品ID,其它值可以固定。
把app导入到jadx,我们要追踪st,sign,sv这三个参数的来源,那么我们搜索一下,先搜索sign的位置,然后一步步查找,最终找到:
(图6sign签名位置1)
sgin签名 计算涉及到了接口的这几个参数 functionId,body,uuid,client,clientVersion 签名函数
(图6sign签名位置2)
签名函数的位置,可见签名函数位于jdbitmapkit.so文件中。 关键代码:
getSignFromJni 这个加密方法 是调用了jdbitmapkit.so里面的代码:
注意新版京东有检测frida的,需要改个进程名跟端口。
用frida注入如下函数 BitmapkitUtils.getSignFromJni(context, str, str2, str3, str4, str5);
(图7.Frida注入验证)
如上,我们可以看出,st sign sv都是从so来的。
至此,sign的来源已理清。
直接压缩软件打开app,搜索,找出文件jdbitmapkit.so
.直接上IDA,把文件拖进去 在方法sub_127E4 找到关键词sign= 方法里面也刚好有uuid,body,st等关键词,确认是这个没错了。
查看ida的代码分析一下算法,并且用java还原,再翻译成python代码。
(图8java测试代码)
继续搜索”cipher“字段,找到cipher加解密位置如下:
(图9.cipher加解密类)
cipher这个直接复制d这个类就包含了加解密。
(图10.sign签名采集到商品详情信息)
技术交流 5b6u5L+h77yaYnljNjM1MiAgUVE6Mzk4NDg4NzI=(base64解码)