最新PDD批发Anti-Content参数逆向分析与算法还原

news2024/11/26 11:27:45

文章目录

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

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

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

1. 写在前面

  上次周六的时候熬夜分析还原了一下商家后台的Anti-Content,那个参数是0aq开头的,本次的话应粉丝要求对批发网站进行了同样的参数分析,与其不同的是参数开头为0ar

分析目标

aHR0cHM6Ly9waWZhLnBpbmR1b2R1by5jb20v

老规矩,开局先放一张结果图,后续内容全靠编!!!

另外,对之前商家端Anti-Content参数分析感谢的,请看这篇文章:最新商家后台Anti-Content参数逆向分析与纯算法还原

在这里插入图片描述

2. 接口分析

主要通过商品搜索入口展开分析,然后到商品详情。首先,还是老规矩打开网站随便找个商品搜索一下,不出意料开局也是给了我一张图,据说多多的批发目前的风控是极其强的,我就分析测试了一下,黑了我一个号!!!

如果你看到你的页面一直是提示操作太过频繁,请稍后再试!之后页面就试一片空白,所有的功能都用不了

在这里插入图片描述

这个滑块的话,问题不大。有实力的话可以分析研究一下。我的话,没有实力,直接页面手动拖动一下,不然接口后续请求基本如下:

{result":{“verifyAuthToken”:“309dYy7ZgpWuk00cOyrgcQ3bed9a9ba4fdagfc7”},“error code”:54001, “error msa”:“”}

在此过程中我发现了一个特别迷惑的行为,就是出现滑块之后,网站页面,并没有弹出滑块的图,但是重新执行程序,接口不出滑块,正常可以请求到数据

我不知道是不是session的问题,但是就算重新执行程序,过程中比如在搜索提交一定次数后,同样会再次出现滑块反馈

直到最后,你的网页它也给你弹出了滑块,这个时候,更梦幻的就来了,你会发现浏览器触发一次滑块后,直接手过一下,拿参数下来用后续不会再出滑块

为了验证这个问题,我挂了程序一段时间,访问正常、搜索正常、详情页商品数据获取正常

说了这么多题外话,只是为了给大家一点踩过的坑。下面我们还是回到正题,如下所示:

在这里插入图片描述

参数没有啥加密的,主要的还是头部这个Anti-Content的参数加密,解决了它就迈过了第一重大山

在这里插入图片描述

再看一下响应数据,图中标注的字段在详情页接口请求中会用到

3. 分析与扣代码

跟商家端一样,我门搜索参数,然后断点开始调试分析。这里还是Webpack,所以我们找到入口,把自执行函数扣下来,Webpack最基本的组成就是自执行函数跟模块加载器!

之后把函数的实参,全部导出来放到自执行调用函数下,因为本身调用执行的就是一堆函数,只不过都是索引的方式

在这里插入图片描述

分析调试找到自执行函数,把代码扣出来,如下所示:

!function(e) {
    function t(t) {
        for (var n, o, d = t[0], f = t[1], i = t[2], u = 0, s = []; u < d.length; u++)
            o = d[u],
            Object.prototype.hasOwnProperty.call(c, o) && c[o] && s.push(c[o][0]),
            c[o] = 0;
        for (n in f)
            Object.prototype.hasOwnProperty.call(f, n) && (e[n] = f[n]);
        for (l && l(t); s.length; )
            s.shift()();
        return a.push.apply(a, i || []),
        r()
    }
    function r() {
        for (var e, t = 0; t < a.length; t++) {
            for (var r = a[t], n = !0, o = 1; o < r.length; o++) {
                var f = r[o];
                0 !== c[f] && (n = !1)
            }
            n && (a.splice(t--, 1),
            e = d(d.s = r[0]))
        }
        return e
    }
    var n = {}
      , o = {
        21: 0
    }
      , c = {
        21: 0
    }
      , a = [];
    function d(t) {
        if (n[t])
            return n[t].exports;
        var r = n[t] = {
            i: t,
            l: !1,
            exports: {}
        };
        return e[t].call(r.exports, r, r.exports, d),
        r.l = !0,
        r.exports
    }
    d.e = function(e) {
        var t = [];
        o[e] ? t.push(o[e]) : 0 !== o[e] && {
            1: 1,
            10: 1,
            11: 1,
            12: 1,
            14: 1,
            15: 1,
            17: 1
        }[e] && t.push(o[e] = new Promise((function(t, r) {
            for (var n = "static/css/" + ({
                7: "AccountCenter",
                8: "Activity",
                9: "BestGoods",
                10: "Cart",
                11: "GoodsDetail",
                12: "GoodsDropShipping",
                13: "Home",
                14: "Mall",
                15: "MallSearch",
                16: "NotFound",
                17: "Order",
                18: "Payment",
                19: "Search"
            }[e] || e) + "." + {
                0: "31d6cfe0d",
                1: "1bb732cb7",
                2: "31d6cfe0d",
                3: "31d6cfe0d",
                4: "31d6cfe0d",
                5: "31d6cfe0d",
                6: "31d6cfe0d",
                7: "31d6cfe0d",
                8: "31d6cfe0d",
                9: "31d6cfe0d",
                10: "86909bf59",
                11: "1405928aa",
                12: "9eff41d5d",
                13: "31d6cfe0d",
                14: "941e90c52",
                15: "86909bf59",
                16: "31d6cfe0d",
                17: "07dca30ce",
                18: "31d6cfe0d",
                19: "31d6cfe0d",
                23: "31d6cfe0d",
                24: "31d6cfe0d",
                25: "31d6cfe0d",
                26: "31d6cfe0d",
                27: "31d6cfe0d",
                28: "31d6cfe0d",
                29: "31d6cfe0d",
                30: "31d6cfe0d"
            }[e] + ".chunk.css", o = d.p + n, c = document.getElementsByTagName("link"), a = 0; a < c.length; a++) {
                var f = (u = c[a]).getAttribute("data-href") || u.getAttribute("href");
                if ("stylesheet" === u.rel && (f === n || f === o))
                    return t()
            }
            var i = document.getElementsByTagName("style");
            for (a = 0; a < i.length; a++) {
                var u;
                if ((f = (u = i[a]).getAttribute("data-href")) === n || f === o)
                    return t()
            }
            var l = document.createElement("link");
            l.rel = "stylesheet",
            l.type = "text/css",
            l.onload = t,
            l.onerror = function(t) {
                var n = t && t.target && t.target.src || o
                  , c = new Error("Loading CSS chunk " + e + " failed.\n(" + n + ")");
                c.request = n,
                r(c)
            }
            ,
            l.href = o,
            document.getElementsByTagName("head")[0].appendChild(l)
        }
        )).then((function() {
            o[e] = 0
        }
        )));
        var r = c[e];
        if (0 !== r)
            if (r)
                t.push(r[2]);
            else {
                var n = new Promise((function(t, n) {
                    r = c[e] = [t, n]
                }
                ));
                t.push(r[2] = n);
                var a, f = document.createElement("script");
                f.charset = "utf-8",
                f.timeout = 120,
                d.nc && f.setAttribute("nonce", d.nc),
                f.src = function(e) {
                    return d.p + "static/js/" + ({
                        7: "AccountCenter",
                        8: "Activity",
                        9: "BestGoods",
                        10: "Cart",
                        11: "GoodsDetail",
                        12: "GoodsDropShipping",
                        13: "Home",
                        14: "Mall",
                        15: "MallSearch",
                        16: "NotFound",
                        17: "Order",
                        18: "Payment",
                        19: "Search"
                    }[e] || e) + "." + {
                        0: "f10cbb13",
                        1: "1f11793f",
                        2: "377e6d6e",
                        3: "35ce66b2",
                        4: "067dc63d",
                        5: "faf75b50",
                        6: "c87ff2b9",
                        7: "5a36fa8d",
                        8: "3e335bc4",
                        9: "419b7116",
                        10: "3088d3ab",
                        11: "39a585d4",
                        12: "d07a6c4a",
                        13: "20c6d848",
                        14: "30a72180",
                        15: "53f0e801",
                        16: "bd04a08e",
                        17: "319b16be",
                        18: "135c3c2b",
                        19: "66b54e82",
                        23: "c46b72b3",
                        24: "bcfa92ac",
                        25: "dbb47e8b",
                        26: "8b9ca1c3",
                        27: "1e9746e3",
                        28: "73b775ab",
                        29: "c13c09f3",
                        30: "ca572efb"
                    }[e] + ".chunk.js"
                }(e);
                var i = new Error;
                a = function(t) {
                    f.onerror = f.onload = null,
                    clearTimeout(u);
                    var r = c[e];
                    if (0 !== r) {
                        if (r) {
                            var n = t && ("load" === t.type ? "missing" : t.type)
                              , o = t && t.target && t.target.src;
                            i.message = "Loading chunk " + e + " failed.\n(" + n + ": " + o + ")",
                            i.name = "ChunkLoadError",
                            i.type = n,
                            i.request = o,
                            r[1](i)
                        }
                        c[e] = void 0
                    }
                }
                ;
                var u = setTimeout((function() {
                    a({
                        type: "timeout",
                        target: f
                    })
                }
                ), 12e4);
                f.onerror = f.onload = a,
                document.head.appendChild(f)
            }
        return Promise.all(t)
    }
    ,
    d.m = e,
    d.c = n,
    d.d = function(e, t, r) {
        d.o(e, t) || Object.defineProperty(e, t, {
            enumerable: !0,
            get: r
        })
    }
    ,
    d.r = function(e) {
        "undefined" !== typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {
            value: "Module"
        }),
        Object.defineProperty(e, "__esModule", {
            value: !0
        })
    }
    ,
    d.t = function(e, t) {
        if (1 & t && (e = d(e)),
        8 & t)
            return e;
        if (4 & t && "object" === typeof e && e && e.__esModule)
            return e;
        var r = Object.create(null);
        if (d.r(r),
        Object.defineProperty(r, "default", {
            enumerable: !0,
            value: e
        }),
        2 & t && "string" != typeof e)
            for (var n in e)
                d.d(r, n, function(t) {
                    return e[t]
                }
                .bind(null, n));
        return r
    }
    ,
    d.n = function(e) {
        var t = e && e.__esModule ? function() {
            return e.default
        }
        : function() {
            return e
        }
        ;
        return d.d(t, "a", t),
        t
    }
    ,
    d.o = function(e, t) {
        return Object.prototype.hasOwnProperty.call(e, t)
    }
    ,
    d.p = "https://mms-static.pddpic.com/wholesale/",
    d.oe = function(e) {
        throw console.error(e),
        e
    }
    ;
    var f = window.webpackJsonp = window.webpackJsonp || []
      , i = f.push.bind(f);
    f.push = t,
    f = f.slice();
    for (var u = 0; u < f.length; u++)
        t(f[u]);
    var l = i;
    r()
}([]);

如果加载器函数与执行对象在一个文件中的Webpack就会比较好扣,首先,在函数内找到模块加载器的特征位置,代码如下所示:

function d(t) {
    if (n[t])
        return n[t].exports;
    var r = n[t] = {
        i: t,
        l: !1,
        exports: {}
    };
    return e[t].call(r.exports, r, r.exports, d),
    r.l = !0,
    r.exports
}

上面这个t传入的可以是索引和对象的key,参数表示的是列表或对象的形参,接下来需要把目标扣出来,自执行函数只是其中的一步,传入的t才是关键,如下跳转:

在这里插入图片描述

直接把所有调用模块导出来,放到自执行的[]内,如下所示:

在这里插入图片描述

最后我们将算法的调用集成到Python程序中测试一下效果,如下:

在这里插入图片描述

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

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

相关文章

Java(今天偷懒一丢丢

今天学了一点点io流 基本概念 输入流&#xff08;InputStream&#xff09;&#xff1a;用于从数据源读取数据。输出流&#xff08;OutputStream&#xff09;&#xff1a;用于向目标写入数据。 分类 按功能分类 字节流&#xff1a;处理字节数据&#xff0c;如 InputStream 和…

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…

韩顺平 | 零基础快速学Python(12) OOP基础

面向对象编程-基础 类与对象 类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象类型&#xff0c;从而能够创建该类型的新实例/对象。 类时抽象的概念&#xff0c;作为数据类型代表一类事物&#xff1b;对象时具体实际的&#xff0c;作为实例代表具体事物&…

【c语言】atoi函数---使用和模拟实现(详解)

atoi函数---使用和模拟实现 atoi函数在Cplusplus中的定义 atoi函数的使用 #include <stdio.h> #include <stdlib.h>int main() {char arr[20] "4831213";int ret 0;ret atoi(arr);printf("arr:%s\n", arr);printf("ret:%d\n", re…

JWT重放漏洞如何攻防?你的系统安全吗?

大家好&#xff0c;我是石头~ 在数字化浪潮席卷全球的今天&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为身份验证的利器&#xff0c;已成为众多Web应用的首选方案。 然而&#xff0c;正如硬币有两面&#xff0c;JWT的强大功能背后也隐藏着潜在的安全风险&#xf…

手把手教你如何下载学浪上的视频课程

学浪直播课程下载技术尚未攻克&#xff0c;但视频课程下载却易如反掌。 1.首先解压好我给大家准备好的压缩包 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V10的分享 2.首先解压我…

OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建&#xff0c;经过前面的实践&#xff0c;再来看编译构建。 编译构建概述 在官网中提到了&#xff0c;OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能…

数据采集仪:自动化监测系统的核心组件

在当代的工业自动化领域&#xff0c;数据采集仪成为了一个关键的技术工具&#xff0c;它不仅仅是简单地将电信号转化为数据信号&#xff0c;而是能够实时、有效地处理和显示各种信号&#xff0c;确保整个监测系统的稳定、高效运行。 点击输入图片描述&#xff08;最多30字&…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”&#xff0c;子网掩码为“255.255.255.128”&#xff0c;网关为“192.168.班内学号.1”&#xff1b;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

JWT详解及实战教程

目录 1.什么是JWT 2.JWT能做什么 3.为什么是JWT 基于传统的Session认证 基于JWT认证 4.JWT的结构是什么? 5.使用JWT 6.封装工具类 7.整合springboot 1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;&#xff0c;然后在文本元素中使用clear属性来清除浮动&#xff0c;以确保文字不会覆盖图片。另外&am…

python爬虫-------urllib代理和代理池(第十七天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

介绍一个方便的python包和环境管理软件Anaconda,如何快速安装

为什么要安装Ananconda&#xff1f; Anaconda是一个方便的python包管理和环境管理软件&#xff0c;一般用来配置不同的项目环境。它通过管理工具包、开发环境、Python版本&#xff0c;大大简化了工作流程。不仅可以方便地安装、更新、卸载工具包&#xff0c;而且安装时能自动安…

SpringBoot 微服务token 传递实现

1、前言 随着微服务的流行&#xff0c;微服务之间的安全以及业务需要&#xff0c;都需要穿递token &#xff0c;而token的传递一般通过header 头来传递。从架构的角度来讲 &#xff0c;一般的企业应用都由nginx、业务网关和各个微服务组成。这个nginx 传递header 我就不讲述。下…

伪装目标检测论文阅读之:《Confidence-Aware Learning for Camouflaged Object Detection》

论文地址&#xff1a;link code:link 摘要&#xff1a;   任意不确定性捕获了观测结果中的噪声。对于伪装目标检测&#xff0c;由于伪装前景和背景的外观相似&#xff0c;很难获得高精度的注释&#xff0c;特别是目标边界周围的注释。我们认为直接使用“嘈杂”的伪装图进行训…

分布式系统接口限流方案

Git地址&#xff1a;https://gitee.com/deepjava/test-api-limit.git 方案一、 Guava工具包 实现单机版限流 具体代码见git 方案二、Redis lua脚本 实现分布式系统的接口限流 具体代码见git

计算机视觉——引导APSF和梯度自适应卷积增强夜间雾霾图像的可见性算法与模型部署(C++/python)

摘要 在夜间雾霾场景中&#xff0c;可见性经常受到低光照、强烈光晕、光散射以及多色光源等多种因素的影响而降低。现有的夜间除雾方法常常难以处理光晕或低光照条件&#xff0c;导致视觉效果过暗或光晕效应无法被有效抑制。本文通过抑制光晕和增强低光区域来提升单张夜间雾霾…

Fiddle配置代理,保手机模拟器访问外部网络

前言&#xff1a; 嘿&#xff01;大家好&#xff01;我来带你们玩转Fiddler和Mumu模拟器的组合技了&#xff01;此组合技能帮助你实现在模拟器上畅游外部网络。相信我&#xff0c;它会让你的开发和测试过程更加轻松愉快&#xff01;废话不多说&#xff0c;赶紧展开我们的冒险吧…

家庭网络防御系统搭建-siem之security onion 安装配置过程详解

本文介绍一下security onion的安装流程&#xff0c;将使用该工具集中管理终端EDR和网络NDR sensor产生的日志。 充当SIEM的平台有很多&#xff0c;比如可以直接使用原生的elastic以及splunk等&#xff0c;security onion的优势在于该平台能够方便的集成网络侧&#xff08;比如…

秋云uCharts 高性能跨平台图表库,支持H5、APP、小程序、Vue、Taro等更多支持canvas的框架平台

秋云uCharts 高性能跨平台图表库&#xff0c;支持H5、APP、小程序、Vue、Taro等更多支持canvas的框架平台 一、引言 随着移动互联网的快速发展&#xff0c;跨平台开发的需求日益增长。为了满足这一需求&#xff0c;许多开发者致力于开发能够在多个平台上运行的应用程序。然而&…