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