一、准备工作
js调试:发条js调试工具
Python调用js代码,首先安装node环境,然后安装PyExecJS-> pip install pyexecjs
二、开始逆向
进入登录页面:https://passport.jd.com/uc/login?ltype=logout
发现是使用ajax来提交账号密码,查看ajax携带的数据:
一番查找,发现nloginpwd是密码加密后的密文,需要对pwd加密方法进行查找。
定位到165行,使用的是rsa加密。
接着向下执行,进入到上图的函数。JSEncrypt就是加密算法的实现,进入到这个类中,复制所有的代码到JS调试工具中调试。
在调试过程中,发现缺少pubKey,查看代码,发现pubKey在页面中存在,如下图中:
在这个过程中,同时也发现ajax登录请求中需要携带的数据都在这个页面中。
三、代码
说明:只实现了密码加密的逻辑,其他简单的不继续进行(🐶保命)
js代码:
//以上省略rsa加密实现……
function getPwd(pwd, pubKey) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(pubKey);
return encrypt.encrypt(pwd);
}
python:
import execjs
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.55 Safari/537.36',
'Referer': 'https://passport.jd.com/uc/login?ltype=logout'
}
node = execjs.get()
with open('jd.js', 'r', encoding='utf-8') as f:
ctx = node.compile(f.read())
pwd = ctx.eval(f'getPwd("123456")')
print(pwd)