溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

用Python模擬網(wǎng)站中對JavaScript加密的方法

發(fā)布時間:2021-09-18 09:42:07 來源:億速云 閱讀:190 作者:chen 欄目:編程語言

這篇文章主要介紹“用Python模擬網(wǎng)站中對JavaScript加密的方法”,在日常操作中,相信很多人在用Python模擬網(wǎng)站中對JavaScript加密的方法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”用Python模擬網(wǎng)站中對JavaScript加密的方法”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

第一種是改寫JavaScript的代碼

這沒什么好說的,不過只適用于比較小而且不復(fù)雜的JavaScript代碼片段。比如人人網(wǎng)上發(fā)站內(nèi)信的頁面有這樣的一個隱藏post數(shù)據(jù):

<input type="hidden" name="biz" value=0 id="xn_biz"/>

在頁面上biz的值為0,但是post的時候就會變成類似于941_683291223928232的字串,仔細(xì)看一下頁面的源代碼,就會發(fā)現(xiàn)這段驗證的加密字串是通過一段JavaScript的代碼生成的:

  1. <script>var mREOQQ=&rsquo;A`ZDu^`&rsquo;;var VKMHX=&rsquo;^&+*L/~&rsquo;;var 
    uCHKAU=0;var rTIU;var wCJS=”;var yAYH=Math.floor
    (VKMHX.length/2);while(uCHKAU<mREOQQ.length)
    {rTIU=mREOQQ.charCodeAt(uCHKAU++);var aYDG=VKMHX.
    charCodeAt(rTIU%VKMHX.length);aYDG=String.
    fromCharCode(aYDG);if(aYDG==&rsquo;L')aYDG=&rsquo;<<&rsquo;
    ;if(aYDG==&rsquo;~')wCJS+=~rTIU*(-1);else{wCJS+=Math.
    floor(eval(rTIU+aYDG+yAYH));}}var ab=941;
    ab+="_";ab+=wCJS; document.getElementById("xn_biz")
    .value=ab;</script>  

這其實類似一段小型的驗證加密,它先隨機(jī)生產(chǎn)一段字串,復(fù)制給隨機(jī)產(chǎn)生的一個變量名,再隨機(jī)生成一段運算符,復(fù)制給另一個隨機(jī)生成的變量名,然后對這兩個變量進(jìn)行一系列操作和運算,生成一個類似于941_683291223928232的字串。每次刷新頁面這段代碼中產(chǎn)生的字串和變量名都是不一樣的,但是仔細(xì)研究這段代碼,算法都是相同的,只要得到字串和運算符串,就可以生成這串驗證密鑰了。

所以將這段代碼簡單的改寫成python代碼,問題得到解決,在python模擬網(wǎng)站的JavaScript加密過程下面代碼中code就是提取出來的上述JavaScript代碼中的mREOQQ,operator代表VKMHX,而xn則代表ab的初始值,***得到的xn_biz就是我們最終需要的驗證密鑰了。

def __genBizCode(code, operator, xn):  rXHU = unicode( code )  yAMKEN = operator VCHEN, yEEJ, eLKKIH = (0, 0, ”);   KFNQH = int( len(yAMKEN)/2 );  while VCHEN < len(rXHU):  yEEJ = ord(rXHU[VCHEN])  VCHEN += 1  index = yEEJ % len(yAMKEN)  dDWE = ord( yAMKEN[index] )  dDWE = chr(dDWE)  if dDWE==&rsquo;L':  dDWE = &lsquo;<<&rsquo;  if dDWE==&rsquo;~':  eLKKIH += str( ~yEEJ*(-1) )  else:  reg = &lsquo;%d%s%d&rsquo; % ( yEEJ, dDWE, KFNQH)  eLKKIH += str( int( eval(reg) ) )  xnxn_biz = xn + &lsquo;_&rsquo;  xn_biz += eLKKIH  return xn_biz

這種方法沒有依賴性,但是使用的范圍較窄,一是要求算法簡單才能改寫,二是要求算法固定,如果每次刷新頁面算法都不一樣,這種方法就不使用了。下面會談到一種通用性的方法。

第二種是在python中運行js代碼由于QZone和QQ校友登陸的時候,post的密碼都進(jìn)行了加密,搜索了一下,發(fā)現(xiàn)很多人都研究過這個東東。騰訊將用戶的密碼和驗證碼一起,通過一些js代碼進(jìn)行加密,生成一個32為的密鑰最終post到服務(wù)器上。

對于這個加密算法,網(wǎng)上大部分流傳的說法是,先將用戶密碼進(jìn)行3次md5的加密,轉(zhuǎn)成大寫的32位字符串,再將驗證轉(zhuǎn)換成大寫,與前面的32位md5大寫字符串相加,得到一個36位的字符串,***對這個36位的字串進(jìn)行md5加密并轉(zhuǎn)換成大寫字串,得到最終post的密鑰。

網(wǎng)上很多人說用標(biāo)準(zhǔn)的md5加密,但是我用python的hashlib里的md5進(jìn)行上述的加密,得到的結(jié)果卻與標(biāo)準(zhǔn)結(jié)果不同,于是只能尋求其他辦法。后來在Google的時候搜到了在python中利用windows的插件Windows ScriptControl運行其他腳本語言的方法,不僅適用js,還可以運行vbs等。

首先需要安裝Windows ScriptControl插件,可以去微軟的官網(wǎng)上下載。其次還需要安裝python的win32庫,然后就可以簡單的如下執(zhí)行:

  1. import win32com.client  

  2. def readJsFile(filename):  

  3. fp = file( filename, &lsquo;r&rsquo; )  

  4. lines = ”  

  5. for line in fp:  

  6. lines += line  

  7. return lines  

  8. def driveJsCode(code, func, paras=None):  

  9. js = win32com.client.Dispatch
    (&rsquo;MSScriptControl.ScriptControl&rsquo;)  

  10. js.Language = &lsquo;JavaScript&rsquo;  

  11. js.AllowUI = False 

  12. js.AddCode( code )  

  13. if paras:  

  14. return js.Run(func, paras[0], paras[1])  

  15. else:  

  16. return js.Run(func)  

  17. if __name__ == &lsquo;__main__&rsquo;:  

  18. code = readJsFile( &lsquo;comm.js&rsquo; )  

  19. p = driveJsCode
    ( code, &lsquo;myPreProcess&rsquo;, [password, verfcode] )  

  20. print &lsquo;The decoded code is %s&rsquo; % p   

這種方法通用性強(qiáng),而且即使服務(wù)器改變算法,依然可以得到正確的加密驗證碼。

到此,關(guān)于“用Python模擬網(wǎng)站中對JavaScript加密的方法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI