逆向完美世界登录
js代码调试阶段
1.查看密码关键字段  2.Ctrl+shift+f全局搜索:password,找到相关js文件  3.从代码的setpublickey、encrypt关键字可以看出,使用了非对称加密算法  4.此处打断点,再次运行,进入函数构造内部  5.经过分析可知,该文件内所有代码都涉及到非对称加解密,所以直接全部copy出来进行调试  6.下图报错,navigator和window未定义,解决方法:因为这两个都是内置函数,所以只需要在代码最前面加上navigator=this;window=this;  7.再回到一开始打断点的地方,把几个关键的函数调用给抠出来  8.上图中的e.setPublicKey($('#e').val()); 就是获取主文件,id=e的参数值,所以我们可以在login文件中找到value的值,用该值替换(’#e’).val()  9.最后修改完成的代码: 
爬虫代码编写
import requests
from pyquery import PyQuery
import execjs
from lxml import etree
url = 'https://passport.wanmei.com/sso/login?service=passport&isiframe=1&location=2f736166652f'
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.20 Safari/537.36'
}
response = requests.get(url=url, headers=headers).text
# doc=PyQuery(response)
# public_key=doc('#e').attr("value")
#定位:
tree = etree.HTML(response)
public_key = tree.xpath('//input[@id="e"]/@value')[0]
node = execjs.get()#实例化一个对象
pwd = '123'
ctx = node.compile(open('./wanmeishijie.js', encoding='utf-8').read())#编译
funcName = 'getPwd("{0}","{1}")'.format(pwd, public_key)
pwd = ctx.eval(funcName)
print(pwd)
|