網易滑塊驗證碼加密參數分析及滑塊軌跡算法data是怎麼生成的

網易滑塊驗證碼加密參數分析及滑塊軌跡算法data是怎麼生成的
在這裏插入圖片描述
如圖所示,再登錄之前,需要先破解它的滑塊,拿到它的關鍵參數

1. 抓包

首先打開抓包工具或者f12控制檯,然後手動滑動,觀察請求包的信息。
在這裏插入圖片描述
我們發現這是個get請求,下面具體看下它的請求參數
在這裏插入圖片描述
其中響應裏的validate就是我們後面處理登錄,需要用到的參數。只有滑動成功,纔會返回值。
我們看下請求參數中,其中大多數參數可以固定不變。只有4個參數需要我們破解。分別是id,token,acToken,data,cb。
通過多次滑動抓包,發現其中id參數也是固定值。token參數可以在請求滑塊圖片的時候找到。
在這裏插入圖片描述
接下來需要破解acToken。全局搜索acToken關鍵字
在這裏插入圖片描述
發現再其中有5處地方出現過。這裏比較少,如果不確定是哪個位置的話,就再全部的位置打上斷點,看它最終會停在哪裏。

這裏我直接通過靜態分析,發現這邊是個check接口,跟驗證碼的接口一致,我們斷點直接打在這裏。
在這裏插入圖片描述
通過動態調試,斷點來到這裏,繼續分析
在這裏插入圖片描述
發現t.acToken在這裏已經生成,並且這個t是通過參數傳遞過來的。這個時候我們應該追溯它的調用棧,看它原始生成的地方。
在這裏插入圖片描述
調用棧追到這裏,發現已經追不動了,沒有更詳細的調用棧了,我們先斷點打在這裏,再追一下
在這裏插入圖片描述
發現這裏斷點處,acToken的值已經生成。右側已經有了更詳細的調用棧,我們繼續向下追。
在這裏插入圖片描述
追到這裏,再向下追,就看不到acToken的值了。我們再這一處的下一個調用棧的地方,下斷點。
在這裏插入圖片描述
這裏發現調用較複雜,不方便觀察其中的值和結果。我們使用抓包工具替換掉原js文件,使用自己本地美化後的js繼續調試。然後斷點下在附近。
在這裏插入圖片描述
註釋部分是原代碼,下面是美化後的代碼。發現在這裏,tmp的值已經生成。是通過Xb這裏方法生成的。
繼續看Xb裏面的方法是怎麼生成的。
在這裏插入圖片描述
可以看到最後調用了Ea方法,去生成我們的acToken。待加密對象中的r,d,b三個值我們都可以找到它的來源。下面我們就導出Ea這個函數,看下本地js生成的值是否跟它生成的一致。
下面是導出內部函數的小技巧。
首先在全局定義一個變量。隨意就好。
在這裏插入圖片描述
然後找到我們要導出的函數,比如說這裏我們要導出Ea這個函數。那麼我們首先找到Ea函數定義的地方,用這個全局變量指向Ea。那麼我們就可以在函數外部去調用這個Ea方法。
在這裏插入圖片描述
接下來使用node,調用getEa這個方法,把參數帶進去調試。
在這裏插入圖片描述
這裏發現我們生成的值與網頁生成的值是一致的。
到這裏acToken的參數加密我們解決了,現在需要的就是找到剛纔加密對象中d的值和b的值。 d的值在這裏生成的。
在這裏插入圖片描述
b的值是傳遞進來的。在Xb函數附近,通過Wb函數生成的。
在這裏插入圖片描述
這裏就不講b和d的生成過程啦。調試技巧和剛纔的一樣,耐心一點,就能整出來。
同樣,接口參數中cb的值也可以通過這種方式整出來。思路和獲取acToken的值一樣,比acToken的生成方式要簡單一些。
在這裏插入圖片描述
我們要先檢驗一下自己生成的cb值和acToken能不能用。
檢驗方式有兩種。
一種是通過抓包工具hook,把它要發的包攔截住,替換成我們自己本地修改的值。
第二種方式是在chrome斷點調試中,修改它參數賦值的地方,改爲我們自己生成的值。

這兩個參數解決了,後面就只剩下data這個參數了。
在這裏插入圖片描述
data參數是一個json。其中又有3個加密參數等待我們解密。
這個放到下一篇再說。
總結一下本篇文章用到的小技巧。

  1. 語法比較複雜的js,可以配合抓包工具替換成本地的js,在本地js中,修改成清晰便於調試的js語法
  2. 內部函數導出。定義一個全局變量,然後內部函數指向全局變量,是這個函數在外部也可以調用。
  3. 檢查調試結果。hook正常的發包請求,修改成我們自己生成的值,便於判斷我們自己生成的值是否正確。

 

下面主要分析網易的滑塊軌跡算法。也就是data是怎麼生成的
在這裏插入圖片描述

我們全局搜索data,出現的地方很太多。我這裏是直接搜m:""
在這裏插入圖片描述
其中只涉及到3個js文件.這裏我們優先選擇帶版本號的js文件,可以看到這個版本號跟驗證滑塊接口中的版本號是一致的。
在這裏插入圖片描述
點進去直接繼續搜索
在這裏插入圖片描述
整個js中就只有這一處。我們直接斷點打在data身上。其中的d是滑塊軌跡,p和ext分別是兩個加密參數。
這裏先分析d的值。
p函數加密n.join(":")的值就是滑塊軌跡。 n應該是一個數組。n的生成位置在這裏
在這裏插入圖片描述
其中this.traceData就是我們鼠標滑動的所產生的軌跡信息,其中的值是被加密了的。 u的值是50.
在這裏插入圖片描述
經過a.sample函數處理完,只剩下50個軌跡信息。
在這裏插入圖片描述
接下來分析this.traceData中的這些加密信息的含義。
搜索this.traceData我們可以看到大概就是這個位置。
在這裏插入圖片描述
可以看到跟滑塊的x和y的座標還有時間有關。最終用f函數做了一下加密處理。
我們這裏不方便直接斷點。因爲,在此處斷點,每動一下鼠標都要debug。我們要觀察其中的值的變化規律的話,比較適合用console.log輸出再控制檯觀看。
這裏繼續使用抓包工具替換js的形式,來方便我們打印輸出。
在這裏插入圖片描述
控制檯輸出的值
在這裏插入圖片描述
可以很清除的看到我們滑動的軌跡信息。
第一個是橫座標的拖動距離,第二個是縱座標上下浮動的距離,第三個是當前滑動的時間-開始滑動的時間。
下面講一下軌跡生成的思路。這裏我們只需要生成50個軌跡信息就行。

  1. 獲取滑塊缺口位置。
  2. 由於網易只取50個滑塊軌跡特徵,所以我們把缺口位置/50 得出每步滑動多少距離。然後真正取值的時候取個隨機值。 實際距離=random(上一次的計劃距離,本次的計劃距離)。 比如說現在缺口位置是 100,100/50=2,那每份滑塊的增量就是2。第一次的軌跡可以設置一個固定值,比如說0。那第二次軌跡的橫座標就可以設置成random(2,4),第三次的軌跡就是random(4,6),依此類推,即可得到整個滑塊軌跡的橫座標
  3. 縱座標的值浮動不要太大,可以給定一個較小的隨機區間。例如1-3
  4. 給一個滑動計劃所需的總耗時,再除以50,得出每份軌跡所花時間,可以適當隨機加減一些值。可以參考橫座標的生成方式。實際耗時=random(上一次的計劃耗時,本次的計劃耗時)。比如說,我計劃耗時是time = random(3000,4000),這裏假設剛好time=3000,那麼計劃每次所需時間就是3000/50=60毫秒,第一次軌跡的所需時間建議給個較小固定值,10毫秒以內。第二次的實際時間是random(60,120),第三次的實際時間是random(120,180),依此類推。

這裏我們得到整個軌跡以後,把每步的軌跡用f函數進行加密。f函數的抽取過程可參考上一篇文章:網易滑塊協議分析(一) 後面還有一些加密均可使用上述方式進行抽取,最後執行使用node或者js2py等工具即可。
最後貼一下最後結果。
在這裏插入圖片描述
注意點:

  1. 完成一個參數的加密還原,儘量使用控制變量法,去測試一下。不然會把你搞的懷疑人生。
  2. 圖片識別的原始像素是 320x160,識別出來的缺口位置也是基於這個像素的。但是在網頁上有縮放,整個寬是220px. 所以識別出來的缺口位置需要等比例縮小。
  3. 如果使用截圖工具量缺口位置的話,請保持電腦的縮放比例爲100%,不然量的不準確。

滑塊缺口識別原理:https://mp.weixin.qq.com/s/xCnSupqdjzmnIM0GklEk_w
滑塊缺口識別代碼:https://github.com/crazyxw/SlideCrack

博客地址:https://blog.csdn.net/qq_41895190

QQ羣:608591811(csdn)

易盾最新滑塊、點字、無感知本地GPU識別庫、鼠標軌跡js算法;極驗3最新滑塊、點字、無感知GPU識別庫、識別軌跡js算法;騰訊QQ最新滑塊、點字、登錄識別庫、本地GPU識別庫、鼠標軌跡js算法;阿里最新滑塊、點字、本地GPU識別庫、鼠標軌跡js算法;百度2漢字、4漢字、貼吧九宮格、萊茨狗動態驗證碼本地識別庫;有各種需要都可以

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章