某软件商店app抓包分析与sign加密算法实现

news2024/11/18 9:40:37

文章目录

  • 1. 写在前面
  • 2. 抓包配置
  • 3. 抓包分析
  • 4. 接口测试
  • 5. sign加密算法
  • 6. 数据效果展示

【作者主页】:吴秋霖
【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作!
【作者推荐】:对JS逆向感兴趣的朋友可以关注《爬虫JS逆向实战》,对分布式爬虫平台感兴趣的朋友可以关注《分布式爬虫平台搭建与开发实战》
还有未来会持续更新的验证码突防、APP逆向、Python领域等一系列文章

1. 写在前面

  APP逆向分析的第一步,就是抓包分析!抓包这个层面能够碰到的坑那也是数不胜数,现在大一点的APP基本都是自己的协议,然后就是各种防抓包,wifi代理检测,转发检测,证书校验…

做为一名多年爬虫过来人,告诉你爬虫的过往与未来:

基础:

语法,爬虫库+框架,解析库(五花八门),抓包工具(应有尽有),多线程,多进程,分布式爬虫,自动化与存储方案

六七年之前会上面部分加少量的反爬虫对抗能力,去任何一家爬虫业务的企业,爬虫团队长老位必有一席之位!

Web逆向:

浏览器构造,基础语法,Bom、Dom属性与方法,调试技巧与工具,加密定位,代码混淆,补环境,AST,扣代码,算法还原,指纹与风控对抗能力(里面有超过一半需要长期实践加经验积累)

以上两项掌握,如果是在三年前基本在另何一家企业都是爬虫团队的中坚核心力量,首席长老就是你!

APP逆向:

逆向原理,Java 、Smali语法,反编译工具,各种Hook手法与工具,调式与定位技巧,砸壳,加固

还有你见或没见过的各种验证码: 滑块,点选,运算,图文,逻辑

爬虫的尽头无疑就是逆向,根本学不完!


分析目标

T1BQT+i9r+S7tuWVhuW6l++8jOiHquW3seS4i+i9vQ==

2. 抓包配置

  这个APP有一个证书校验,如果直接去抓包的话,就是下面这个情况:

在这里插入图片描述

这里的话咱们也是可以使用Frida去Hook掉证书验证,当然你需要反编译APP并且定位到验证部分

这里我使用的是Charles + Drony的方案去抓这个APP的包,用什么方案不是唯一的,也可以使用Postren

Android7.0之后默认不信任用户添加到系统的CA证书。所以再这里我们需要把Charles的证书放到手机的系统证书路径下,不然https协议数据包是失败的(保证手机已经root

/etc/security/cacerts #系统证书路径
/data/misc/user/0/cacerts-added #用户证书路径

把Charles证书保存到本地,使用如下命令进行计算:

openssl x509 -subject_hash_old -in wql.pem(文件名)

在这里插入图片描述

把上面计算出来的d27ccb05文件拷到手机系统证书下,后缀名的数字是为了防止文件名冲突的,推送到手机命令如下:

adb push d27ccb05.0 /sdcard

adb shell进入到命令行模式,将我们刚刚推送到/sdcard下面的d27ccb05.0证书移动系统中证书路径下去,如下所示:

su #切换权限
cd /sdcard # 切换目录
mv d27ccb05.0 /etc/security/cacerts # 移动证书

在这里插入图片描述

然后我们再到手机上看系统证书,就可以看到我们刚刚移动进去的证书文件了, 如下所示:

在这里插入图片描述

3. 抓包分析

在完成上面配置准备之后,就可以开始抓包了,打开APP跟Charles还有Drony,APP内点击搜索一下关键词,抓一下搜索接口的请求,搜索接口抓包信息如下所示:

在这里插入图片描述

可以看到headers的请求参数很多,但是大部分都是固定值。动态的有sign、id

下面再抓一下请求信息接口,可以看到参数基本都是一样的,两个接口不一样的地方就是sign加密参数内容有变化
在这里插入图片描述

4. 接口测试

我们先把抓包请求拿出来放到Postman工具内测试验证一下,搜索接口测试如下所示:
在这里插入图片描述

详情接口测试如下所示:

在这里插入图片描述

证明接口都是没有问题的~

5. sign加密算法

sign加密生成主要通过多个参数id、ocs、oak、salt做md5计算实现的

然后就是URL也参与了加密,md5之前的加密明文如下:

在这里插入图片描述

salt是一串盐字符串,固定的几个参数,将APK反编译后全局搜索能够找到,由于我这里7+版本的app删掉了,就不再验证码

直接上算法,核心加密生成算法如下所示:

const crypto = require('crypto');

function getMd5(body) {
    return crypto.createHash('md5').update(body, 'utf8').digest('hex');
}

function getSign(url, t) {
    const oak = "cdb09c43063ea6db";
    const oakRear = "08f4fe8a43775179bdc58acb383220bc";
    const idd = "867686020" + Math.floor(Math.random() * (999999 - 100000 + 1) + 100000) + "///";
    const ocs = "google%2FNexus+6P%2F23%2F6.0.1%2FUNKNOWN%2F2%2FMHC19Q%2F7902";
    const salt = "STORENEWMIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBANYFY/UJGSzhIhpx6YM5KJ9yRHc7YeURxzb9tDvJvMfENHlnP3DtVkOIjERbpsSd76fjtZnMWY60TpGLGyrNkvuV40L15JQhHAo9yURpPQoI0eg3SLFmTEI/MUiPRCwfwYf2deqKKlsmMSysYYHX9JiGzQuWiYZaawxprSuiqDGvAgMBAAECgYEAtQ0QV00gGABISljNMy5aeDBBTSBWG2OjxJhxLRbndZM81OsMFysgC7dq+bUS6ke1YrDWgsoFhRxxTtx/2gDYciGp/c/h0Td5pGw7T9W6zo2xWI5oh1WyTnn0Xj17O9CmOk4fFDpJ6bapL+fyDy7gkEUChJ9+p66WSAlsfUhJ2TECQQD5sFWMGE2IiEuz4fIPaDrNSTHeFQQr/ZpZ7VzB2tcG7GyZRx5YORbZmX1jR7l3H4F98MgqCGs88w6FKnCpxDK3AkEA225CphAcfyiH0ShlZxEXBgIYt3V8nQuc/g2KJtiV6eeFkxmOMHbVTPGkARvt5VoPYEjwPTg43oqTDJVtlWagyQJBAOvEeJLno9aHNExvznyD4/pR4hec6qqLNgMyIYMfHCl6d3UodVvC1HO1/nMPl+4GvuRnxuoBtxj/PTe7AlUbYPMCQQDOkf4sVv58tqslO+I6JNyHy3F5RCELtuMUR6rG5x46FLqqwGQbO8ORq+m5IZHTV/Uhr4h6GXNwDQRh1EpVW0gBAkAp/v3tPI1riz6UuG0I6uf5er26yl5evPyPrjrD299L4Qy/1EIunayC7JYcSGlR01+EDYYgwUkec+QgrRC/NstV";
    
    const middleBody = ocs + t + idd + url.split('.com').slice(-1)[0].replace("?", "");
    const length = (middleBody.length + 48).toString();
    const body = oak + oakRear + middleBody + length + salt;

    return getMd5(body);
}

const url = "https://api-cn.store.heytapmobi.com/search/v1/search?start=0&tabId=&searchType=10&size=10&keyword=快手"
const timestamp = Math.floor(Date.now() / 1000); // 当前时间戳
console.log(getSign(url, timestamp));

在这里插入图片描述

6. 数据效果展示

搜索接口与详情接口请求headers:

在这里插入图片描述

详情页面数据内容:

在这里插入图片描述

  好了,到这里又到了跟大家说再见的时候了。创作不易,帮忙点个赞再走吧。你的支持是我创作的动力,希望能带给大家更多优质的文章

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

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

相关文章

递归算法学习——二叉树的伪回文路径

1,题目 给你一棵二叉树,每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的数目。 示例…

【vue_2】创建一个弹出权限不足的提示框

定义了一个名为 getUserRole 的 JavaScript 函数,该函数接受一个参数 authorityId,根据这个参数的不同值返回相应的用户角色字符串。这段代码的目的是根据传入的 authorityId 值判断用户的角色,然后返回相应的角色名称。 如果 authorityId 的…

Python中生成随机数技巧与案例

在Python中生成随机数有几种方式,其中常用的方式包括使用random模块、numpy库以及secrets模块。这里给你举例说明一下: random模块 import random random_floatrandom.random() print(f生成一个0-1的随机浮点数:{random_float})random_intrandom.randin…

调整 ARIMA 进行预测:Python 中的一种简单方法

一、说明 ARIMA 时间序列预测模型非常适合具有趋势和季节性的序列。它是一种被广泛采用的经典模型,通常作为现代深度学习方法基准测试的基准。然而,估计其准确的参数具有挑战性。研究人员和开发人员通常使用包括视觉绘图在内的试错方法。 二、什么是ARI…

使用Python的turtle模块绘制彩色螺旋线

1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。在本博客中,我们将使用turtle模块来绘制一个彩色的螺旋线。通过调用各种命令,我们可以引导turtle绘制出指定…

RevCol实战:使用RevCol实现图像分类任务(一)

文章目录 摘要安装包安装timm 数据增强Cutout和MixupEMA项目结构计算mean和std生成数据集 摘要 可逆柱状结构(RevCol)是一种网络结构,它受到GLOM(Global Columnar Memory)的启发。RevCol由N个子网络(或称为…

常见树种(贵州省):018栎灌、油茶、火棘、铁仔、小檗、勾儿茶、马桑、车桑子、山苍子、楮

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、茅栗 …

萨科微举办工作交流和业务分享会

萨科微(www.slkoric.com)举办工作交流和业务分享会,狠抓人才培养团队的基本功建设。萨科微总经理宋仕强先生认为,当下市场经济形势复杂多变,给公司经营带来巨大压力,同时考验着企业自身的发展韧性。萨科微公…

认识Linux操作系统

什么是操作系统? 操作系统是一款软硬件资源管理的软件Linux是一款具体的操作系统的品类(Linux内核是用C语言写的)centos7是一款具体的Linux操作系统 为什么要有操作系统? Linux操作系统 Linux是一种自由和开放源代码的类UNIX操…

php获取当前域名方法

使用$_SERVER[HTTP_HOST]变量只获取到域名: $domain $_SERVER[HTTP_HOST]; echo $domain; 获取包含协议和域名的完整URL $protocol isset($_SERVER[HTTPS]) && $_SERVER[HTTPS] on ? https:// : http://; $domain $_SERVER[HTTP_HOST]; $current_url…

Ceph分布式存储系统的介绍及详细安装部署过程:详细实战版(保姆级)

Ceph简介 Ceph是一个统一的分布式存储系统,设计初衷是提供较好的性能、可靠性和可扩展性。 Ceph项目最早起源于Sage就读博士期间的工作(最早的成果于2004年发表),并随后贡献给开源社区。 在经过了数年的发展之后,目前…

基于Python的面向对象分类实例Ⅱ

接上一部分继续介绍~ 一、地类矢量转栅格 这一步是为了能让地类值和影像的对象落在同一区域,从而将影像中的分割对象同化为实际地物类别。 train_fn r".\train_data1.shp" train_ds ogr.Open(train_fn) lyr train_ds.GetLayer() driver gdal.GetDrive…

【GPT-3.5】通过python调用ChatGPT API与ChatGPT对话交流

文章目录 一、引言二、AIGC简介三、OpenAI介绍四、GPT-3.5介绍五、获得OpenAI API Key六、调用ChatGPT API实现与ChatGPT对话七、参考链接 一、引言 ChatGPT 的火爆,成功带火了AIGC,让它进入大众的视野。 ChatGPT 和Whisper API 开发者现在可以通过API将…

【Mybatis-Plus篇】Mybatis-Plus基本使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

网络数据结构skb_buff原理

skb_buff基本原理 内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_…

一个正整数转为2进制和8进制,1的个数相同的第23个数是什么?

package cn.com;import java.lang.*;//默认加载public class C2 {//10进制转8进制static int HtoO(int n){int cnt 0;while(n!0){cntn%8;n/8;}return cnt;}//10进制转2进制static int HtoB(int n){int cnt 0;while(n!0){cntn%2;n/2;}return cnt;}public static void main(Str…

Linux常用命令——bind命令

在线Linux命令查询工具 bind 显示或设置键盘按键与其相关的功能 补充说明 bind命令用于显示和设置命令行的键盘序列绑定功能。通过这一命令,可以提高命令行中操作效率。您可以利用bind命令了解有哪些按键组合与其功能,也可以自行指定要用哪些按键组合…

NX二次开发UF_CURVE_ask_curve_fit_data 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_fit_data Defined in: uf_curve.h int UF_CURVE_ask_curve_fit_data(tag_t curve_feature, UF_CURVE_curve_fit_data * curve_fit_data ) overview 概述 Ask c…

windows c++ open3D release版本下载与使用

文章目录 open3d库下载路径下载库的使用 Open3D的下载与成功调用,咱们不使用vs来编译。 我开始时候吧,想做个vs编译,后来就是在vs中反复进坑。编译来来去去都是报错。 咱们使用新方法,仅仅修改一两句代码,简单cmd编译即…

记录华为云服务器(Linux 可视化 宝塔面板)-- 安全组篇

文章目录 前言安全组说明安全组的特性安全组的应用场景 进入安全组添加基本规则添加自定义规则如有启发,可点赞收藏哟~ 前言 和windows防火墙类似,安全组是一种虚拟防火墙,具备状态检测和数据包过滤功能,可以对进出云服务器的流量…