某网站sign签名参数与数据响应加密逆向分析

news2025/5/24 8:53:45

文章目录

  • 1. 写在前面
  • 2. 接口分析
  • 3. 断点分析
  • 4. 扣代码

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

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

1. 写在前面

  又到了周末学习技术的时间,这篇文章要分析的是一个请求参数签名加密与响应数据加密的网站。对了!昨天我更新了一篇PDD的加密算法还原,跟商家后台不一样,是批发的,里面有作者测试的一些总结

如感兴趣可移步于此处进行阅读:最新PDD批发Anti-Content参数逆向分析与算法还原

2. 接口分析

开始!随便点击一个模块,我们监测一下请求发包,可以看到提交的请求参数中有一个sign,这个参数的加密倒是很简单,稍微调试去分析一下就能够找到加密逻辑代码,直接扣取下来即可!如下所示:

在这里插入图片描述

然后我们再看一下接口返回的数据,它是以密文的方式返回的,如下所示:

在这里插入图片描述

这种情况一般如果没有点实力的,那就被直接拒之门外了!自动化方案页面数据结构展示复杂,在此组装拼接的工程化代码将会是复杂头疼的!所以这种情况还是需要去分析解密算法进行还原的!数据解密在之前我的文章中有提到多种方案去定位与跟栈分析

3. 断点分析

sign参数的长度看起来像md5加密又不像,34位?魔改了?还是加盐了?先不去猜测,直接搜一下参数sign,如下所示:

在这里插入图片描述

上面代码(function() { return Z })是一个立即执行函数表达式,返回的Z函数很可能就是sign参数的加密函数,直接进入到Z</font方法看一下就知道, 如下所示:

在这里插入图片描述

进入到方法内部后断点,执行一下跳到最新的内部断点处,看着代码逻辑,放佛一切都即将真相大白,Z就是加密方法,如下所示:

在这里插入图片描述

我刷新了几次接口请求,sign参数的末尾总是固定的99,结合上面的代码逻辑,应该是先通过md5加密之后拼接的固定字符串,我们来验证一下,如下所示:

在这里插入图片描述

Z加密方法接受的两个参数,分别是API路径加请求提交的参数,常见的加密手法。我们可以在控制台看一下,如下所示:

在这里插入图片描述

4. 扣代码

完成了上面sign参数的加密分析,接下来我们开始扣代码,先把Z方法扣取下来,为了方便验证,把当前调试环境内的参与加密的参数都补上,测试一下。如下所示:

const crypto = require('crypto-js')

function md5(text){
    text = String(text)
    return crypto.MD5(text).toString()
}

var e = '' //浏览器环境复制
var t = {
    "appType": "3",
    "channelNumber": "GF1001",
    "comId": "8",
    "lang": "zh",
    "platform": "pc",
    "st": 1712998336085,
    "timeZone": "8",
    "version": "671",
    "versionCode": "671"
}

function l() {
            return e
        }
function Z(e, t) {
    var n = {}
      , o = e;
    for (var r in Object.keys(t).sort().map((function(e) {
        n[e] = t[e]
    }
    )),
    n)
        o = o + r + n[r];
    return o += md5("wjj"),
    md5(o).toLowerCase() + "99"
}

console.log(Z(e, t));

这里l()即md5加密,可以直接导模块,当然也可以去扣,但是对于原生的没有必要!之后分别在本地跟控制台环境运行,加密结果一致,看来没有任何问题。如下所示:

在这里插入图片描述
在这里插入图片描述

接下来分析数据加密,我们先用以前文章提到过的方式Hook一下接口响应数据,可以看加密与解密的所有数据拦截情况,它这个加载解密是动态的,如下所示:

在这里插入图片描述
在这里插入图片描述

直接跟栈,跳转到4ed4143.js代码文件,数据解密的核心逻辑就这个文件内,待会下面会详细的分析入口,讲解为什么这个文件是核心!如下所示:

在这里插入图片描述

继续跟一下,走到一处AES解密的特征处,接受一个密文参数,进行解密操作,如下所示:

在这里插入图片描述

我们来分析一下这块代码的逻辑,之后把它拿下来稍微做一个验证就知道了,首先对777db0c19edfaace字符来了一个编码序列,用做后续的解密算法中的密钥

同样的操作,9876543210599311操作完给到用r做解密算法中的初始向量

核心就是AES.decrypt(…)使用AES算法对密文进行解密,CBC模式解密,PKCS7的填充,解密之后得到一个字节序列,再toString将结果进行UTF-8编码得到最终解密的字符串

在这里插入图片描述

这里我们将断点处的代码拿下来,改一下密文丢进去验证,修改后测试代码如下所示:

const crypto = require('crypto-js')

const key = crypto.enc.Utf8.parse("777db0c19edfaace");
const iv = crypto.enc.Utf8.parse("9876543210599311");

const DecryptText = (e) => {
    const decrypted = crypto.AES.decrypt(e, key, {
        iv: iv,
        mode: crypto.mode.CBC,
        padding: crypto.pad.Pkcs7
    }).toString(crypto.enc.Utf8);

    return decrypted;
};
const data = '27imP4/mfRigCHNGzKw0KXkwQIvIox4kaepLM/ZaPhnMiYwkTfSO4HIxyrUbeRktYs8mIJzMSfD9VT1+i+HPYl0253H8f4Csd7+zOHRKvxwhTkHgDDuT419yvxJDadZZp/WyP3nlpwLSECLj7jOl5w==';
console.log(DecryptText(data))

在这里插入图片描述

验证是没有问题的,接下来就是扣取核心逻辑,它这个是一段段密文进行传输的,我们需要对最终的那个长串密文,也就是组装出来的整个大字符串进行解密,看了一下,各种数组操作、转换、编码、解码…找到特征跟到核心加密逻辑,如下所示:

在这里插入图片描述

又回到前面说的4ed4143.js文件,这里再浅浅的提那么一下,一定要记住这个文件!需要扣的都在里面,大家从这里开始往下去扣,如下所示:

在这里插入图片描述

继续往下分析,来到最终长加密字符的解密位置,可以看到k是入口函数,接受的参数e就是密文,这个我们结合Sign签名调用接口拿密文直接丢给k,如下所示:

在这里插入图片描述

既然定位到入口,那就更加清晰了,看k方法内调用的y,所有解密都将从它开始,如下所示:
在这里插入图片描述

先打把这两个方法扣出来,如下所示:

function k(e) {
            var t = e.split("").map((function(e) {
                return e.charCodeAt(0)
            }
            ))
              , n = new Uint8Array(t);
            return e = y(h.a.inflate(n))
        }
        
function y(e) {
    var t, i, n, o, r, c;
    for (t = "",
    n = e.length,
    i = 0; i < n; )
        switch ((o = e[i++]) >> 4) {
        case 0:
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
            t += String.fromCharCode(o);
            break;
        case 12:
        case 13:
            r = e[i++],
            t += String.fromCharCode((31 & o) << 6 | 63 & r);
            break;
        case 14:
            r = e[i++],
            c = e[i++],
            t += String.fromCharCode((15 & o) << 12 | (63 & r) << 6 | (63 & c) << 0)
        }
    return JSON.parse(t)
}

控制台看一下,最终的所有完整数据解密,如下所示:

在这里插入图片描述

剩下的就是前面说的那个核心文件了,y(h.a.inflate(n))中你可以看到调用的核心文件就是4ed4143.js,进去扣就行
在这里插入图片描述

最终的算法真的是太长了,我原本把所有的代码都扣完后,准备折叠一下把关键点发出来给需要学习的小伙伴有一个参考,但是还是放弃了,如下所示:

在这里插入图片描述
如果你需要学习,有任何疑问都可以咨询作者寻求帮助,或者也可以找作者拿完整的JS算法文件!祝大家周末愉快~

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

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

相关文章

【吊打面试官系列】Java高并发篇 - Java 中你怎样唤醒一个阻塞的线程?

大家好&#xff0c;我是锋哥。今天分享关于 【Java 中你怎样唤醒一个阻塞的线程&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; Java 中你怎样唤醒一个阻塞的线程&#xff1f; 在Java中&#xff0c;可以通过以下方式唤醒一个阻塞的线程&#xff1a; 使用Objec…

[dvwa] sql injection

sql injection 0x01 low sql语句没有过滤 经典注入&#xff0c;通过逻辑or为真相当于select * from users where true&#xff0c;99换成1也成 用union select 对齐列数&#xff0c;查看数据库信息 1’ union select 1,2# order by探测对齐列数更方便 1’ or 11 order b…

【网络安全】WebPack源码(前端源码)泄露 + jsmap文件还原

前言 webpack是一个JavaScript应用程序的静态资源打包器。它构建一个依赖关系图&#xff0c;其中包含应用程序需要的每个模块&#xff0c;然后将所有这些模块打包成一个或多个bundle。大部分Vue等项目应用会使用webpack进行打包&#xff0c;使用webpack打包应用程序会在网站js…

C语言 | Leetcode C语言题解之第28题找出字符串中第一个匹配项的下标

题目&#xff1a; 题解&#xff1a; int strStr(char* haystack, char* needle) {int n strlen(haystack), m strlen(needle);if (m 0) {return 0;}int pi[m];pi[0] 0;for (int i 1, j 0; i < m; i) {while (j > 0 && needle[i] ! needle[j]) {j pi[j - …

体验Humane AI:我与可穿戴AI别针的生活

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

使用Redis实现用户最近浏览记录

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Redis是一个key-va…

算法库应用- 表的自然链接

功 能: 设计算法,将两个单链表数组的特定位序, 相同者,链接起来 编程人: 王涛 详细博客:https://blog.csdn.net/qq_57484399/article/details/127161982 时 间: 2024.4.14 版 本: V1.0 V1.0 main.cpp /***************************************** 功 能: 设计算法,将两个…

学浪视频怎么缓存?

缓存学浪视频轻而易举&#xff01;推荐使用“小浪助手”&#xff0c;一款便捷的工具&#xff0c;助你轻松实现。工具已经预先打包好&#xff0c;需要的朋友可以自行下载。快试试&#xff0c;畅享学习吧&#xff01; 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1y7vcq…

【C++学习】深入理解C++异常处理机制:异常类型,捕获和处理策略

文章目录 ♫一.异常的提出♫二.异常的概念♫三.异常的使用♫3.1 异常的抛出和捕获♫3.2.异常的重新抛出♫3.3异常安全♫3.4 异常规范 ♫4.自定义异常体系♫5.C标准库的异常体系♫6.异常的优缺点 ♫一.异常的提出 之前&#xff1a; C语言传统的处理错误的方式与带来的弊端&…

【C++庖丁解牛】底层为红黑树结构的关联式容器--哈希容器(unordered_map和unordered_set)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. unordered系列关联式容…

多语言婚恋交友APP开发流程一览

近年来&#xff0c;随着全球化的发展和人们对跨文化交流的需求增加&#xff0c;多语言婚恋交友APP的需求逐渐增长。开发这类APP需要考虑到不同语言和文化下用户的需求&#xff0c;涉及到一系列独特的流程和挑战。本文将从专家角度为您解析多语言婚恋交友APP的开发流程&#xff…

GPT演变:从GPT到ChatGPT

Transformer 论文 Attention Is All You Need The dominant sequence transduction models are based on complex recurrent or convolutional neural networks in an encoder-decoder configuration. The best performing models also connect the encoder… https://arxiv.o…

一文理解java多线程之生产者消费者模型(三种实现)

生产者消费者模型 本文目录 生产者消费者模型基本介绍实现思路synchronized wait notify实现缓冲区生产者消费者测试代码思考 lock condition实现缓冲区生产者、消费者、测试代码 阻塞队列实现缓冲区生产者、消费者、测试代码思考 总结 基本介绍 什么是生产者消费者模型&am…

mybatis实体中时间类型LocalDateTime,查询的时候报错

问题描述 Spring boot集成mybatis实体中时间类型LocalDateTime&#xff0c;查询的时候报错 Error attempting to get column create_time from result set. Cause: java.sql.SQLFeatureNotSupportedException原因分析&#xff1a; 因为mybatis和druid的依赖版本兼容问题导致…

DHCP是什么意思 路由器中DHCP服务器怎么设置?

概述 DHCP是什么意思&#xff1f;很多朋友在路由器设置中&#xff0c;都会看到有一项“DHCP服务器”设置功能&#xff0c;而很多朋友对这个功能不太了解&#xff0c;也不知道怎么设置。其实&#xff0c;对于普通用户来说&#xff0c;无需去单独设置路由器DHCP服务器功能&#…

transformer在生物基因DNA的应用:DNABERT、DNABERT-2

参考&#xff1a; https://www.youtube.com/watch?vmk-Se29QPBA&t1388s 写明这些训练模型可以最终训练好可以进行DNA特征向量的提取&#xff0c;应用与后续1、DNABERT https://github.com/jerryji1993/DNABERT 主要思路就是把DNA序列当成连续文本数据&#xff0c;直接用…

【鸿蒙开发】第二十一章 Media媒体服务(一)

1 简介 Media Kit&#xff08;媒体服务&#xff09;提供了AVPlayer和AVRecorder用于播放、录制音视频。 在Media Kit的开发指导中&#xff0c;将介绍各种涉及音频、视频播放或录制功能场景的开发方式&#xff0c;指导开发者如何使用系统提供的音视频API实现对应功能。比如使用…

自己动手封装axios通用方法并上传至私有npm仓库:详细步骤与实现指南

文章目录 一、构建方法1、api/request.js2、api/requestHandler.js3、api/index.js 二、测试方法1、api/axios.js2、main.js3、app.vue4、vue.config.js5、index.html 三、打包1、配置package.json2、生成库包3、配置发布信息4、发布 四、使用1、安装2、使用 五、维护1、维护和…

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示图像应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD12864显示图像应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD12864简单介绍一、LCD12864点阵型液…

react17+18 中 setState是同步还是异步更新

在类组件中使用setState&#xff0c;在函数式组件中使用hooks的useState。 setstate目录 1. 类组件1.1 react 17版本1.2 react 18版本 2、函数式组件 1. 类组件 1.1 react 17版本 参考内容&#xff1a;第十一篇&#xff1a;setState 到底是同步的&#xff0c;还是异步的&…