極驗(yàn)4代滑塊驗(yàn)證碼破解(補(bǔ)環(huán)境直接強(qiáng)暴式拿下)
前言
極驗(yàn)第四代好像簡(jiǎn)單了特別多,沒有什么技巧,環(huán)境黨直接5分鐘拿下。
一、分析
直接去它官網(wǎng),滑動(dòng)滑塊打開控制臺(tái)瞅瞅
在這里插入圖片描述
在這里插入圖片描述
可以看到有個(gè)verify請(qǐng)求,看它返回的這個(gè)請(qǐng)求應(yīng)該就是提交移動(dòng)距離的地方了,接下來再看看提交了哪些數(shù)據(jù),可以看到極驗(yàn)的老樣子,還是w參數(shù)。(其他參數(shù)都可以再load那個(gè)請(qǐng)求里面得到,這里不再贅述,讀者可以自己去看看)
打開啟動(dòng)器,去往上跟堆棧,跟到這一步就差不多了
在這里插入圖片描述
這個(gè)就是我們想要的w參數(shù)
在這里插入圖片描述
再往上看,這個(gè)r的調(diào)用方式就這么直接給出來了,現(xiàn)在追進(jìn)去看看它這個(gè)方法
在這里插入圖片描述
可以看到傳入的這兩個(gè)參數(shù),第一個(gè)參數(shù)很明顯就是移動(dòng)距離和時(shí)間的信息,先不管它,看看第二個(gè)參數(shù),這是一個(gè)對(duì)象,并且沒有辦法直接復(fù)制下來(我是懶得很的,我非要把它弄下來,雙擊第二個(gè)參數(shù),可以發(fā)現(xiàn)這個(gè)r方法里,就使用了它其中的一個(gè)值)
在這里插入圖片描述
這個(gè)值我們是可以復(fù)制下來的(那就很舒服了),到這里,參數(shù)的傳入基本上都清楚了。
在這里插入圖片描述
接下來不要急,補(bǔ)環(huán)境嘛,省時(shí)間,那我們就直接開始觀察一下它這個(gè)js,可以發(fā)現(xiàn),就是一整個(gè)js加載,然后里面瞎搗鼓,那不正好,直接全部拿下來,一把梭哈了它。
在這里插入圖片描述
拿下來后,小小魔改一下代碼,我們直接分析了,這里只需要t其中的一個(gè)值,那就把那個(gè)值當(dāng)作參數(shù)傳進(jìn)去就好了。
在這里插入圖片描述
然后把整個(gè)r給導(dǎo)出就完事了
在這里插入圖片描述
接下來,當(dāng)然不是直接本地運(yùn)行,先丟到瀏覽器去,看看這個(gè)代碼能不能正常跑。正常出值了,然后這個(gè)參數(shù),拿去請(qǐng)求也是可以過的(這里不演示了,浪費(fèi)時(shí)間)
在這里插入圖片描述
那接下來,當(dāng)然是直接扔到我們的nodejs去造了。
window=global;
document={};
better_proxy = function (o, callerName){
return new Proxy(o, {
set(target, property, value){
console.table([{"類型":"set-->","調(diào)用者":callerName,"屬性":property,"值":value}]);
return Reflect.set(...arguments);
},
get(target, property, receiver){
console.table([{"類型":"get<--","調(diào)用者":callerName,"屬性":property,"值":target[property]}]);
return Reflect.get(...arguments);
},
}
);
}
window = better_proxy(window, "window")
document = better_proxy(document, "document")
這里給大家一個(gè)簡(jiǎn)單的代理,創(chuàng)建一個(gè)對(duì)象就代理一次(方法笨了點(diǎn),但是不用想太多,無腦補(bǔ)就對(duì)了),下面這些undefined,就是需要補(bǔ)的,這里帶大家簡(jiǎn)單補(bǔ)兩個(gè)。
在這里插入圖片描述
下面就是我隨便補(bǔ)的兩個(gè),每次添加一個(gè)對(duì)象,記得都要給它上一個(gè)代理噢。
window=global;
document={};
better_proxy = function (o, callerName){
return new Proxy(o, {
set(target, property, value){
console.table([{"類型":"set-->","調(diào)用者":callerName,"屬性":property,"值":value}]);
return Reflect.set(...arguments);
},
get(target, property, receiver){
console.table([{"類型":"get<--","調(diào)用者":callerName,"屬性":property,"值":target[property]}]);
return Reflect.get(...arguments);
},
}
);
}
window = better_proxy(window, "window")
document = better_proxy(document, "document")
window.location = {
"ancestorOrigins": {},
"href": "https://www.geetest.com/adaptive-captcha-demo",
"origin": "https://www.geetest.com",
"protocol": "https:",
"host": "www.geetest.com",
"hostname": "www.geetest.com",
"port": "",
"pathname": "/adaptive-captcha-demo",
"search": "",
"hash": ""
};
window.navigator= {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36',
appName:'Netscape'
}
document.body = {}
document.head = {}
document.documentElement = {}
window.location = better_proxy(window.location, "window.location")
window.navigator = better_proxy(window.navigator, "window.navigator")
document.body = better_proxy(document.body, "document.body")
document.documentElement = better_proxy(document.documentElement, "document.documentElement")
其實(shí)上面補(bǔ)的都差不多了,就差最后一個(gè)(自己補(bǔ)吧),全部給出來,好像不太好。
在這里插入圖片描述結(jié)果如下:
在這里插入圖片描述
不扯什么混淆,就強(qiáng)暴式補(bǔ)出來,但是吧,這第二個(gè)參數(shù)這么多,都要用來加密嗎
在這里插入圖片描述
作為一位懶人,我就直接給它上了個(gè)代理,可以看到這么多就使用了一個(gè)pt,那就給一個(gè)pt就完事了。
在這里插入圖片描述
到這里,這個(gè)極驗(yàn)4就完事了。
二、驗(yàn)證
那整出來了,不得驗(yàn)證去玩一下,回到之前的load請(qǐng)求,可以看到很多參數(shù)都是verify請(qǐng)求需要的。里面還包含了驗(yàn)證碼的背景圖片和驗(yàn)證碼缺口圖片。
在這里插入圖片描述
拿到postman去轉(zhuǎn)成python,然后,我們就可以做下一步了,驗(yàn)證碼缺口識(shí)別。
在這里插入圖片描述
我使用了下面大佬的代碼
如何用python識(shí)別滑塊驗(yàn)證碼中的缺口_python
import cv2
def identify_gap(bg,tp,out):
'''
bg: 背景圖片
tp: 缺口圖片
out:輸出圖片
'''
# 讀取背景圖片和缺口圖片
bg_img = cv2.imread(bg) # 背景圖片
tp_img = cv2.imread(tp) # 缺口圖片
# 識(shí)別圖片邊緣
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)
# 轉(zhuǎn)換圖片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 尋找最優(yōu)匹配
# 繪制方框
th, tw = tp_pic.shape[:2]
tl = max_loc # 左上角點(diǎn)的坐標(biāo)
br = (tl[0]+tw,tl[1]+th) # 右下角點(diǎn)的坐標(biāo)
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 繪制矩形
cv2.imwrite(out, bg_img) # 保存在本地
# 返回缺口的X坐標(biāo)
return tl[0]
把兩張圖片傳進(jìn)去就行了,最后一個(gè)參數(shù)是輸入結(jié)果圖片的位置。(兩張圖片在load請(qǐng)求返回回來的返回體上面)
在這里插入圖片描述
最后得到他需要移動(dòng)的距離。
再去調(diào)用js,把這個(gè)移動(dòng)距離傳進(jìn)去就行了(傳給第一個(gè)參數(shù))
function init(data_x){
let mydata = '{"setLeft":'+data_x+',"passtime":1915,"userresponse":'+data_x+'.81178591310345,"device_id":"自己搞(網(wǎng)頁(yè)上都有的)","lot_number":"自己搞(網(wǎng)頁(yè)上都有的)","pow_msg":"自己搞(網(wǎng)頁(yè)上都有的)","pow_sign":"自己搞(網(wǎng)頁(yè)上都有的)","geetest":"captcha","lang":"zh","ep":"123","rigp":"199241198","yeg6":"d6w9","em":{"ph":0,"cp":0,"ek":"11","wd":1,"nt":0,"si":0,"sc":0}}'
mydata_obj={
"pt": "1",
}
mydata_obj = better_proxy(mydata_obj, "mydata_obj")
result = window.code(mydata, mydata_obj)
console.log(result)
}
module.exports = {
init
}
在這里插入圖片描述
總結(jié)
沒啥難度,越來越簡(jiǎn)單了,新手可以拿來當(dāng)作入門課程
————————————————