宣告
本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整程式碼,抓包內容、敏感網址、資料介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關!
本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權,請在公眾號【K哥爬蟲】聯絡作者立即刪除!
逆向目標
- 目標:某驗四代消消樂、五子棋驗證碼,w 引數逆向及演算法分析
- 行為驗證 4.0 demo:
aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
- 加密演算法:RSA、AES、MD5
通訊流程
消消樂流程分析
進入網頁後,F12 進行抓包,選擇消消樂驗證碼,抓包到 load
介面:
captcha_id
:驗證碼 id,固定值,四代滑塊文章中有講;challenge
:動態變化,由gtc4.js
檔案生成,四代滑塊文章中有講;client_type
:web 端;risk_type
:驗證碼型別,例如滑塊為 slide,無感為 ai,消消樂為 match;lang
:語言;callback
:回撥引數,geetest_
+ 時間戳。
響應預覽中返回的關鍵內容如下:
captcha_type
:驗證碼型別;gct_path
:gct4 檔案路徑;lot_number
:生成 pow_msg、w 的關鍵引數;payload
:verify 請求引數;datetime
:ISO 8601 擴充套件格式的日期,生成 pow_msg 的關鍵引數;process_token
:verify 請求引數;ques
:消消樂矩陣(3x3),每個數字代表一種顏色,將三個相同數字換到同一列或同一行即可透過。
點選驗證按鈕,彈出消消樂驗證碼,移動圖案之後,抓包到 verify
校驗介面:
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 介面,即可登入成功:
逆向分析
w 引數
四代的基本流程都是差不多的,直接搜尋特徵值 "\u0077"
即可定位到 w 引數生成的位置,先全域性搜尋 "\u0077"
,找到對應的 js 檔案,點選進去格式化後,再 ctrl + f 區域性搜尋定位關鍵位置:
在第 6251 行打下斷點,移動圖案即會斷住,r
即 w
引數的值:
跟進 r 生成的位置,其定義在第 6237 行,可以看到加密方式與四代滑塊是一樣的:
var r = (0,d.default)(f.default.stringify(e), i)
唯一不同的就是 e 中引數值的構成,以下是四代滑塊與消消樂的對比:
可以看到不同點在於四代滑塊 e 中引數包括 setLeft
(缺口距離)、track
(滑動軌跡),自然消消樂是沒有的,userresponse
在滑塊中是數值計算,而消消樂中是交換的兩個圖片的座標,舉個例子:
上圖中的驗證碼,介面返回的 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%。
五子棋流程分析
五子棋的流程跟消消樂一樣,進入網頁後,F12 進行抓包,選擇五子棋驗證碼,抓包到 load
介面:
captcha_id
:驗證碼 id,固定值,四代滑塊文章中有講;challenge
:動態變化,由gtc4.js
檔案生成,四代滑塊文章中有講;client_type
:web 端;risk_type
:驗證碼型別,例如滑塊為 slide,無感為 ai,五子棋為 winlinze;lang
:語言;callback
:回撥引數,geetest_ + 時間戳。
響應預覽中返回的關鍵內容如下:
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
就是需要交換的兩個棋子的座標:
五子棋結果驗證
同樣的,只要 JS 和交換的座標沒問題,成功率就為 100%。
五子棋和消消樂演算法
以下是消消樂和五子棋座標交換的 Python 演算法,注意是交換座標的演算法喲,不是全部的程式碼哈,消消樂大概30來行,五子棋大概60來行,還是很簡單的,有需要的可以去k哥爬蟲公眾號看看。