得物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 hashlib

def sign_hash(e):
    v = 7
    x = 12
    _ = 17
    w = 22
    C = 5
    S = 9
    T = 14
    P = 20
    E = 4
    I = 11
    A = 16
    k = 23
    O = 6
    B = 10
    D = 15
    L = 21
    e = y(e)
    b = f(e)
    c = 1732584193
    s = 4023233417
    m = 2562383102
    h = 271733878
    for n in range(0, len(b), 16):
        t = c
        i = s
        r = m
        a = h
        c = 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 & 255
        hex_byte = format(byte, 'x')
        hex_string += hex_byte.zfill(2)
    return hex_string

def 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.mfbz.cn/a/559166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

bp神经网络拟合函数未知参数【源码+视频教程】

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

Linux 操作系统非缓冲区的文件操作、时间编程

1、文件操作 1.1 基于缓冲区的文件操作 基于缓冲区的文件操作---高级Io 以f开头的是基于缓冲区的文件操作 printf是一个基于缓冲区的函数 输出条件: 1.程序正常运行 2.遇到换行\n也能输出 3.缓存区内存已满 1024大小 4.遇到fflush(stdout&a…

Ansible-变量-迭代-jinja2模版

变量: 在ansible中,变量是用来存储和传递数据的容器。 这些变量可以包含各种类型的数据,列如数字、字符串、列表、字典。 可以增加ansible playbook的灵活性和重用性变量的使用: 声明:变量名值 引用:{{ 变量…

详细分析Java中的AuthRequest类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 公共接口,定义了对第三方平台进行授权、登录、撤销授权和刷新 token 的操作 1. 基本知识 先看源码基本API接口: import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.exception.AuthExce…

提升测试效率,专业方案揭秘

提升测试效率是软件开发中一个永恒的主题,它不仅关乎项目能否按期完成,更影响着软件产品的质量与用户体验。随着敏捷开发、持续集成等方法论的普及,如何在有限的时间内进行高效、全面的测试成为了开发者和测试人员面临的挑战。 在传统模式中&…

Windows 平台上面管理服务器程式的高级 QoS 策略

在 Windows 平台上面,目前有两个办法来调整应用程式的 QoS 策略设置,一种是通过程式设置,一种是通过 “Windows 组策略控制”。 在阅读本文之前,您需要先查阅本人以下的几篇文献,作为前情提示: VC Windows…

数据质量与策略:解锁生成式AI潜力的关键步骤

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

每日一题(L2-011):玩转二叉树--建树+层序遍历

与L2-006近乎相同&#xff0c;先建树&#xff0c;然后遍历 #include<bits/stdc.h> using namespace std; int in[35]; int pre[35]; typedef struct Tree{int num;Tree* left;Tree* right; }T;T * build(int in1,int in2,int pre1,int pre2){T * tnew T;t->numpre[pr…

战姬物语部署

一.准备环境 #关闭seliunx和防火墙 setenforce 0 systemctl stop firewalld systemctl disable firewalld #配置源&#xff0c;并安装常用工 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo …

Leetcode 86. 分隔链表

题目链接&#xff1a; 86. 分隔链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/partition-list/description/ 题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出…

深入探究图像增强(C语言实现)

我们将从基础出发使用C语言进行图像处理与分析&#xff0c;重点讨论图像增强和平滑技术。图像增强技术旨在通过增加对比度、亮度和整体清晰度来改善图像的视觉质量。另一方面&#xff0c;图像平滑方法则用于减少噪声并减少图像中的突变&#xff0c;使图像更加均匀和视觉上吸引人…

利用二维码定位技术实现桌面机器人简易定位方案(上篇)

目录 1、前言2、二维码的定位标签识别原理3、生成定位标签3、基于定位标签的物体识别与定位 1、前言 机械手臂尤其是工业场景下大部分的应用是在一个平面&#xff08;桌面&#xff09;内完成一些抓取工作。一般可以用示教方式完成重复步骤。但是示教方式&#xff0c;对于一些活…

过氧化氢滴定方法可用的PFA器皿有哪些?

滴定液:KMnO4标准溶液 试液:H2O2商品液(3%)&#xff0c;H2SO4 (3.0mol/L ) 指示剂:酚酞指示剂 仪器:分析天平&#xff0c;PFA酸式滴定管50mL&#xff0c;PFA 移液管10mL/25mL、PFA 容量瓶250mL、PFA锥形瓶250mL 1、KMnO4标准溶液浓度的标定(见实验:高锰酸钾标准溶液的配制与…

记一次普通的单表查询sql优化,去掉文件排序

一现象&#xff1a; 有空观察了线上某个sql语句执行计划&#xff0c;发现在500多毫秒左右&#xff0c;打算进行下优化。 二步骤&#xff1a; 对查询列assessment_periodic_id、assessment_user_id、create_time添加了组合索引并指定了倒叙。加入create_time 使查询结果不需要在…

阿里云OSS 存储对象的注册与使用

目录 一、什么是阿里云OSS 二、 点击免费试用 2.1 选择第一个&#xff0c;点击免费试用 ​编辑 2.2 登录管理控制台 2.3 进入Bucket 2.4、在阿里云网站上的个人中心配置Accesskey,查询accessKeyId和accessKeySecret。 2.5、进入AccssKey管理页面应该会出现下图提示&…

通用大模型研究重点之五:llama family

LLAMA Family decoder-only类型 LLaMA&#xff08;Large Language Model AI&#xff09;在4月18日公布旗下最大模型LLAMA3&#xff0c;参数高达4000亿。目前meta已经开源了80亿和700亿版本模型&#xff0c;主要升级是多模态、长文本方面工作。 模型特点&#xff1a;采用标准的…

Java面试八股之Java异常处理完成后,Exception对象会发生什么变化

Java异常处理完成后&#xff0c;Exception对象会发生什么变化 这个题的难度在于&#xff0c;看到题之后可能不知道面试官想问什么。在面试中&#xff0c;如果实在没明白&#xff0c;可以让面试官再深入阐述一下。 Java异常处理完成后&#xff0c;Exception对象失去了程序中的…

自定义Blazor单文件Web程序端口

#接 上篇 Mysql快速迁移版的制作过程# 上一篇《Mysql8快速迁移版的制作过程》完成了快速迁移的数据库的准备&#xff0c;今天接着讲基于Blazor的Web程序快速迁移版的制作。 单文件发布的难点不在发布而是因为程序系统默认给了个5001的端口&#xff0c;而是如何能够让用户自定…

Leetcode 11.盛最多水的容器(暴力->双指针)

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例 …

Postman调用OpenApi接口

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