聲明
本文章中所有內(nèi)容僅供學(xué)習(xí)交流使用,不用于其他任何目的龄坪,不提供完整代碼昭雌,抓包內(nèi)容、敏感網(wǎng)址健田、數(shù)據(jù)接口等均已做脫敏處理烛卧,嚴(yán)禁用于商業(yè)用途和非法用途,否則由此產(chǎn)生的一切后果均與作者無關(guān)抄课!
本文章未經(jīng)許可禁止轉(zhuǎn)載唱星,禁止任何修改后二次傳播,擅自使用本文講解的技術(shù)而導(dǎo)致的任何意外跟磨,作者均不負(fù)責(zé)间聊,若有侵權(quán),請(qǐng)?jiān)诠娞?hào)【K哥爬蟲】聯(lián)系作者立即刪除抵拘!
逆向目標(biāo)
目標(biāo):某驗(yàn)四代消消樂哎榴、五子棋驗(yàn)證碼,w 參數(shù)逆向及算法分析
行為驗(yàn)證 4.0 demo:
aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v
加密算法:RSA僵蛛、AES尚蝌、MD5
通訊流程
消消樂流程分析
進(jìn)入網(wǎng)頁后,F(xiàn)12 進(jìn)行抓包充尉,選擇消消樂驗(yàn)證碼飘言,抓包到 load
接口:
-
captcha_id
:驗(yàn)證碼 id,固定值驼侠,四代滑塊文章中有講姿鸿; -
challenge
:動(dòng)態(tài)變化谆吴,由gtc4.js
文件生成,四代滑塊文章中有講苛预; -
client_type
:web 端句狼; -
risk_type
:驗(yàn)證碼類型,例如滑塊為 slide热某,無感為 ai腻菇,消消樂為 match; -
lang
:語言昔馋; -
callback
:回調(diào)參數(shù)筹吐,geetest_
+ 時(shí)間戳。
響應(yīng)預(yù)覽中返回的關(guān)鍵內(nèi)容如下:
-
captcha_type
:驗(yàn)證碼類型绒极; -
gct_path
:gct4 文件路徑骏令; -
lot_number
:生成 pow_msg、w 的關(guān)鍵參數(shù)垄提; -
payload
:verify 請(qǐng)求參數(shù)榔袋; -
datetime
:ISO 8601 擴(kuò)展格式的日期,生成 pow_msg 的關(guān)鍵參數(shù)铡俐; -
process_token
:verify 請(qǐng)求參數(shù)凰兑; -
ques
:消消樂矩陣(3x3),每個(gè)數(shù)字代表一種顏色审丘,將三個(gè)相同數(shù)字換到同一列或同一行即可通過吏够。
點(diǎn)擊驗(yàn)證按鈕,彈出消消樂驗(yàn)證碼滩报,移動(dòng)圖案之后锅知,抓包到 verify
校驗(yàn)接口:
-
captcha_id
:與 load 請(qǐng)求頭中的 captcha_id 一致; -
client_type
:web 端脓钾; -
lot_number
:load 響應(yīng)返回售睹; -
risk_type
:驗(yàn)證碼類型; -
payload
:load 響應(yīng)返回可训; -
process_token
:load 響應(yīng)返回昌妹; -
payload_protocol
:1; -
pt
:1握截; -
w
:加密參數(shù)飞崖,由軌跡、passtime谨胞、userresponse 等參數(shù)加密得到固歪; -
callback
:回調(diào)參數(shù),geetest_
+ 時(shí)間戳胯努。
響應(yīng)預(yù)覽中返回的內(nèi)容如下昼牛,result 值為 success 即校驗(yàn)通過术瓮,fail 即校驗(yàn)失敗,攜帶 seccode 下的五個(gè)參數(shù)請(qǐng)求 login 接口贰健,即可登錄成功:
逆向分析
w 參數(shù)
四代的基本流程都是差不多的,直接搜索特征值 "\u0077"
即可定位到 w 參數(shù)生成的位置恬汁,先全局搜索 "\u0077"
伶椿,找到對(duì)應(yīng)的 js 文件,點(diǎn)擊進(jìn)去格式化后氓侧,再 ctrl + f 局部搜索定位關(guān)鍵位置:
在第 6251 行打下斷點(diǎn)脊另,移動(dòng)圖案即會(huì)斷住,r
即 w
參數(shù)的值:
跟進(jìn) r 生成的位置约巷,其定義在第 6237 行偎痛,可以看到加密方式與四代滑塊是一樣的:
var r = (0,d.default)(f.default.stringify(e), i)
唯一不同的就是 e 中參數(shù)值的構(gòu)成,以下是四代滑塊與消消樂的對(duì)比:
可以看到不同點(diǎn)在于四代滑塊 e 中參數(shù)包括 setLeft
(缺口距離)独郎、track
(滑動(dòng)軌跡)踩麦,自然消消樂是沒有的,userresponse
在滑塊中是數(shù)值計(jì)算氓癌,而消消樂中是交換的兩個(gè)圖片的坐標(biāo)谓谦,舉個(gè)例子:
上圖中的驗(yàn)證碼,接口返回的 ques
值為:
ques = [
[0, 1, 0],
[1, 3, 3],
[1, 0, 1]
]
ques[0]
贪婉、ques[1]
反粥、ques[2]
分別對(duì)應(yīng)驗(yàn)證碼的第0列、第1列疲迂、第2列才顿,注意是列,不是行尤蒿!而我們只需要關(guān)心 ques 數(shù)組里的交換即可郑气,正確應(yīng)該交換第0行第1列和第0行第0列,那么 userresponse
的值應(yīng)該為:[[0, 1], [0, 0]]
优质。
其他參數(shù)值的生成都是一樣的方式竣贪,具體可以閱讀 K 哥往期文章《【驗(yàn)證碼逆向?qū)凇磕瞅?yàn)四代滑塊驗(yàn)證碼逆向分析》,這里就不再重復(fù)寫了巩螃。
消消樂結(jié)果驗(yàn)證
只要 JS 和交換的坐標(biāo)沒問題演怎,成功率就為 100%。
五子棋流程分析
五子棋的流程跟消消樂一樣避乏,進(jìn)入網(wǎng)頁后爷耀,F(xiàn)12 進(jìn)行抓包,選擇五子棋驗(yàn)證碼拍皮,抓包到 load
接口:
-
captcha_id
:驗(yàn)證碼 id歹叮,固定值跑杭,四代滑塊文章中有講; -
challenge
:動(dòng)態(tài)變化咆耿,由gtc4.js
文件生成德谅,四代滑塊文章中有講; -
client_type
:web 端萨螺; -
risk_type
:驗(yàn)證碼類型窄做,例如滑塊為 slide,無感為 ai慰技,五子棋為 winlinze椭盏; -
lang
:語言; -
callback
:回調(diào)參數(shù)吻商,geetest_ + 時(shí)間戳掏颊。
響應(yīng)預(yù)覽中返回的關(guān)鍵內(nèi)容如下:
-
captcha_type
:驗(yàn)證碼類型; -
gct_path
:gct4 文件路徑艾帐; -
lot_number
:生成 pow_msg乌叶、w 的關(guān)鍵參數(shù); -
payload
:verify 請(qǐng)求參數(shù)掩蛤; -
datetime
:ISO 8601 擴(kuò)展格式的日期枉昏,生成 pow_msg 的關(guān)鍵參數(shù); -
process_token
:verify 請(qǐng)求參數(shù)揍鸟; -
ques
:五子棋矩陣(5x5)兄裂,每個(gè)數(shù)字代表一種顏色,0 表示空位阳藻,將五個(gè)相同數(shù)字換到同一列晰奖、同一行或?qū)蔷€上即可通過。
其他的與消消樂是一樣的腥泥,e 參數(shù)如下匾南,其中 userresponse
就是需要交換的兩個(gè)棋子的坐標(biāo):
五子棋結(jié)果驗(yàn)證
同樣的,只要 JS 和交換的坐標(biāo)沒問題蛔外,成功率就為 100%蛆楞。
五子棋和消消樂算法
以下是消消樂和五子棋坐標(biāo)交換的 Python 算法,注意是交換坐標(biāo)的算法喲夹厌,不是全部的代碼哈豹爹,消消樂大概30來行,五子棋大概60來行矛纹,還是很簡(jiǎn)單的臂聋,有需要的可以去k哥爬蟲公眾號(hào)看看。