【驗證碼逆向專欄】某驗四代五子棋、消消樂驗證碼逆向分析

K哥爬蟲發表於2023-03-15

宣告

本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整程式碼,抓包內容、敏感網址、資料介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關!

本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權,請在公眾號【K哥爬蟲】聯絡作者立即刪除!

逆向目標

  • 目標:某驗四代消消樂、五子棋驗證碼,w 引數逆向及演算法分析
  • 行為驗證 4.0 demo:aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
  • 加密演算法:RSA、AES、MD5

通訊流程

01

消消樂流程分析

02

進入網頁後,F12 進行抓包,選擇消消樂驗證碼,抓包到 load 介面:

03

  • captcha_id:驗證碼 id,固定值,四代滑塊文章中有講;
  • challenge:動態變化,由 gtc4.js 檔案生成,四代滑塊文章中有講;
  • client_type:web 端;
  • risk_type:驗證碼型別,例如滑塊為 slide,無感為 ai,消消樂為 match;
  • lang:語言;
  • callback:回撥引數,geetest_ + 時間戳。

響應預覽中返回的關鍵內容如下:

04

  • captcha_type:驗證碼型別;
  • gct_path:gct4 檔案路徑;
  • lot_number:生成 pow_msg、w 的關鍵引數;
  • payload:verify 請求引數;
  • datetime:ISO 8601 擴充套件格式的日期,生成 pow_msg 的關鍵引數;
  • process_token:verify 請求引數;
  • ques:消消樂矩陣(3x3),每個數字代表一種顏色,將三個相同數字換到同一列或同一行即可透過。

點選驗證按鈕,彈出消消樂驗證碼,移動圖案之後,抓包到 verify 校驗介面:

05

  • captcha_id:與 load 請求頭中的 captcha_id 一致;
  • client_type:web 端;
  • lot_number:load 響應返回;
  • risk_type:驗證碼型別;
  • payload:load 響應返回;
  • process_token:load 響應返回;
  • payload_protocol:1;
  • pt:1;
  • w:加密引數,由軌跡、passtime、userresponse 等引數加密得到;
  • callback:回撥引數,geetest_ + 時間戳。

響應預覽中返回的內容如下,result 值為 success 即校驗透過,fail 即校驗失敗,攜帶 seccode 下的五個引數請求 login 介面,即可登入成功:

06

逆向分析

w 引數

四代的基本流程都是差不多的,直接搜尋特徵值 "\u0077" 即可定位到 w 引數生成的位置,先全域性搜尋 "\u0077",找到對應的 js 檔案,點選進去格式化後,再 ctrl + f 區域性搜尋定位關鍵位置:

07

在第 6251 行打下斷點,移動圖案即會斷住,rw 引數的值:

08

跟進 r 生成的位置,其定義在第 6237 行,可以看到加密方式與四代滑塊是一樣的:

var r = (0,d.default)(f.default.stringify(e), i)

唯一不同的就是 e 中引數值的構成,以下是四代滑塊與消消樂的對比:

09

可以看到不同點在於四代滑塊 e 中引數包括 setLeft(缺口距離)、track(滑動軌跡),自然消消樂是沒有的,userresponse 在滑塊中是數值計算,而消消樂中是交換的兩個圖片的座標,舉個例子:

10

上圖中的驗證碼,介面返回的 ques 值為:

ques = [
    [0, 1, 0], 
    [1, 3, 3], 
    [1, 0, 1]
]

ques[0]ques[1]ques[2] 分別對應驗證碼的第0列、第1列、第2列,注意是列,不是行!而我們只需要關心 ques 陣列裡的交換即可,正確應該交換第0行第1列和第0行第0列,那麼 userresponse 的值應該為:[[0, 1], [0, 0]]

其他引數值的生成都是一樣的方式,具體可以閱讀 K 哥往期文章《【驗證碼逆向專欄】某驗四代滑塊驗證碼逆向分析》,這裡就不再重複寫了。

消消樂結果驗證

只要 JS 和交換的座標沒問題,成功率就為 100%。

11

五子棋流程分析

12

五子棋的流程跟消消樂一樣,進入網頁後,F12 進行抓包,選擇五子棋驗證碼,抓包到 load 介面:

13

  • captcha_id:驗證碼 id,固定值,四代滑塊文章中有講;
  • challenge:動態變化,由 gtc4.js 檔案生成,四代滑塊文章中有講;
  • client_type:web 端;
  • risk_type:驗證碼型別,例如滑塊為 slide,無感為 ai,五子棋為 winlinze;
  • lang:語言;
  • callback:回撥引數,geetest_ + 時間戳。

響應預覽中返回的關鍵內容如下:

14

  • captcha_type:驗證碼型別;
  • gct_path:gct4 檔案路徑;
  • lot_number:生成 pow_msg、w 的關鍵引數;
  • payload:verify 請求引數;
  • datetime:ISO 8601 擴充套件格式的日期,生成 pow_msg 的關鍵引數;
  • process_token:verify 請求引數;
  • ques:五子棋矩陣(5x5),每個數字代表一種顏色,0 表示空位,將五個相同數字換到同一列、同一行或對角線上即可透過。

其他的與消消樂是一樣的,e 引數如下,其中 userresponse 就是需要交換的兩個棋子的座標:

15

五子棋結果驗證

同樣的,只要 JS 和交換的座標沒問題,成功率就為 100%。

16

五子棋和消消樂演算法

以下是消消樂和五子棋座標交換的 Python 演算法,注意是交換座標的演算法喲,不是全部的程式碼哈,消消樂大概30來行,五子棋大概60來行,還是很簡單的,有需要的可以去k哥爬蟲公眾號看看。

【驗證碼逆向專欄】某驗四代五子棋、消消樂驗證碼逆向分析

相關文章