温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

用Python模拟网站中对JavaScript加密的方法

发布时间:2021-09-18 09:42:07 来源:亿速云 阅读:206 作者:chen 栏目:编程语言

这篇文章主要介绍“用Python模拟网站中对JavaScript加密的方法”,在日常操作中,相信很多人在用Python模拟网站中对JavaScript加密的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”用Python模拟网站中对JavaScript加密的方法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

第一种是改写JavaScript的代码

这没什么好说的,不过只适用于比较小而且不复杂的JavaScript代码片段。比如人人网上发站内信的页面有这样的一个隐藏post数据:

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

在页面上biz的值为0,但是post的时候就会变成类似于941_683291223928232的字串,仔细看一下页面的源代码,就会发现这段验证的加密字串是通过一段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>  

这其实类似一段小型的验证加密,它先随机生产一段字串,复制给随机产生的一个变量名,再随机生成一段运算符,复制给另一个随机生成的变量名,然后对这两个变量进行一系列操作和运算,生成一个类似于941_683291223928232的字串。每次刷新页面这段代码中产生的字串和变量名都是不一样的,但是仔细研究这段代码,算法都是相同的,只要得到字串和运算符串,就可以生成这串验证密钥了。

所以将这段代码简单的改写成python代码,问题得到解决,在python模拟网站的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的密码都进行了加密,搜索了一下,发现很多人都研究过这个东东。腾讯将用户的密码和验证码一起,通过一些js代码进行加密,生成一个32为的密钥最终post到服务器上。

对于这个加密算法,网上大部分流传的说法是,先将用户密码进行3次md5的加密,转成大写的32位字符串,再将验证转换成大写,与前面的32位md5大写字符串相加,得到一个36位的字符串,***对这个36位的字串进行md5加密并转换成大写字串,得到最终post的密钥。

网上很多人说用标准的md5加密,但是我用python的hashlib里的md5进行上述的加密,得到的结果却与标准结果不同,于是只能寻求其他办法。后来在Google的时候搜到了在python中利用windows的插件Windows ScriptControl运行其他脚本语言的方法,不仅适用js,还可以运行vbs等。

首先需要安装Windows ScriptControl插件,可以去微软的官网上下载。其次还需要安装python的win32库,然后就可以简单的如下执行:

  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   

这种方法通用性强,而且即使服务器改变算法,依然可以得到正确的加密验证码。

到此,关于“用Python模拟网站中对JavaScript加密的方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI