geetest极验空间推理验证码破解与研究
????????看了很多的破解滑動(dòng)驗(yàn)證碼,決定破解一下空間推理驗(yàn)證碼。破解思路,通過(guò)分析接口請(qǐng)求,對(duì)圖片物體進(jìn)行定位分類(lèi),通過(guò)模擬請(qǐng)求破解驗(yàn)證碼。
研究的網(wǎng)站為?https://www.geetest.com/show?
?
一、極驗(yàn)請(qǐng)求分析
請(qǐng)求詳細(xì)
一、register-space
獲取gt(一般一個(gè)網(wǎng)站是固定的)、challenge(驗(yàn)證流水號(hào),服務(wù)端 SDK 向極驗(yàn)服務(wù)器申請(qǐng)得到)參數(shù)。
challenge參數(shù)只能使用一次,一但后面get.php請(qǐng)求后就無(wú)法再請(qǐng)求,同時(shí)換ip的情況下也會(huì)失效。
?二、黑色的三個(gè)請(qǐng)求只要根據(jù)他的參數(shù)照著模擬就可以了,不需要處理結(jié)果
?第一次的get.php和ajax.php是無(wú)感驗(yàn)證,執(zhí)行fullpage.js,收集瀏覽器信息,加密w參數(shù)直接填空就可以了。
三、紅色的請(qǐng)求
https://api.geetest.com/get.php
獲取圖片和文字加密信息等
請(qǐng)求參數(shù)
is_next: true type: click gt: c9428d9361cd70d26e28d7cd780ec640 challenge: 263e2e11a85337b92d821c158c1b438f lang: zh-cn https: true protocol: https:// offline: false product: float api_server: api.geetest.com isPC: true autoReset: true width: 100% callback: geetest_1644770447212請(qǐng)求響應(yīng)
?響應(yīng)中,pic,c,s這3個(gè)參數(shù)非常重要,在生成w加密參數(shù)是需要用到它們
"data": {"theme": "silver","theme_version": "1.5.0","static_servers": ["static.geetest.com/", "dn-staticdown.qbox.me/"],"api_server": "api.geetest.com","logo": false,"sign": "\u8bf7_\u70b9\u51fb_\u5728\u5927\u578b\u7eff\u8272\u7403\u4f53\u540e\u9762\u7684\u7ea2\u8272\u7269\u4f53\u3002", # 物體的文字信息"pic": "/nerualpic/space_l1_zh_2019.07.17/space/587417a058088f2f5934e22fcc503980.jpg", # 圖片的url地址,同時(shí)也是后續(xù)加密生成w需要"pic_type": "space","num": 0,"c": [12, 58, 98, 36, 43, 95, 62, 15, 12], # 后續(xù)生成w需要"s": "514c622c", # 后續(xù)加密生成w需要······}點(diǎn)擊坐標(biāo)后提交,將坐標(biāo)等信息加密在w中post給服務(wù)器,返回validate的值表示驗(yàn)證成功
https://api.geetest.com/ajax.php
請(qǐng)求參數(shù)
'gt': 'c9428d9361cd70d26e28d7cd780ec640', 'challenge': '263e2e11a85337b92d821c158c1b438f', 'lang': 'zh-cn', 'pt': 0', 'client_type': 'web', 'w': 'Y1gV9CACfWsfd)vtGUQD(WuKBZnmxhgfpXfD)qDHwhG(h1F4rOco··· //點(diǎn)擊的坐標(biāo)和一些信息的加密信息(點(diǎn)擊坐標(biāo),圖片pic,上面的c和s內(nèi)容) 'callback': 'geetest_1644752017507'請(qǐng)求響應(yīng)
{"status": "success", "data": {"result": "success", "validate": "23ff2a4fddac68b9e40884befcfbb9af", "score": "1"} }有了validate就可以和gt,challenge一起提交給需要登錄的網(wǎng)站接口做驗(yàn)證了。
?二、JS反混淆
????????破解的關(guān)鍵是獲取加密參數(shù)生成方法。主要在click.3.0.2.js文件中,因此我們學(xué)習(xí)大佬分析AST的方法將他們反混淆,然后去分析debug。具體可以看看大佬的方法,我就不重復(fù)造輪子了。
JS逆向:AST還原極驗(yàn)混淆JS實(shí)戰(zhàn)
將網(wǎng)站混淆過(guò)的源代碼下載下來(lái),格式化后將上面幾個(gè)函數(shù)(內(nèi)容也要的)拷貝到還原方法前,文件位置替換成下載下來(lái)的文件地址。運(yùn)行就會(huì)生成反混淆的代碼。
AtULc.BaI = function() {}(); AtULc.CJR = function() {}(); AtULc.Dvg = function() {}; AtULc.EyS = function() {}; function AtULc() {}// 需要解碼的文件位置 let encode_file = "click.3.0.2init.js" // 解碼后的文件位置 let decode_file = "click.3.0.2.js"將代碼反混淆后可以使用chrome的reres插件將原本混淆的代碼替換
?本地地址要加上file:/// ,同時(shí)要在管理reres插件的界面允許訪問(wèn)本地地址
源碼我寫(xiě)下來(lái)放在github了?點(diǎn)擊進(jìn)入。同時(shí)因?yàn)椴环奖阆螺dreres插件,我也將插件上傳在github
三、w參數(shù)分析
替換文件后打開(kāi)chrome的開(kāi)發(fā)者工具,再sources中搜"w"
看d的其他參數(shù),顯然這個(gè)w就是這里產(chǎn)生的,打上斷點(diǎn)去提交驗(yàn)證碼
?w是p+u,繼續(xù)往上一步一步分析。
f = Q["encrypt"](de["stringify"](o), r["gCdf"]());
p = h["YQee"](?f);
u = r["fTbG"]();
1、參數(shù) p 生成
f中有兩個(gè)參數(shù)?de["stringify"](o)?和?r["gCdf"]()
一、de["stringify"](o)
de["stringify"](o)?中只有一個(gè)參數(shù)o,往上找o
var o = {"lang": n["lang"] || "zh-cn","passtime": t,"a": e,"pic": n["pic"],"tt": pe(s, n["c"], n["s"]),"ep": r["eRts"]() };"lang": n["lang"] || "zh-cn" 默認(rèn)等于"zh-cn"就行
"passtime": t? 通過(guò)驗(yàn)證時(shí)間,隨便多少都行888之類(lèi),或者就按你debug時(shí)的大小
"a": e? ?e就是點(diǎn)擊坐標(biāo),最小"0_0",最大"10000_10000",為xy的百分比
"pic": n["pic"]? get.php響應(yīng)中"pic"中內(nèi)容
"tt": pe(s, n["c"], n["s"])??get.php響應(yīng)中"c"和"s"的內(nèi)容
"ep": r["eRts"]()?這個(gè)參數(shù)可以為空? 令"ep"= {}
其中"tt": pe(s, n["c"], n["s"])?
s?就在定義?o?的上方 s = r["NfwI"]["EhLr"]()
找到EhLr
所以s=e["Xkir"](e["BjJO"](t)
打印出?t 看看
可以看出就是鼠標(biāo)移動(dòng)點(diǎn)擊的信息和時(shí)間,把chrome切換成手機(jī)調(diào)試模式
?可以將鼠標(biāo)操作縮短到
?經(jīng)過(guò)測(cè)試,這里面的點(diǎn)擊坐標(biāo)為頁(yè)面的坐標(biāo),多少?zèng)]有關(guān)系,保留即可,只要將其中的時(shí)間戳換成破解的時(shí)間。間隔的時(shí)間仿造圖中時(shí)間差即可。至于能否更簡(jiǎn)潔更簡(jiǎn)單辦法可以自己嘗試一下。
將"Xkir""EhLr""BjJO"這些函數(shù)都掏出來(lái),修修改改到把?t?傳參進(jìn)去得到?s
最后在從代碼里扣出pe函數(shù),把之前get.php響應(yīng)中的?c?和?s?一起傳入就得到了"tt"的值
二、r["gCdf"]()
找?gCdf?這個(gè)函數(shù)
t = ae()
繼續(xù)把a(bǔ)e也扣下來(lái),把他們一步步連起來(lái)來(lái)即可。?
f = Q["encrypt"](de["stringify"](o), r["gCdf"]());
p = h["YQee"](?f);
2、參數(shù) u 生成
?u = r["fTbG"]()
可以看出用到了生成?p 時(shí)用到的gCdf
把 k 摳出來(lái)直接調(diào)用 gCdf就可以了?
這樣 w = p + u 就全部破解完了,可以參考下我上傳在github上代碼 點(diǎn)擊進(jìn)入
總結(jié)
以上是生活随笔為你收集整理的geetest极验空间推理验证码破解与研究的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用Wireshark抓包分析TCP协议
- 下一篇: 【浅谈】样本方差的分母“n”为什么要改为