栗子是:微信公众平台的登录。 js调试工具:发条js调试工具.rar-桌面系统文档类资源-CSDN下载
一、拿到加密代码
由图可以看到pwd这段数据是被加密成一段由32个字符组成的字符串,应该是一个MD5的加密。
我们用搜索工具搜索一下pwd,查看它所在的js文件。
在js文件里找到了一行可疑是进行加密的代码,因为我们看到它有个substr(0, 16)是用来截取16个字符的函数,我们在这里设置断点。
这时我们再次点一下登录,发送请求。
OK!我们应该没有猜错,执行函数前我们的pwd还没有被加密。
我们在这个函数u里设置一个断点,然后点击“进入下一个函数调用”。
我们进入了这个函数的代码,然后我们复制加密代码到发条js调试工具(加密代码在哪个大括号里我就不细说了)。
复制到发条js调试工具后,点一下格式化,然后加载代码。
报错了,它说'n' 未定义,那我们就在代码前头定义这个变量n, var n = {}。再次点击加载代码。
🆗,这次加载成功了,这就说明了这些代码能正常运行。接下来我们试试这些代码能不能执行加密的操作。
先修改一下代码:
function getPwd(e, t, n) {
return t ? n ? s(t, e) : o(s(t, e)) : n ? r(e) : o(r(e))
}
现在,就可以测试这些代码能否实现加密。
可以看到,加密后的结果跟32个字符的字符串的内容是一样的。
接下来我们就可以用PyExecJS这个模块在python中运行这些js代码。
二、用PyExecJS模块运行js代码
import execjs
# 实例化一个node对象
node = execjs.get()
#js源文件编译
ctx = node.compile(open('a.js',encoding='utf-8').read())
#执行js函数
funcName = 'getPwd("{0}")'.format('123456')
pwd = ctx.eval(funcName)
print(pwd)
三、模拟登录
import execjs
import requests
# 实例化一个node对象
node = execjs.get()
#js源文件编译
ctx = node.compile(open('a.js',encoding='utf-8').read())
#执行js函数
funcName = 'getPwd("{0}")'.format('123456')
pwd = ctx.eval(funcName)
header = {
"user-agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
}
url = "https://mp.weixin.qq.com/cgi-bin/bizlogin?action=startlogin"
data ={
"username": "123@qq.com",
"pwd": pwd,
"imgcode":"",
"f":" json",
"userlang": "zh_CN",
"redirect_url": "",
"token": "",
"lang": "zh_CN",
"ajax": "1"
}
resp = requests.post(url,data= data).text
print(resp)
返回结果: