極驗(yàn)驗(yàn)證碼破解—超詳細(xì)教程(一)
極驗(yàn)驗(yàn)證碼破解—超詳細(xì)教程(二)
極驗(yàn)驗(yàn)證碼破解—超詳細(xì)教程(三)
Gayhub:FanhuaandLuomu/geetest_break
2017.8.21 代碼以上傳,可供參考
[國(guó)家企業(yè)信用信息公示系統(tǒng)為例]
目錄
一蚊荣、網(wǎng)站http://www.gsxt.gov.cn滑動(dòng)驗(yàn)證碼概述.
二、極驗(yàn)驗(yàn)證碼破解-抓包分析.
三、極驗(yàn)驗(yàn)證碼破解-搭建本地驗(yàn)證碼服務(wù).
四酝豪、極驗(yàn)驗(yàn)證碼破解-分析geetest.js义桂,得到所需參數(shù).
五变擒、極驗(yàn)驗(yàn)證碼破解-Track的獲取.
六、極驗(yàn)驗(yàn)證碼破解-獲取背景圖片及缺口距離d的計(jì)算.
七茅特、極驗(yàn)驗(yàn)證碼破解-總結(jié).
參考文獻(xiàn).
運(yùn)行截圖.
四、極驗(yàn)驗(yàn)證碼破解-分析geetest.js棋枕,得到所需參數(shù)
1. 為了找出如何生成userresponse和a白修,我們?cè)趃eetest.js中搜索userrespnse,發(fā)現(xiàn)只有一處提到userresponse,如下所示:
可以看出userresponse和a都在上述代碼中賦值重斑。
首先兵睛,我們追蹤ca.ra,得到下面代碼:
計(jì)算userresponse需要參數(shù)l和challenge,challenge我們已知,下面分析l(先猜測(cè)為滑塊移動(dòng)的距離)祖很。
由
可得到a由n生成笛丙,
由上述可知oa.qa的返回值是f,下面繼續(xù)追蹤f:
由上述可知(console為我添加假颇,目的是打印信息)胚鸯,f的返回值即為所求a,觀察其包含1考Α姜钳!信息,比較所需a值:
可以發(fā)現(xiàn)形耗,目前推測(cè)無(wú)誤哥桥。
2. 我們發(fā)現(xiàn)f依賴于oa下的c函數(shù),追蹤c函數(shù):
觀察c函數(shù)的參數(shù)a趟脂,由a[h+1][1]可知a應(yīng)該是一個(gè)二維數(shù)組泰讽。
添加如下信息,輸出a的內(nèi)容:
刷新http://localhost:8000/,查看console控件下的信息:
可以發(fā)現(xiàn)昔期,這很大可能就是我們所要找的滑動(dòng)軌跡Track已卸。
回到之前userresponse中的l參數(shù),我們?cè)谙鄳?yīng)位置輸出:
查看Console發(fā)現(xiàn):
之前我們猜測(cè)l為滑動(dòng)距離硼一,比較l與Track最后一個(gè)坐標(biāo)累澡,可以發(fā)現(xiàn)l與Track[-1][0]相等,因此驗(yàn)證我們猜想—l是滑動(dòng)距離般贼。
3. 要想得到userresponse愧哟,需要得到l,需要得到Track,由于Track是隨機(jī)采樣生成的離散軌跡坐標(biāo)序列哼蛆,因此我們需要根據(jù)缺口的位置來(lái)模擬Track蕊梧。由于Track較難模擬,我們先假設(shè)已根據(jù)缺口距離生成了Track腮介。
則可以寫出生成userresponse的函數(shù):
def cal_userresponse(a,b):
d=[]
c=b[32:]
for e in range(len(c)):
f=ord(str(c[e]))
tmp=f-87 if f>57 else f-48
d.append(tmp)
c=36*d[0]+d[1]
g=int(round(a))+c
b=b[:32]
i=[[],[],[],[],[]]
j={}
k=0
e=0
for e in range(len(b)):
h=b[e]
if h in j:
pass
else:
j[h]=1
i[k].append(h)
k+=1
k=0 if (k==5) else k
n=g
o=4
p=""
q=[1,2,5,10,50]
while n>0:
if n-q[o]>=0:
m=int(random.random()*len(i[o]))
p+=str(i[o][m])
n-=q[o]
else:
del(i[o])
del(q[o])
o-=1
return p
參數(shù)a和b分別是l和challenge肥矢。上述函數(shù)是我根據(jù)
改寫成Python形式
至此,userresponse參數(shù)破解成功叠洗,接下來(lái)看a的生成甘改。
4. 之前分析a是由oa下的f函數(shù)生成:
其中參數(shù)a是Track。其中f函數(shù)用到了c函數(shù)灭抑、e函數(shù)和d函數(shù)十艾。
根據(jù)js函數(shù)源碼,我將其改寫成python函數(shù)腾节。
# 計(jì)算每次間隔? 相當(dāng)于c函數(shù)
代碼只截取部分忘嫉,具體細(xì)節(jié)后面會(huì)開源荤牍。
完整的f函數(shù)如上所示,參數(shù)為Track榄融,返回值即為f(也就是所需的a)参淫。
至此,參數(shù)a也破解完成@⒈O巡拧!只差最會(huì)一步力九,Track如何得到耍铜。
(未完待續(xù))