
Gayhub:FanhuaandLuomu/geetest_break
2017.8.21 代碼以上傳,可供參考
[國家企業(yè)信用信息公示系統(tǒng)為例]
目錄
一、網(wǎng)站http://www.gsxt.gov.cn滑動驗證碼概述.
二、極驗驗證碼破解-抓包分析.
三、極驗驗證碼破解-搭建本地驗證碼服務.
四、極驗驗證碼破解-分析geetest.js,得到所需參數(shù).
五、極驗驗證碼破解-Track的獲取.
六、極驗驗證碼破解-獲取背景圖片及缺口距離d的計算.
七、極驗驗證碼破解-總結.
參考文獻.
運行截圖.
四、極驗驗證碼破解-分析geetest.js,得到所需參數(shù)
1. 為了找出如何生成userresponse和a,我們在geetest.js中搜索userrespnse,發(fā)現(xiàn)只有一處提到userresponse,如下所示:

可以看出userresponse和a都在上述代碼中賦值。
首先,我們追蹤ca.ra,得到下面代碼:

計算userresponse需要參數(shù)l和challenge,challenge我們已知,下面分析l(先猜測為滑塊移動的距離)。
由

可得到a由n生成,



由上述可知oa.qa的返回值是f,下面繼續(xù)追蹤f:

由上述可知(console為我添加,目的是打印信息),f的返回值即為所求a,觀察其包含??!信息,比較所需a值:

可以發(fā)現(xiàn),目前推測無誤。
2. 我們發(fā)現(xiàn)f依賴于oa下的c函數(shù),追蹤c函數(shù):


觀察c函數(shù)的參數(shù)a,由a[h+1][1]可知a應該是一個二維數(shù)組。
添加如下信息,輸出a的內容:

刷新http://localhost:8000/,查看console控件下的信息:


可以發(fā)現(xiàn),這很大可能就是我們所要找的滑動軌跡Track。
回到之前userresponse中的l參數(shù),我們在相應位置輸出:

查看Console發(fā)現(xiàn):

之前我們猜測l為滑動距離,比較l與Track最后一個坐標,可以發(fā)現(xiàn)l與Track[-1][0]相等,因此驗證我們猜想—l是滑動距離。
3. 要想得到userresponse,需要得到l,需要得到Track,由于Track是隨機采樣生成的離散軌跡坐標序列,因此我們需要根據(jù)缺口的位置來模擬Track。由于Track較難模擬,我們先假設已根據(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ù)破解成功,接下來看a的生成。
4. 之前分析a是由oa下的f函數(shù)生成:

其中參數(shù)a是Track。其中f函數(shù)用到了c函數(shù)、e函數(shù)和d函數(shù)。

根據(jù)js函數(shù)源碼,我將其改寫成python函數(shù)。
# 計算每次間隔? 相當于c函數(shù)
代碼只截取部分,具體細節(jié)后面會開源。




完整的f函數(shù)如上所示,參數(shù)為Track,返回值即為f(也就是所需的a)。
至此,參數(shù)a也破解完成!??!只差最會一步,Track如何得到。
(未完待續(xù))
