〖Python網絡爬蟲實戰?〗- 極驗滑塊介紹(四)

  • 訂閱:新手可以訂閱我的其他專欄。免費階段訂閱量1000+
  • python項目實戰

    Python編程基礎教程系列(零基礎小白搬磚逆襲)

  • 說明:本專欄持續更新中,訂閱本專欄前必讀關于專欄〖Python網絡爬蟲實戰〗轉為付費專欄的訂閱說明
  • 作者:愛吃餅干的小白鼠。Python領域優質創作者,2022年度博客新星top100入圍,榮獲多家平臺專家稱號。

?最近更新

〖Python網絡爬蟲實戰?〗- 極驗滑塊介紹(三)

極驗驗證碼

目前,許多網站采取各種各樣的措施來反爬蟲,其中一個措施便是使用驗證碼。隨著技術的發展,驗證碼的花樣越來越多。驗證碼最初是幾個數字組合的簡單的圖形驗證碼,后來加入了英文字母和混淆曲線。有的網站還可能看到中文字符的驗證碼,這使得識別愈發困難。我們今天來介紹極驗驗證碼。

前言

我們上一篇和大家介紹了怎么去計算滑塊的距離,以及滑塊軌跡的模擬,今天,我們就來說說最重要的知識點,就是,3個w是怎么生成的,我們之前說前兩個是不可以置空的,3個W的值思路都差不多。接下來,直接看介紹,我這時逆向是兩個重要文件名是:

fullpage.9.1.8-bfget5.jsslide.7.9.2.js

極驗后面會更新,如果代碼失效了,在評論區評論,我也會及時更新。?

第一個W

不清楚流程的可以回顧一下,我發的極驗一的文章,我們來逆向這里的w,我們之前說,全局搜索w,肯定不現實啊,我這里就教大家一個簡單的方法,直接搜索"\u0077",這個最簡單,大家還可以去跟棧,也能找到。

我們看到有三處,我們一處一處來定位,我們來看第一處,一看就不是。

我們下面看第二處,一看,感覺有點像,打個斷點,刷新下網頁,發現就斷點了,同理,第三處,沒有斷點,就也排除了。我們重點來分析第二處的w。

var r = t[$_CEFDY(1196)](),o = $_BEH()[$_CEFCV(1127)](fe[$_CEFDY(431)](t[$_CEFCV(370)]), t[$_CEFDY(1143)]()) ,i = R[$_CEFDY(1197)](o)w = i + r

我們基本的框架就拿到了,接下來就是分別去扣這些代碼,這里的r是隨機的,網上有人說這是什么什么加密,用自己的方法來寫,我這里什么都不管,要什么補什么。

r 的值

這里的r,我會說詳細一點,后面都是一樣的,我就直接帶過了。我們先看看這個值是什么。

我們看到這里的值是256位,我們通過js模擬生成的值也是256位就說明我們代碼沒有問題。我們開始扣代碼,我們定位進去之后,可以看到這樣的代碼,你們可能變量名不一樣,但是,加密都是一樣的。

我們可以看出來,這個t的值就是我們r的值,我們把這行代碼扣出來,是這樣的。

var r = new G()[$_CGHDO(93)](this[$_CGHDO(1143)](e))

我們看到里面的參數是隨機數,我們同樣的方法定位到里面去,我們上面的代碼可以改為:

//Ot = rt()//先注釋掉Ot = 'a9346ff09bcf3a83'
var r = new G()['encrypt'](Ot)

我們思路就清晰了,扣生成隨機數rt()的代碼,還有去扣G()的代碼。這里,直接定位,全部扣下來就可以了,我這里放幾張代碼位置的圖片。

我們這里的隨機值可以寫死,不影響我們后面的加密,這里的隨機值就相當于密鑰。

這里不夠直觀,我們在第三個w的時候會直觀一點。我們還要把最前的屬性函數也要扣下來,就是下面這一塊。

另外兩個w也是一樣的,寧愿多扣也不要少摳代碼。我們看看自己生成的r是不是256位。

到這里,我們的r的值就生成了,這里的G函數代碼很長,一定要完整扣下來,第三個w也可以用這個生成,只是函數名不一樣。到這里,沒有問題的話,我們就扣下一個值。

o的值

我們接下來,就去扣這個o的值,我們先看看源代碼怎么寫的。

 o = $_BEH()[$_CEFCV(1127)](fe[$_CEFDY(431)](t[$_CEFCV(370)]), t[$_CEFDY(1143)]())

我們看到這里就很明確了,我們把剛剛的o的值簡單修改一下,是這樣的。

 o = $_BEH()['encrypt1'](fe['stringify'](t[$_CEFCV(370)]), Ot)

我這里簡單解釋一下,t[$_CEFDY(1143)]()我們發現實際上就是我們剛剛生成的隨機數,這里,傳入的兩個隨機數要一致,所以前面我們為什么要寫成

Ot = rt()

這個rt()函數我們后面會講到,這里先寫固定值,fe['stringify']大概率就是json數據格式化,這個我們可以用現成的方法JSON.parse,我們這里還是直接扣代碼,t[$_CEFCV(370)]我們發現這個對象包含了我們的gt和challenge的值。接下來,就是摳代碼:

  1. $_BEH()函數,//后面的w也用到了這個函數,只是函數名字不一樣。
  2. fe函數,//后面的w也用到了這個函數,只是函數名字不一樣。
  3. t[$_CEFCV(370)]?的值扣下來,現在,先把gt和challenge的值固定

這三個部分很容易就拿到了,我這里給大家看下截圖:

我們這里把這個對面命名位nt,大概有一下內容,這里的gt和challenge先固定,等我們代碼沒有問題,再把gt和challenge的值傳進來。

{"gt": "019924a82c70bb123aae90d483087f94","challenge": "7178a48de3923230de74008295402041","offline": false,"new_captcha": true,"product": "float","width": "300px","https": true,"api_server": "apiv6.geetest.com","protocol": "https://","type": "fullpage","static_servers": ["static.geetest.com/","static.geevisit.com/"],"beeline": "/static/js/beeline.1.0.1.js","voice": "/static/js/voice.1.2.4.js","click": "/static/js/click.3.1.0.js","fullpage": "/static/js/fullpage.9.1.8-bfget5.js","slide": "/static/js/slide.7.9.2.js","geetest": "/static/js/geetest.6.0.9.js","aspect_radio": {"slide": 103,"click": 128,"voice": 128,"beeline": 50},"cc": 4,"ww": true,"i": "-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1!!-1"
}

我們看看扣完的效果,如果,這里的o是一樣的,我們代碼就沒有問題了。

我們可以看到我們的o的值和網頁生成的一模一樣,我們接下來就是去搞i的值。

i的值

我們接下來,就去扣這個i 的值,我們先看看源代碼怎么寫的。

i = R[$_CEFDY(1197)](o)

我們發現這個特別簡單,我們老規矩,先看看$_CEFDY(1197)是什么,我們在簡單修改一下。

i = R['$_HDZ'](o)

我們發現o,我們得到了,現在就是去拿這個R()函數,這個,我們直接給大家了。很好找的。

我們把這個R拿下來,因為太長了,我就不貼代碼了,大家自己去扣,我們看看最后的效果。

我們看到這里的i,我們也生成出來了,最后的w肯定也沒有問題。

w的值

我們知道第一個w是i + r,到這里,我們第一個w就解決了,我們來看看效果,你有什么問題可以在評論區留言。

第二個W

w的值

我們這里的w和其他地方不大一樣,不過通過跟棧的方式也很容易找到,如下圖所示:

我們定位到了w的位置,我們接下來就是仔細分析分別用了哪些加密方法。

W2 =  R[$_CFHIs(1197)](c[$_CFHIs(93)](r, i[$_CFHIs(1143)]()));

我們這里簡單修改下代碼,現在是這個樣子的。

 w2 = R['$_HDZ'](c['encrypt'](r,Ot));

我們發現這個w2要簡單一點,前面的R()函數,我們之前就拿到了,我們這里直接就用了,后面的Ot就是我們之前生成的隨機數,這里要和前面生成w1的時候要一樣,不然會報錯。我們這里的c['encrypt'](r,Ot)實際上就是我們前面的$_BEH()['encrypt'](r, Ot).到這里,問題就簡單了。

 w2 = R['$_HDZ']($_BEH()['encrypt'](r,Ot));

我們接下來,就是去看這個r是什么。

我們這里直接復制出來,大家可以自己往前找,能找到每個參數怎么生成的。我這里主要來說rp參數是怎么生成的,因為這個還是比較重要的,其他的可以寫固定。

nr = {"lang": "zh-cn","type": "fullpage","tt": "M3*8Pjp8Pj9HbUp8PN9U),,:A(,(5(,(m-BJBFB:bgfA9/1O6*:I:JkNjRj31RkK**2KDRjE1S0OMM9*)-2.k6h)).E-:-)-9-:(:5b9-:1Mal2UK1RjY1I****)*:F3)pM0/JBBBA(((((,((iB9(((((,(5bn)BBBo95(,(qcjc*)R)fM2*QWU3cUA.N9?-G5N(:(?-N6,B1-2OUS_M9b?M:(A-)19d_cUS/BTF@AfC*Mf5?M95U-)1E1*OE(mj@.NQJ2@(g5@Acb?T)0N5u9khbE6,:CX)*E/B5-*Mb*)ME-((((M(((((((Lqqqp(Df((((((bb55,55(5((,((n-.(--88e(qR@).?2WE-Q(c19M9-)M919/)MM/)(P-U-(/)M*/.M*-)4)M@-N9d5Y-,-d(?b9/,M1AB9*nF)2(J*Df*M9/)MfN9*)(UU(0)(N1I-*b9/)(0qqM)qqp(-n","light": "SPAN_0","s": "c7c3e21112fe4f741921cb3e4ff9f7cb","h": "321f9af1e098233dbd03f250fd2b5e21","hh": "39bd9cad9e425c3a8f51610fd506e3b3","hi": "09eb21b3ae9542a9bc1e8b63b3d9a467","vip_order": -1,"ct": -1,"ep": {"v": "9.1.8-bfget5","$_E_": false,"me": true,"ven": "Google Inc. (Intel)","ren": "ANGLE (Intel, Intel(R) HD Graphics 520 Direct3D11 vs_5_0 ps_5_0, D3D11)","fp": ["move", 483, 149, 1702019849214, "pointermove"],"lp": ["up", 657, 100, 1702019852230, "pointerup"],"em": {"ph": 0, "cp": 0, "ek": "11", "wd": 1, "nt": 0, "si": 0, "sc": 0},"tm": {"a": 1702019845759,"b": 1702019845951,"c": 1702019845951,"d": 0,"e": 0,"f": 1702019845763,"g": 1702019845785,"h": 1702019845785,"i": 1702019845785,"j": 1702019845845,"k": 1702019845812,"l": 1702019845845,"m": 1702019845942,"n": 1702019845946,"o": 1702019845954,"p": 1702019846282,"q": 1702019846282,"r": 1702019846287,"s": 1702019846288,"t": 1702019846288,"u": 1702019846288},"dnf": "dnf","by": 0},"passtime": 5365,"rp": "0d51406b2c658811294a91e9ea533bed","captcha_token": "541381339","gdyf": "kqy8o0w7"
}

其中?ep?里面的?venren?是顯卡相關信息,fplp?是取了兩個鼠標移動的位置信息,直接寫死為?null?也可以,tm?就是?window.performance.timing?的一些東西,自己隨便偽造一下就行了,或者固定不改都行。

我們這里要注意下,r參數還要JSON數據格式,我們直接模仿前面的寫法就可以。

 nr = {"自行復制"}w2 = R['$_HDZ']($_BEH()['encrypt'](fe['stringify'](nr), Ot))

我們來看看效果:

我們這里要注意一下,那個Ot的值用網頁生成的隨機數,這樣可以驗證我們扣的代碼對不對,后面,我們自己在調用的時候可以寫隨機。?

rp的值

我們這里先把這個rp參數摳出來,第三個生成w的時候,也用到了rp,加密方式都是一樣的。

我在圖片里面標注很清楚了,這個是MD5加密,我們直接用現成的庫,不會安裝的,自行百度。唯一要注意的一點是這里的pass time的值要和r參數里面的pass time要一樣,這個pass time可以寫固定,第三個w就要傳值進來。

 var CryptoJS = require("crypto-js");gtt = '019924a82c70bb123aae90d483087f94'challenge = '7d59427b8c64734df3d8aa8585311fac'var rp = CryptoJS.MD5(gtt + challenge + 1986).toString()

我們到這里,就成功實現了兩個w的模擬生成,這時候,我們可以把我們剛剛寫的封裝成函數,把challenge傳進來就可以了。gt每個網頁的值不一樣,相當于產品的ID,由于,我們在拿這個網站在做測試,我們就不去改這個了,還有就是把r參數里面的rp傳進去。

第三個W

我們到這里,就成功80%了,因為這個w的思路和第一個差不多。我們先定位位置,和前面一樣。

我們這時是不是感覺似曾相識,這個就是和第一次一模一樣。

            var u = r[$_CAHJS(737)](), l = V[$_CAHJS(392)](gt[$_CAIAK(254)](o), r[$_CAIAK(744)]()),h = m[$_CAIAK(792)](l)w3 = h + u

我們基本的框架就拿到了,接下來就是分別去扣這些代碼,這里的r是隨機的,網上有人說這是什么什么加密,用自己的方法來寫,我這里什么都不管,要什么補什么。

u?的值

我們定位到里面去,加密方式一樣的,這里用的參數是U,我們這里直接用之前的方法來加密,這里同樣會有個隨機數,前面說,這里會教大家扣這個rt(),我們肯定先在這里斷點,定位到這個隨機函數。

    Ot = rt()var u = new U()['encrypt'](Ot)

我們這里rt()自己去扣,U用之前的就可以了。

l的值

我們接下來,就去扣這個l 的值,我們先看看源代碼怎么寫的。

l = V[$_CAHJS(392)](gt[$_CAIAK(254)](o), r[$_CAIAK(744)]())

 l = V['encrypt'](gt['stringify'](o), Ot)

o的值(含軌跡aa加密)

我們這里和前面一樣,V可以自己扣,也可以用前面的,我們接下來看看這個o是啥。里面包含了我們的軌跡等等。

{"lang": "zh-cn","userresponse": "6c4667a3","passtime": 467,"imgload": 367,"aa": "P(!!Rssstostsztstszztuyststsbtttsststsz(!!(YE81:111911111111111111102020:8QR$)UD","ep": {"v": "7.9.2","$_BIE": false,"me": true,"tm": {"a": 1702023452190,"b": 1702023452440,"c": 1702023452441,"d": 0,"e": 0,"f": 1702023452194,"g": 1702023452194,"h": 1702023452194,"i": 1702023452194,"j": 1702023452194,"k": 0,"l": 1702023452240,"m": 1702023452389,"n": 1702023452420,"o": 1702023452445,"p": 1702023452671,"q": 1702023452671,"r": 1702023452676,"s": 1702023452677,"t": 1702023452677,"u": 1702023452677},"td": -1},"h9s9": "1816378497","rp": "b121b8e4e23b32bc6da9ef189266267e"
}

可以看到o對象里面有眾多參數

  • aa 是軌跡加密
  • ep?h9s9 imgload?lang?可固定
  • userresponse?滑動距離 + challenge 加密結果
  • passtime?拖動時間
  • rp 是?gt +challenge + passtime 加密結果

我們主要就是自己生成user response,aa,rp。rp就是我們第二個W說到的rp,我們可以用那個代碼。

 var CryptoJS = require("crypto-js");gtt = '019924a82c70bb123aae90d483087f94'challenge = '7d59427b8c64734df3d8aa8585311fac'var rp = CryptoJS.MD5(gtt + challenge + 476).toString()

我們在l的地方,往上面翻一點點,可以看到o對象生成的地方,我們在user response地方斷點。

這個H函數自己去扣,傳進來了兩個參數,一個是距離,還有一個是最新的challenge,我第一篇文章說到過,我們會拿到新的challenge和S的值。

var userresponse = H(t, i[$_CAHJe(172)])//t為移動的距離,i[$_CAHJe(172)]為最新的challenge

這兩個參數我們先寫固定,我們后期在封裝成函數的時候,可以傳參進來。

接下來就是aa了,我們這里看到這里是把e的值傳給了aa,我們往前跟棧,看看看到什么內容。

l = n[$_DAAAU(985)][$_CJJJU(1075)](n[$_CJJJU(985)][$_CJJJU(1073)](), n[$_CJJJU(67)][$_CJJJU(1033)], n[$_DAAAU(67)][$_CJJJU(345)]);

我們簡單修改一下,效果是這樣的,這里aa要修改函數名,不然報錯n未定義。我這里直接給大家源碼了。

function ct(t) {var $_DBECd = _tkts.$_Dm()[0][10];for (; $_DBECd !== _tkts.$_Dm()[4][9];) {switch ($_DBECd) {case _tkts.$_Dm()[0][10]:this['$_BCAc'] = t || [];$_DBECd = _tkts.$_Dm()[0][9];break;}}}ct['prototype'] = {"\u0024\u005f\u0048\u0042\u004c": function (t) {var $_BFCEN = _tkts.$_Ch, $_BFCDF = ['$_BFCHs'].concat($_BFCEN), $_BFCFG = $_BFCDF[1];$_BFCDF.shift();var $_BFCGC = $_BFCDF[0];return this[$_BFCFG(474)][t];},"\u0024\u005f\u0042\u0043\u0043\u004a": function () {var $_BFCJV = _tkts.$_Ch, $_BFCIv = ['$_BFDCw'].concat($_BFCJV), $_BFDAJ = $_BFCIv[1];$_BFCIv.shift();var $_BFDBc = $_BFCIv[0];return this[$_BFCJV(474)][$_BFCJV(159)];},"\u0024\u005f\u0042\u004a\u0072": function (t, e) {var $_BFDER = _tkts.$_Ch, $_BFDDz = ['$_BFDHL'].concat($_BFDER), $_BFDFf = $_BFDDz[1];$_BFDDz.shift();var $_BFDGb = $_BFDDz[0];return new ct(Q(e) ? this[$_BFDFf(474)][$_BFDFf(195)](t, e) : this[$_BFDER(474)][$_BFDFf(195)](t));},"\u0024\u005f\u0042\u0043\u0044\u0071": function (t) {var $_BFDJE = _tkts.$_Ch, $_BFDIQ = ['$_BFECo'].concat($_BFDJE), $_BFEAL = $_BFDIQ[1];$_BFDIQ.shift();var $_BFEBj = $_BFDIQ[0];return this[$_BFDJE(474)][$_BFEAL(105)](t),this;},"\u0024\u005f\u0042\u0043\u0045\u004e": function (t, e) {var $_BFEEy = _tkts.$_Ch, $_BFEDY = ['$_BFEHH'].concat($_BFEEy), $_BFEFT = $_BFEDY[1];$_BFEDY.shift();var $_BFEGB = $_BFEDY[0];return this[$_BFEEy(474)][$_BFEEy(166)](t, e || 1);},"\u0024\u005f\u0043\u0042\u0058": function (t) {var $_BFEJU = _tkts.$_Ch, $_BFEIW = ['$_BFFCF'].concat($_BFEJU), $_BFFAF = $_BFEIW[1];$_BFEIW.shift();var $_BFFBP = $_BFEIW[0];return this[$_BFFAF(474)][$_BFFAF(415)](t);},"\u0024\u005f\u0042\u0043\u0046\u0061": function (t) {var $_BFFEa = _tkts.$_Ch, $_BFFDU = ['$_BFFHe'].concat($_BFFEa), $_BFFFB = $_BFFDU[1];$_BFFDU.shift();var $_BFFGz = $_BFFDU[0];return new ct(this[$_BFFEa(474)][$_BFFEa(370)](t));},"\u0024\u005f\u0043\u0041\u0064": function (t) {var $_BFFJZ = _tkts.$_Ch, $_BFFIc = ['$_BFGCf'].concat($_BFFJZ), $_BFGAR = $_BFFIc[1];$_BFFIc.shift();var $_BFGBE = $_BFFIc[0];var e = this[$_BFGAR(474)];if (e[$_BFFJZ(423)])return new ct(e[$_BFFJZ(423)](t));for (var n = [], r = 0, i = e[$_BFGAR(159)]; r < i; r += 1)n[r] = t(e[r], r, this);return new ct(n);},"\u0024\u005f\u0042\u0043\u0047\u004a": function (t) {var $_BFGEc = _tkts.$_Ch, $_BFGDu = ['$_BFGHb'].concat($_BFGEc), $_BFGFv = $_BFGDu[1];$_BFGDu.shift();var $_BFGGj = $_BFGDu[0];var e = this[$_BFGEc(474)];if (e[$_BFGFv(475)])return new ct(e[$_BFGEc(475)](t));for (var n = [], r = 0, i = e[$_BFGEc(159)]; r < i; r += 1)t(e[r], r, this) && n[$_BFGEc(105)](e[r]);return new ct(n);},"\u0024\u005f\u0042\u0043\u0048\u0045": function (t) {var $_BFGJj = _tkts.$_Ch, $_BFGIv = ['$_BFHCr'].concat($_BFGJj), $_BFHAP = $_BFGIv[1];$_BFGIv.shift();var $_BFHBX = $_BFGIv[0];var e = this[$_BFHAP(474)];if (e[$_BFGJj(137)])return e[$_BFHAP(137)](t);for (var n = 0, r = e[$_BFGJj(159)]; n < r; n += 1)if (e[n] === t)return n;return -1;},"\u0024\u005f\u0042\u0043\u0049\u0047": function (t) {var $_BFHEm = _tkts.$_Ch, $_BFHDj = ['$_BFHHy'].concat($_BFHEm), $_BFHFA = $_BFHDj[1];$_BFHDj.shift();var $_BFHGc = $_BFHDj[0];var e = this[$_BFHFA(474)];if (!e[$_BFHFA(438)])for (var n = arguments[1], r = 0; r < e[$_BFHFA(159)]; r++)r in e && t[$_BFHEm(375)](n, e[r], r, this);return e[$_BFHEm(438)](t);}},ct['$_BBJT'] = function (t) {var $_BFHJA = _tkts.$_Ch, $_BFHIt = ['$_BFICC'].concat($_BFHJA), $_BFIAk = $_BFHIt[1];$_BFHIt.shift();var $_BFIBn = $_BFHIt[0];return Array[$_BFIAk(473)] ? Array[$_BFHJA(473)](t) : $_BFIAk(463) === Object[$_BFIAk(269)][$_BFIAk(206)][$_BFHJA(375)](t);}function _tkts() {}function W(t) {var $_DBDID = _tkts.$_Dm()[4][10];for (; $_DBDID !== _tkts.$_Dm()[0][9];) {switch ($_DBDID) {case _tkts.$_Dm()[4][10]:this[$_CJEq(302)] = [t];$_DBDID = _tkts.$_Dm()[4][9];break;}}}W['prototype'] = {"\u0024\u005f\u0042\u0042\u0044\u0079": function (t) {var $_BEGEo = _tkts.$_Ch, $_BEGDt = ['$_BEGHI'].concat($_BEGEo), $_BEGFN = $_BEGDt[1];$_BEGDt.shift();var $_BEGGb = $_BEGDt[0];return this[$_BEGEo(302)][$_BEGEo(105)](t),this;},"\u0024\u005f\u0046\u0044\u004c": function (trace) {var $_BEGJp = _tkts.$_Ch, $_BEGIy = ['$_BEHCk'].concat($_BEGJp), $_BEHAJ = $_BEGIy[1];$_BEGIy.shift();var $_BEHBv = $_BEGIy[0];function n(t) {var $_DBEA_ = _tkts.$_Dm()[0][10];for (; $_DBEA_ !== _tkts.$_Dm()[0][9];) {switch ($_DBEA_) {case _tkts.$_Dm()[4][10]:var e = $_BEGJp(454), n = e[$_BEGJp(159)], r = $_BEHAJ(82), i = Math[$_BEHAJ(310)](t), o = parseInt(i / n);n <= o && (o = n - 1),o && (r = e[$_BEGJp(176)](o));var s = $_BEGJp(82);return t < 0 && (s += $_BEGJp(413)),r && (s += $_BEHAJ(445)),s + r + e[$_BEGJp(176)](i %= n);break;}}}var t = function (t) {var $_BEHEL = _tkts.$_Ch, $_BEHDW = ['$_BEHHy'].concat($_BEHEL), $_BEHF_ = $_BEHDW[1];$_BEHDW.shift();var $_BEHGB = $_BEHDW[0];for (var e, n, r, i = [], o = 0, s = 0, a = t[$_BEHEL(159)] - 1; s < a; s++)e = Math[$_BEHF_(187)](t[s + 1][0] - t[s][0]),n = Math[$_BEHF_(187)](t[s + 1][1] - t[s][1]),r = Math[$_BEHEL(187)](t[s + 1][2] - t[s][2]),0 == e && 0 == n && 0 == r || (0 == e && 0 == n ? o += r : (i[$_BEHF_(105)]([e, n, r + o]),o = 0));return 0 !== o && i[$_BEHEL(105)]([e, n, o]),i;}(trace), r = [], i = [], o = [];return new ct(t)[$_BEHAJ(74)](function (t) {var $_BEHJn = _tkts.$_Ch, $_BEHIm = ['$_BEICS'].concat($_BEHJn), $_BEIAd = $_BEHIm[1];$_BEHIm.shift();var $_BEIBp = $_BEHIm[0];var e = function (t) {var $_BEIEZ = _tkts.$_Ch, $_BEIDt = ['$_BEIH_'].concat($_BEIEZ), $_BEIFd = $_BEIDt[1];$_BEIDt.shift();var $_BEIGv = $_BEIDt[0];for (var e = [[1, 0], [2, 0], [1, -1], [1, 1], [0, 1], [0, -1], [3, 0], [2, -1], [2, 1]], n = 0, r = e[$_BEIEZ(159)]; n < r; n++)if (t[0] == e[n][0] && t[1] == e[n][1])return $_BEIFd(441)[n];return 0;}(t);e ? i[$_BEIAd(105)](e) : (r[$_BEIAd(105)](n(t[0])),i[$_BEIAd(105)](n(t[1]))),o[$_BEHJn(105)](n(t[2]));}),r[$_BEGJp(415)]($_BEHAJ(82)) + $_BEGJp(419) + i[$_BEGJp(415)]($_BEGJp(82)) + $_BEHAJ(419) + o[$_BEGJp(415)]($_BEGJp(82));},"\u0024\u005f\u0042\u0042\u0045\u0049": function (t, e, n) {var $_BEIJg = _tkts.$_Ch, $_BEIIl = ['$_BEJCk'].concat($_BEIJg), $_BEJAg = $_BEIIl[1];$_BEIIl.shift();var $_BEJBy = $_BEIIl[0];if (!e || !n)return t;var r, i = 0, o = t, s = e[0], a = e[2], _ = e[4];while (r = n[$_BEIJg(261)](i, 2)) {i += 2;var c = parseInt(r, 16), u = String[$_BEJAg(229)](c), l = (s * c * c + a * c + _) % t[$_BEJAg(159)];o = o[$_BEIJg(261)](0, l) + u + o[$_BEJAg(261)](l);}return o;},"\u0024\u005f\u0042\u0042\u0046\u0054": function (t, e, n) {var $_BEJEO = _tkts.$_Ch, $_BEJDg = ['$_BEJHa'].concat($_BEJEO), $_BEJFx = $_BEJDg[1];$_BEJDg.shift();var $_BEJGh = $_BEJDg[0];if (!e || !n || 0 === t)return t;return t + (e[1] * n * n + e[3] * n + e[5]) % 50;}}trace = [[-28,-32,0],[0,0,0],[2,0,87],[3,0,94],[7,0,102],[13,0,110],[21,0,117],[37,0,125],[53,0,134],[61,2,142],[72,6,150],[83,11,158],[91,14,166],[99,14,174],[106,14,182],[110,14,190],[113,14,198],[115,14,206],[115,14,326]]C = [12, 58, 98, 36, 43, 95, 62, 15, 12]//不變的,就固定死S =" 612d547e"aa = W['prototype']['\u0024\u005f\u0042\u0042\u0045\u0049'](W['prototype']['\u0024\u005f\u0046\u0044\u004c'](trace), C, S);
console.log(aa)

這里前面的屬性函數和環境變量直接去扣,這個貼上去太長了,trace是我們生成的軌跡,我們先固定,C的值不變,我們也固定,那個S的值,是我們最新得到的S,我們把這個S的值傳進來就能得到我們的軌跡。

h的值

我們接下來,就去扣這個h?的值,我們先看看源代碼怎么寫的。

h = m[$_CAIAK(792)](l)

我們發現這個特別簡單,我們可以選擇去扣這個m,或者去用第一次的R函數。到這里,我們的h也搞出來了,自然,我們的w也出來了。

總結

我們今天花了很多內容去解釋了三個w的生成,想要源碼的可以評論區留言,我們看看最后的效果吧。

我還去測試了某平臺手機發送驗證碼的滑塊,這個網站只要最后一個w就可以,等大家學完這個官網的逆向,其他js基本上簡單修改就可以使用了。


嚴正聲明:本文僅供交流學習,勿用于非法用途


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/213908.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/213908.shtml
英文地址,請注明出處:http://en.pswp.cn/news/213908.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【ArcGIS Pro微課1000例】0049:根據坐標快速定位(創建點位)的常見方法

文章目錄 一、轉到XY1. 閃爍位置2. 平移3. 標記位置二、定位1. 坐標定位2. 添加到圖形3. 添加至要素類三、添加XY坐標四、創建點要素一、轉到XY 舉例:經緯度坐標:113.2583286東, 23.1492340北 。 1. 閃爍位置 輸入坐標,點擊閃爍位置工具,即可在對應的位置出現一個綠色閃爍…

SQL注入漏洞利用

預計更新SQL注入概述 1.1 SQL注入攻擊概述 1.2 SQL注入漏洞分類 1.3 SQL注入攻擊的危害 SQLMap介紹 2.1 SQLMap簡介 2.2 SQLMap安裝與配置 2.3 SQLMap基本用法 SQLMap進階使用 3.1 SQLMap高級用法 3.2 SQLMap配置文件詳解 3.3 SQLMap插件的使用 SQL注入漏洞檢測 4.1 SQL注入…

shiro入門demo

搭建springboot項目&#xff0c;引入以下依賴&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--單元測試--><depe…

集的增刪操作

集是可以修改的&#xff0c;增加元素可以用add和update函數。刪除可以用pop、discard、remove等函數。 1 增加集里的元素 add函數的參數視為一個整體插入到集里&#xff0c;而update函數傳入的參數是把要傳入的元素拆分&#xff0c;做為個體傳入到集合中。 s set("hell…

.9.png的創建

1、創建.9.png 選中圖片&#xff0c;右擊&#xff0c;選擇Create 9-Patch file&#xff0c;點擊確定會生成一個xxx.9.png的圖片 2、繪制拉伸區域 在圖片的最外邊界繪制拉伸區域&#xff0c;按住鼠標左鍵不放&#xff0c;繪制完成后保存就可以使用了。繪制結果示意如下&…

phpstudy小皮(PHP集成環境)下載及使用

下載 https://www.xp.cn/download.html直接官網下載即可&#xff0c;下載完解壓是個.exe程序&#xff0c;直接點擊安裝就可以&#xff0c;它會自動在D盤目錄為D:\phpstudy_pro 使用 phpMyAdmin是集成的數據庫可視化&#xff0c;這里需要下載一下&#xff0c;在軟件管理-》網站程…

OPPO怎么錄屏?教程來了,讓你成為錄屏達人

“有人知道OPPO怎么錄屏嗎&#xff0c;前陣子剛買的OPPO手機&#xff0c;用起來感覺挺流暢的&#xff0c;功能也很齊全&#xff0c;最近因為工作原因&#xff0c;需要用到錄屏功能&#xff0c;但是我不知道怎么打開&#xff0c;就想問問大伙&#xff0c;OPPO怎么錄屏呀。” 在…

Redis分片集群一步一步全過程搭建

文章目錄 Redis搭建分片集群1. 搭建的分片集群結構2.準備實例和配置&#xff08;1&#xff09;創建目錄&#xff08;2&#xff09;創建配置文件&#xff08;3&#xff09;將這個文件拷貝到每個目錄下&#xff08;4&#xff09;修改每個目錄下的redis.conf&#xff0c;將其中的6…

Yocto 還是 Buildroot,構建自定義嵌入式系統時,您會選擇哪一種?

假設您正在采用集成平板開發新一代大型智能微波爐。這個創意不錯吧&#xff01;現在&#xff0c;您需要構建自定義操作系統&#xff0c;在保證不會燒焦食物&#xff08;更不要燒毀房屋哦&#xff09;的前提下&#xff0c;輔助管理各項事務。除此之外&#xff0c;您還需要創建一…

px? pt? dp? em?rem?vw?vh?ch?ex?這些單位你了解嗎?

目錄 前言 一、常見單位 1、px單位 2、dp單位 3、pt單位 4、百分比% 5、em單位 6、rem單位 7、vw和vh單位 8、ch、ex單位 二、如何換算 1、 pt和px換算 2、px和dp換算 3、em和px換算 4、rem和px換算 三、總結 前言 前端開發在日常設計中除了最常用的 px 以外&…

第二十八章 控制到 XML 模式的映射 - 流類到 XML 類型的映射

文章目錄 第二十八章 控制到 XML 模式的映射 - 流類到 XML 類型的映射將集合屬性映射到 XML 模式 第二十八章 控制到 XML 模式的映射 - 流類到 XML 類型的映射 如果類或屬性基于流&#xff0c;則它將投影為 XML 類型&#xff0c;如下表所示&#xff1a; IRIS 流的 XML 類型 …

使用BeautifulSoup 4和Pillow合并網頁圖片到一個PDF:一種高效的方式來處理網頁圖像

背景 ? 網頁上的培訓材料&#xff0c;內容全是PPT頁面圖片。直接通過瀏覽器打印&#xff0c;會存在只打印第一頁&#xff0c;并且把瀏覽器上無效信息也打印出來情況。但目標是希望將頁面圖片全部打印為pdf形式。 實現方案 利用網頁“另存為”&#xff0c;將頁面內所有圖片資…

官宣!「灣區之光群星演唱會」拉開2024新年音樂華麗序幕!

萬眾期待&#xff0c;群星薈萃&#xff01;青春寶安時尚灣區——灣區之光群星演唱會即將在2024年1月5日閃耀亮相深圳寶安。 華語歌壇巨星天后齊聚一堂&#xff0c;攜手多位實力唱將&#xff0c;共同呈現一場無與倫比的演唱會盛宴&#xff01;在深情而又充滿力量的歌聲之中&…

Linux修復磁盤壞道,重新掛載硬盤

修復磁盤 掛載報錯&#xff1a; [rootlocalhost ~]$ mount /dev/sdb /mnt/mydevmount: /dev/sdb is write-protected, mounting read-only mount: wrong fs type, bad option, bad superblock on /dev/sdb,missing codepage or helper program, or other errorIn some cases …

15、lambda表達式、右值引用、移動語義

前言 返回值后置 auto 函數名 (形參表) ->decltype(表達式) lambda表達式 lambda表達式的名稱是一個表達式 (外觀類似函數)&#xff0c;但本質絕非如此 語法規則 [捕獲表] (參數表) 選項 -> 返回類型 { 函數體; }lambda表達式的本質 lambda表達式本質其實是一個類…

textarea文本框回車enter的時候自動提交表單,根據內容自動高度

切圖網近期一個bootstrap5仿chatgpt頁面的項目遇到的&#xff0c;textarea文本框回車enter的時候自動提交表單&#xff0c;根據內容自動高度&#xff0c;代碼如下&#xff0c;親測可用。 <textarea placeholder"Message ChatGPT…" name"" rows"&q…

TypeScript 第五節:條件語句

一、TypeScript 中常用的條件語句 TypeScript 的條件語句與 JavaScript 的條件語句類似&#xff0c;包括 if 語句、if...else 語句、switch 語句等。 1、if 語句 if 語句用于判斷指定條件是否為 true&#xff0c;如果是 true&#xff0c;則執行一段代碼塊。 示例&#xff1a;…

命名空間this_thread

命名空間 - this_thread 在C11中不僅添加了線程類&#xff0c;還添加了一個關于線程的命名空間std::this_thread&#xff0c;在這個命名空間中提供了四個公共的成員函數&#xff0c;通過這些成員函數就可以對當前線程進行相關的操作了。 1.get_id() 調用命名空間std::this_t…

java腳本引擎Groovy動態執行

1.java腳本引擎Groovy實戰_groovy腳本-CSDN博客 2.java可用的動態腳本引擎和動態代碼執行_java動態執行代碼片段-CSDN博客 3.Groovy動態加載Java代碼的使用方法和工具類_groovy調用java類方法-CSDN博客 4.springboot應用動態運行groovy腳本-附源碼 - 簡書 (jianshu.com) 5.…

是不是學了低代碼就自動放棄了高薪?內部資深解答來了!

目錄 前言低代碼開發&#xff1a;點餐還是自助烹飪&#xff1f;低代碼的“菜單”低代碼的局限性 市場影響的分析&#xff1a;一場關于低代碼的對話低代碼開發與程序員職業&#xff1a;名人視角解析總結 前言 近年來&#xff0c;低代碼開發因其低門檻、高效率和易集成的特點受到…