最详细的拼多多anti-token||anti_content算法分析过程(一)

文章目录

  • 前言
  • 一、正文开始
    • 1.寻找包含anti-token参数的文件
    • 2.寻找文件中设置anti-token参数的位置
    • 3.js调试查看参数在哪里生成


前言

很多写爬虫的小伙伴在这个参数上犯愁了,像我自己常用的python来说,虽然有selenium去操作浏览器,但是效率和问题都比较多,用接口的方式也方便些,所以出几节关于这个参数的js解密文章,希望帮到小伙伴们


提示:文章仅供学习,请遵纪守法,做一个好市民!

一、正文开始

今天来分析下anti-token参数,首先打开拼多多的拼多多优惠券页面,那其他的页面也会有设置anti_content参数header也是可以的==>>拼多多优惠券地址<<==,这里的话可以看到,页面请求当中,给header中添加了anti-token参数并且设置了对应的加密字符串,我们可以在这里作为切入点进行参数的分析

最详细的拼多多anti-token||anti_content算法分析过程(一)_第1张图片

1.寻找包含anti-token参数的文件

打开浏览的的网络=>点击这里的搜索图标=>输入关键词anti_token
最详细的拼多多anti-token||anti_content算法分析过程(一)_第2张图片
可以看到这里有一个react_coupons的js文件,说明这个文件中可能有给这个请求头中添加了对应的加密字符串。

2.寻找文件中设置anti-token参数的位置

在知道参数出现文件后,我们就需要去找可能赋值的位置,那么我们也需要进行个断点调试,我们现在需要在来源中把对应的js文件找到,然后格式化以及搜索anti-token被赋值的位置
最详细的拼多多anti-token||anti_content算法分析过程(一)_第3张图片
最详细的拼多多anti-token||anti_content算法分析过程(一)_第4张图片
最详细的拼多多anti-token||anti_content算法分析过程(一)_第5张图片
最详细的拼多多anti-token||anti_content算法分析过程(一)_第6张图片

3.js调试查看参数在哪里生成

通过打短点,我们知道这个m.getAntiContent()是一个promise异步函数,且状态为pending的等待状态,所以我们需要跟进函数里面查看详细逻辑调用情况。最详细的拼多多anti-token||anti_content算法分析过程(一)_第7张图片
在这里开始生成promise异步函数
最详细的拼多多anti-token||anti_content算法分析过程(一)_第8张图片
最终定位在这个代码位置,也就是react_anti的参数
最详细的拼多多anti-token||anti_content算法分析过程(一)_第9张图片

function Vt() {
                    var t, n = f, r = {};
                    r[n("0x156", "j6Rk")] = function(t) {
                        return t()
                    }
                    ,
                    r[n("0x11", "iqO&")] = n("0x1e", "anZ%"),
                    r[n("0x12e", "J)bp")] = function(t) {
                        return t()
                    }
                    ,
                    r[n("0x1", "#hpG")] = function(t, n, r) {
                        return t(n, r)
                    }
                    ,
                    r[n("0x4", "Cu&R")] = function(t, n) {
                        return t < n
                    }
                    ,
                    r[n("0xa", "Dm1H")] = n("0x39", "Dm1H"),
                    r[n("0x54", "fGLK")] = function(t, n) {
                        return t === n
                    }
                    ,
                    r[n("0x100", "HZS0")] = function(t, n) {
                        return t > n
                    }
                    ,
                    r[n("0xd8", "0Xnq")] = function(t, n) {
                        return t <= n
                    }
                    ,
                    r[n("0x2c", "0Xnq")] = function(t, n) {
                        return t - n
                    }
                    ,
                    r[n("0x92", "z@XA")] = function(t, n) {
                        return t << n
                    }
                    ,
                    r[n("0x75", "5QnQ")] = function(t, n) {
                        return t > n
                    }
                    ,
                    r[n("0x149", "dmn8")] = function(t, n) {
                        return t - n
                    }
                    ,
                    r[n("0xc5", "bpr9")] = function(t, n) {
                        return t << n
                    }
                    ,
                    r[n("0x37", "GmkI")] = n("0x164", "wFxG"),
                    r[n("0xfb", ")!%7")] = function(t, n) {
                        return t + n
                    }
                    ,
                    r[n("0xe5", ")!%7")] = n("0x76", "Vta9"),
                    r[n("0x140", "oemU")] = n("0x103", "Iaxw");
                    var e = r;
                    if (!rt)
                        return "";
                    var o = e[n("0x141", "5^JL")]
                      , a = (t = [])[A].apply(t, [ct ? [][A](e[n("0x10a", "5QnQ")](Kt), lt[o]()) : d[o](), ht[o](), kt[o](), vt[o](), mt[o](), _t[o](), pt[o](), bt[o](), Ct[o](), gt[o](), St[o]()].concat(function(t) {
                        if (Array.isArray(t)) {
                            for (var n = 0, r = Array(t.length); n < t.length; n++)
                                r[n] = t[n];
                            return r
                        }
                        return Array.from(t)
                    }(wt[o]()), [yt[o](), Rt[o](), Gt[o](), Pt[o](), qt[o](), Ot[o]()]));
                    e[n("0x7c", "Dm1H")](setTimeout, (function() {
                        e[n("0x121", "HZS0")](Dt)
                    }
                    ), 0);
                    for (var u = a[I][p](2)[k](""), W = 0; e[n("0x60", "%LaC")](u[I], 16); W += 1)
                        u[e[n("0x88", "wFxG")]]("0");
                    u = u[l]("");
                    var x = [];
                    e[n("0x111", "#hpG")](a[I], 0) ? x[M](0, 0) : e[n("0x16", "Mju&")](a[I], 0) && e[n("0x11c", "^o[d")](a[I], e[n("0x66", "Hv26")](e[n("0x119", "(odD")](1, 8), 1)) ? x[M](0, a[I]) : e[n("0xc3", "GmkI")](a[I], e[n("0x30", "Iaxw")](e[n("0xed", "DxB8")](1, 8), 1)) && x[M](rt[b](u[R](0, 8), 2), rt[b](u[R](8, 16), 2)),
                    a = [][A]([3], [1, 0, 0], x, a);
                    var s = i[e[n("0xcf", "(5GC")]](a)
                      , h = [][_][n("0x6c", "oemU")](s, (function(t) {
                        return String[y](t)
                    }
                    ));
                    return e[n("0xd3", "[xh1")](e[n("0x85", "5^JL")], c[e[n("0x155", "uYFB")]](e[n("0x10c", "GmkI")](h[l](""), tt[l]("")), c[n("0x91", "ho[k")]))
                }

这个Vt()函数的return就是返回了anti-token的参数值,这个Vt函数里面的绿色的字符都是做了混淆,下图的红色剪头其实就是给r这个对象赋值了功能(函数),不用管他
最详细的拼多多anti-token||anti_content算法分析过程(一)_第10张图片
具体的生成逻辑在下图红色方框中
最详细的拼多多anti-token||anti_content算法分析过程(一)_第11张图片
红色方框中才是整体的参数形成重要代码块

[A].apply(t, [ct ? [][A](e[n("0x10a", "5QnQ")](Kt), lt[o]()) : d[o](), ht[o](), kt[o](), vt[o](), mt[o](), _t[o](), pt[o](), bt[o](), Ct[o](), gt[o](), St[o]()

//
wt[o]()), [yt[o](), Rt[o](), Gt[o](), Pt[o](), qt[o](), Ot[o]()])

以上的函数当中其实就是在js文件加载的时候,传入了鼠标点击位置,当前url,当前访问cookie,当前ua等信息,通过生成数组并且合并转换编码得到参数值,下篇文章将会带领大家调试具体的函数生成过程。

在调试以及分析中有问题可以加群互相讨论技术
点击链接加入群聊:脚本&爬虫&web技术讨论

你可能感兴趣的:(JavaScript,js调试,算法,python,爬虫)