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

news2025/1/12 18:19:49

文章目录

  • 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.coloradmin.cn/o/1609415.html

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

相关文章

C++修炼之路之继承<二>

目录 一:子类的六大默认成员函数 二:继承与友元 三:继承与静态成员 四:复杂的继承关系菱形继承菱形虚拟继承 1.单继承 2.多继承 3.菱形继承;一种特殊的多继承 4.菱形虚拟继承 5.虚拟继承解决数据冗余和二…

Spectre-v1 简介以及对应解决措施

文章目录 前言一、Variant 1: Exploiting Conditional Branches.二、 BACKGROUND2.1 Out-of-order Execution2.2 Speculative Execution2.3 Branch Prediction2.4 The Memory Hierarchy2.5 Microarchitectural Side-Channel Attacks2.6 Return-Oriented Programming 三、 ATTAC…

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

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

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

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

QT跨平台读写Excel

QT跨平台读写Excel 背景Excel工具CMakeLists.txt工程目录 背景 开发框架QT,makefile构建工具CMake,编译器MinGW Excel工具 考虑跨平台则不能使用针对微软COM组件的QAxObject来读写Excel,因此使用开源QtXlsx。 这里是将QXlsx当做源码嵌入使…

门禁管理系统服务器如何内网映射让外网访问?

禁管理系统整体解决方案,可实现请假出入联动、门状态监控、电子地图、非法闯入报警、远程开门、红外防夹、智能统计等功能,应用非常广泛。 如果门禁管理系统部署在没有公网IP的本地服务器上,如何设置,能让外网互联网上也能登录访问内部的管理…

亚马逊云科技AWS CloudUp for Her送亚马逊认证考试50%优惠券活动

最近总有小伙伴问小李哥,有没有送AWS考试50%优惠券的活动?这次送云从业者(cloud practitioner)、助理级架构师(SAA)考试50%优惠券活动就来了! 本次活动叫AWS CloudUp for Her,完成免费在线培训课程即可获得AWS证书考试50%折扣券&a…

ZooKeeper设置监听器

ZooKeeper设置监听器,通过getData()/getChildern()/xists()方法。 步骤: 1.创建监听器:创建一个实现Watcher接口的类,实现process()方法。这个方法会在ZooKeeper向客户端发送一个Watcher事件通知的时候被调用。 2.注册监听器&…

Servlet第四篇【request对象常用方法、应用】

什么是HttpServletRequest HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。 简单来说,要得…

蓝桥杯竞赛类型:Web应用开发 全程详解

既然大家准备报名蓝桥杯,那么对蓝桥杯就应该有一定的了解了。没有了解也没关系,简单来说,蓝桥杯就是一个计算机竞赛,竞赛类型大多是使用各种语言写算法,当然还有本文的主体——Web应用开发。对蓝桥杯有了基本了解之后&…

C#使用PaddleOCR进行图片文字识别✨

PaddlePaddle介绍✨ PaddlePaddle(飞桨)是百度开发的深度学习平台,旨在为开发者提供全面、灵活的工具集,用于构建、训练和部署各种深度学习模型。它具有开放源代码、高度灵活性、可扩展性和分布式训练等特点。PaddlePaddle支持端…

IntelliJ IDEA2020下使用Maven构建Scala 项目

1.创建maven文件 2.进入pom.xml导入依赖 <!--添加spark的依赖--><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.12</artifactId><version>3.2.1</version></dependency><!--添加scala依…

【ONE·基础算法 || 栈 】

总言 主要内容&#xff1a;编程题举例&#xff0c;熟悉理解以栈此类数据结构为主的题型。       文章目录 总言1、栈2、删除字符中的所有相邻重复项&#xff08;easy&#xff09;2.1、题解 3、比较含退格的字符串&#xff08;easy&#xff09;3.1、题解 4、基本计算器 II&a…

Buildroot系统构建学习笔记(以百问网imx6ullPro开发板为例)

一、Builroot是什么&#xff1f; Buildroot是一组Makefile和补丁&#xff0c;可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境(包括bootloader、Linux内核、包含各种APP的文件系统)。Buildroot运行于Linux平台&#xff0c;可以使用交叉编译工具为多个目标板构建嵌…

c++|list使用及深度剖析模拟实现

目录 一、list介绍与使用 1.1 list介绍 1.2 list的使用 1.2.1list的构造 1.2.2iterator 1.2.3容量 1.2.4元素访问 1.2.5 元素修改 二、list的深度剖析及模拟实现 三、list与vector的对比 一、list介绍与使用 1.1 list介绍 ①list底层是带头双向循环链表&#xff0c;在…

Redis进阶——BitMap用户签到HyperLogLog实现UV统计

目录 用户签到实现签到功能 签到统计HyperLogLog实现UV统计UV和PV的概述测试百万数据的统计 用户签到 BitMap功能演示 我们针对签到功能完全可以通过MySQL来完成&#xff0c;例如下面这张表 用户签到一次&#xff0c;就是一条记录&#xff0c;假如有1000W用户&#xff0c;平…

RCE漏洞及其绕过——[SWPUCTF 2021 新生赛]easyrce、caidao、babyrce

目录 什么是Shell 1、Shell简介 2、印刷约定 一、什么是RCE 漏洞产生条件&#xff1a; 漏洞检测&#xff1a; 1.远程命令执行 system()函数&#xff1a; passthru()函数&#xff1a; exec()函数&#xff1a; 无回显 shell_exec()函数&#xff1a; 2.远程代码执行 e…

我们一起看看《看漫画学C++》中如何讲解对象的动态创建与销毁

《看漫画学C》这本书中会用图文的方式生动地解释对象的动态创建与销毁。在C中&#xff0c;动态创建对象是通过new运算符来实现的&#xff0c;而销毁对象则是通过delete运算符来完成的。这种方式可以让程序在需要时分配内存给对象&#xff0c;并在对象不再需要时释放内存&#x…

「Word 论文排版」插入分节符导致word转PDF后出现空白页

问题 word转PDF后出现空白页 解决 但是此方法会让页面页脚标记出错 TODO 如下图所示 在论文目录后有一个分节符&#xff0c;转成PDF之后就多了一个空白页 文件-打印-页面设置-选中封面那一页-版式-从偶数页开始 再导出空白页就没了

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…