得物sign参数逆向分析与Python算法还原

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 断点分析
  • 4. Python算法还原

【🏠作者主页】:吴秋霖
【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作!
【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》
未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章

作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除!

1. 写在前面

  又到了周末学习技术的时间,最近准备购置一台设备,在让玩机变得更加伟大的同时想深度去研究学习一下APP逆向相关的东西。现在爬虫这个赛道在外面的市场已经可以说是非常卷了!多终端爬虫逆向能力已成为了大部分企业招聘的必备条件与要求

回想起七八年前刚入此道,哪有那么多逆向不逆向的。那个时候的爬虫是那么的纯粹而简单!自动化Boy那都是小公司的座上宾~

本期文章分析一下某毒的sign签名加密,它这个搜索跟详情的接口会比较复杂一些,请求参数跟响应数据都是加密的!

打开即巅峰,爬虫领域单拎一个方向出来都会发现是炸裂的!本身就是一个大杂烩领域,就下面这种各类验证码突防这块,都学不完~

在这里插入图片描述

2. 接口分析

打开网站地址,监测一下接口请求发包,可以看到sign参数加密,一般签名加密会采用MD5的加密方式,MD5常见的有16、32、40位!在之前的文章中有提到过在JS逆向中如何快速搜索定位加密函数。下面猜测是有MD5加密的,之后验证一下,如下所示:

在这里插入图片描述

除了sign是动态的,其他的那些个参数都是一些固值

3. 断点分析

直接搜索是可以找到的,所以就不需要使用其他过于繁琐的定位方法与技巧。可以看到如下疑似sign参数生成的位置,如下所示:

在这里插入图片描述

可以在这个地方下个断点,然后重新下拉加载一下页面触发断点,如下所示:
在这里插入图片描述

我们把上图部分的代码拿下来简单的看一下,n即加密参数,这里我们需要去分析的是w,它是加密方法,如下所示:

var n = w(e.params);
return e.params = N({sign: n
}, e.params)

直接跟到w方法内部看一下,单步进入来到下图位置处,这里直接跟到x[“e”]内,如下所示:

在这里插入图片描述

继续来到下图位置处,这里已经看到了之后需要开始扣代码的入口了,就是p,如下所示:

在这里插入图片描述

我们可以在控制台去查看验证一下,配合着断点,o是一串长字符,然后经过p生成最终的签名参数,如下所示:

在这里插入图片描述

上面p生成的签名参数与接口请求的是一致的,如下所示:

在这里插入图片描述

继续跟到p方法内,看下面代码特征会发现果真是MD5,这部分代码是一个完整的MD5算法实现,包含了一系列位操作和轮函数,如下所示:

在这里插入图片描述

各种字符串转换字节数组,然后将字节数组转换成32位整数数组。然后初始化、填充、处理!最后将处理后的结果转换成字节数组,然后根据需要返回不同形式的结果,包括字节数组、字符串或十六进制字符串

整个算法串起来:对象转换字符串、进行MD5加密、将固值跟加密结果拼接,再返回最终结果

4. Python算法还原

按照上面梳理的流程直接扣JS算法即可,作者使用Py进行的算法还原!部分算法如下所示:

import json
import hashlibdef sign_hash(e):v = 7x = 12_ = 17w = 22C = 5S = 9T = 14P = 20E = 4I = 11A = 16k = 23O = 6B = 10D = 15L = 21e = y(e)b = f(e)c = 1732584193s = 4023233417m = 2562383102h = 271733878for n in range(0, len(b), 16):t = ci = sr = ma = hc = u(c, s, m, h, b[n + 0], v, 3614090360)h = u(h, c, s, m, b[n + 1], x, 3905402710)m = u(m, h, c, s, b[n + 2], _, 606105819)s = u(s, m, h, c, b[n + 3], w, 3250441966)c = u(c, s, m, h, b[n + 4], v, 4118548399)h = u(h, c, s, m, b[n + 5], x, 1200080426)m = u(m, h, c, s, b[n + 6], _, 2821735955)s = u(s, m, h, c, b[n + 7], w, 4249261313)c = u(c, s, m, h, b[n + 8], v, 1770035416)h = u(h, c, s, m, b[n + 9], x, 2336552879)m = u(m, h, c, s, b[n + 10], _, 4294925233)s = u(s, m, h, c, b[n + 11], w, 2304563134)c = u(c, s, m, h, b[n + 12], v, 1804603682)h = u(h, c, s, m, b[n + 13], x, 4254626195)m = u(m, h, c, s, b[n + 14], _, 2792965006)s = u(s, m, h, c, b[n + 15], w, 1236535329)c = d(c, s, m, h, b[n + 1], C, 4129170786)h = d(h, c, s, m, b[n + 6], S, 3225465664)m = d(m, h, c, s, b[n + 11], T, 643717713)s = d(s, m, h, c, b[n + 0], P, 3921069994)c = d(c, s, m, h, b[n + 5], C, 3593408605)h = d(h, c, s, m, b[n + 10], S, 38016083)m = d(m, h, c, s, b[n + 15], T, 3634488961)s = d(s, m, h, c, b[n + 4], P, 3889429448)c = d(c, s, m, h, b[n + 9], C, 568446438)h = d(h, c, s, m, b[n + 14], S, 3275163606)m = d(m, h, c, s, b[n + 3], T, 4107603335)s = d(s, m, h, c, b[n + 8], P, 1163531501)c = d(c, s, m, h, b[n + 13], C, 2850285829)h = d(h, c, s, m, b[n + 2], S, 4243563512)m = d(m, h, c, s, b[n + 7], T, 1735328473)s = d(s, m, h, c, b[n + 12], P, 2368359562)c = l(c, s, m, h, b[n + 5], E, 4294588738)h = l(h, c, s, m, b[n + 8], I, 2272392833)m = l(m, h, c, s, b[n + 11], A, 1839030562)s = l(s, m, h, c, b[n + 14], k, 4259657740)c = l(c, s, m, h, b[n + 1], E, 2763975236)h = l(h, c, s, m, b[n + 4], I, 1272893353)m = l(m, h, c, s, b[n + 7], A, 4139469664)s = l(s, m, h, c, b[n + 10], k, 3200236656)c = l(c, s, m, h, b[n + 13], E, 681279174)h = l(h, c, s, m, b[n + 0], I, 3936430074)m = l(m, h, c, s, b[n + 3], A, 3572445317)s = l(s, m, h, c, b[n + 6], k, 76029189)c = l(c, s, m, h, b[n + 9], E, 3654602809)h = l(h, c, s, m, b[n + 12], I, 3873151461)m = l(m, h, c, s, b[n + 15], A, 530742520)s = l(s, m, h, c, b[n + 2], k, 3299628645)c = p(c, s, m, h, b[n + 0], O, 4096336452)h = p(h, c, s, m, b[n + 7], B, 1126891415)m = p(m, h, c, s, b[n + 14], D, 2878612391)s = p(s, m, h, c, b[n + 5], L, 4237533241)c = p(c, s, m, h, b[n + 12], O, 1700485571)h = p(h, c, s, m, b[n + 3], B, 2399980690)m = p(m, h, c, s, b[n + 10], D, 4293915773)s = p(s, m, h, c, b[n + 1], L, 2240044497)c = p(c, s, m, h, b[n + 8], O, 1873313359)h = p(h, c, s, m, b[n + 15], B, 4264355552)m = p(m, h, c, s, b[n + 6], D, 2734768916)s = p(s, m, h, c, b[n + 13], L, 1309151649)c = p(c, s, m, h, b[n + 4], O, 4149444226)h = p(h, c, s, m, b[n + 11], B, 3174756917)m = p(m, h, c, s, b[n + 2], D, 718787259)s = p(s, m, h, c, b[n + 9], L, 3951481745)c = o(c, t)s = o(s, i)m = o(m, r)h = o(h, a)R = to_hex_string(c) + to_hex_string(s) + to_hex_string(m) + to_hex_string(h)return R.lower()def to_hex_string(num):hex_string = ""for i in range(4):byte = num >> 8 * i & 255hex_byte = format(byte, 'x')hex_string += hex_byte.zfill(2)return hex_stringdef generate_sign_string(params):to_str = lambda e: "" if e is None else ",".join(map(json.dumps, e)) if isinstance(e, list) else json.dumps(e) if isinstance(e, dict) else str(e)sorted_params = sorted([f"{k}{to_str(params[k])}" for k in params])sign_string = "".join(sorted_params) + "048a9c4943398714b356a696503d2d36"return sign_hash(sign_string)

需要完整算法学习,可找作者免费获取测试,未防止滥用文章今后不贴核心算法源码!!!

在这里插入图片描述

作者简单写了一个Python爬虫Demo调用上面的Py算法,进行了一下测试,效果如下所示:

在这里插入图片描述

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

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

相关文章

Postman调用OpenApi接口

首先你需要科学上网。。。。。 请求方式:post 请求地址:https://api.openai.com/v1/chat/completions 请求头: Authorization : Bearer key Content-Type : application/json Body : { "messages": [{ "role": &quo…

【论文精读】Bag of Tricks for Image Classification with Convolutional Neural Networks

这篇文章比较早了,2018年的 摘要 最近在图像分类研究方面取得的大部分进展可以归功于训练程序的改进,如数据增强和优化方法的改变。然而,在文献中,大多数改进要么作为实现细节简要提到,要么只在源代码中可见。在本文中…

CV method:最新Backbone---TransNeXt

文章目录 前言一、提出问题二、模型结构1. Pixel-focused Attention(像素聚焦注意力机制)2. Aggregating Diverse Attentions in a Single Mixer Query embedding3. ConvGLU4. 整体模型架构 三、方法论1. PFA设计原理2. Aggregating Diverse Attention原…

前端从零到一搭建脚手架并发布到npm

这里写自定义目录标题 一、为什么需要脚手架?二、前置-第三方工具的使用1. 创建demo并运行-4步新建文件夹 zyfcli,并初始化npm init -y配置入口文件 2.commander-命令行指令3. chalk-命令行美化工具4. inquirer-命令行交互工具5. figlet-艺术字6. ora-lo…

【算法】合并两个有序链表

本题来源---《合并两个有序链表》 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] /*** Definition for singl…

C++ - STL详解—vector类

一. vector的概念 向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。 …

win/mac达芬奇19下载:DaVinci Resolve Studio 19

DaVinci Resolve Studio 19 是一款功能强大的视频编辑和调色软件,广泛应用于电影、电视和网络节目的后期制作。这款软件不仅提供了专业的剪辑、调色和音频处理工具,还引入了全新的DaVinci Neural Engine AI工具,对100多项功能进行了大规模升级…

Vue3(五):组件通信详解(九种方法)

主要有九种方法,以下是详细解释及使用方法: 1.props props实现父子间的通信,是使用频率最高的。 (1)父传子:属性值是非函数。 以Father.vue和Child.vue 为例。 父组件中,引入子组件并给子组…

34、链表-合并K个升序链表

思路 1、直接全部放入集合中,然后排序,在进行构造节点返回 2、使用归并排序的方式,两两排序合并,最后合并大的。 3、第三中思路就比较巧妙了,可以使用小根堆,每次弹出堆顶,最小值&#xff0c…

【计算机网络】http协议的原理与应用,https是如何保证安全传输的

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

基于 RT-Thread 的 CMUX 串口多路复用的详细使用

一、CMUX 软件包的介绍 CMUX(Connection Multiplexing ),即连接(串口)多路复用,其功能主要在一个真实的物理通道上虚拟多个通道,每个虚拟通道上的连接和数据通讯可独立进行。  CMUX 软件包常用…

DRF ModelSerializer序列化类

ModelSerializer序列化类 【0】准备 模型表创建 from django.db import modelsclass Book(models.Model):name models.CharField(max_length64, verbose_name书名)price models.DecimalField(max_digits6, decimal_places2, verbose_name价格)publish models.ForeignKey(…

【C++打怪之路】-- C++开篇

🌈 个人主页:白子寰 🔥 分类专栏:C打怪之路,python从入门到精通,魔法指针,进阶C,C语言,C语言题集,C语言实现游戏👈 希望得到您的订阅和支持~ &…

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)

目录 1、区别(vue-cli2 与 vue-cli3 ) 2、例子1(vue2项目) 2.1 版本与命令行 2.2 项目本地截图 2.3 项目文件解析 (1)package.json 文件 (2)webpack.dev.conf.js文件 &#…

[大模型]Qwen-7B-hat Transformers 部署调用

Qwen-7B-hat Transformers 部署调用 环境准备 在autodl平台中租一个3090等24G显存的显卡机器,如下图所示镜像选择PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 接下来打开刚刚租用服务器的JupyterLab,并且打开其中的终端开始环境配置、模型下…

NLP自然语言处理_序章

开一个新篇章,立一个flag,用一段时间来学习一下NLP,涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门,此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理? NLP…

查看linux的主机配置脚本

废话不说 直接上指令 curl -Lso- bench.sh | bash 等待后,结果如图: 使用后没有问题,看情况使用 出事概不负责 介意勿用!!!

RabbitMQ 各种通信模式的Python实现

一、RabbitMQ 原理 1、基本原理 RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。支持多种客户端,如:Python、Java、Javascript、C#、C/C,Go等,支持AJ…

使用yolov8 进行实例分割训练

1、基于windows 的ISAM标注 直接下载安装包,解压后即可使用 链接:https://pan.baidu.com/s/1u_6jk-7sj4CUK1DC0fDEXQ 提取码:c780 2、标注结果转yolo格式 通过ISAM标注后的json文件路径 原始json格式如下: ISAM.json 转 yolo.…

Leetcode算法训练日记 | day30

一、重新安排行程 1.题目 Leetcode:第 332 题 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发…