栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【Python】逆向爬虫-----模拟试客联盟登录(RSA)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Python】逆向爬虫-----模拟试客联盟登录(RSA)

栗子是:登录 - 试客联盟    js调试工具:发条js调试工具.rar-桌面系统文档类资源-CSDN下载

一、拿到加密代码

 可以看到密码被加密了,我们在搜索框里搜索 “password ” ,找到并打开包含该关键词的js文件,查看里面的代码。 

我们找到了这段代码,这段代码里有"RSA"、"encrypted"这些单词,应该是与加密有关的。这段代码的大致意思我们可以读懂:

4782行:serializeArray()这个js函数是用来实现序列化的,我们可以看到他作用于loginForm这个ID的标签,loginForm这个标签就是填写登录信息,也就是说formData是包含用户名和密码的一个数组。

4783行:把RSAKeyPair()函数返回的结果赋予给变量key。

4785行:进行是否为“密码框”判断。

4786行:把参数key和密码框内容传入encryptedString()进行加密并把结果赋予给密码框里内容。

我们在4786行设置断点。再次发送登录请求。

由图我们可以看到RSAKeyPair()函数里传入了"100001"、空内容、rsa_n这个三个参数。其中rsa_n这个参数是一个密文。接下来我们要找到获取密文的 url。

我们搜索rsa_n,找到了请求rsa_n密文的url。接下来我们进入RSAKeyPair()函数所在的js文件。

复制js文件里的全部代码到js调试器中, 然后再加上下面这段js代码(注意这里的rsa_n变量现在是测试用的,到时候要作为参数传入getPwd()函数):

function getPwd(p) {
setMaxDigits(131);
var rsa_n = "DC1683EEAA2B709F97743773E18F53E3C9A15D12465CE82227A6E447E6EC590D0B569876BB631B0AB4D67881E7EC874066D6E022E2978B4C6EAA8903EC1774AAE040A3BEAF9C2B48730ADD46BEF5F0C8109DB6FCEFED0F4A84CCD7AFFDB4FB4214DA0D0FF1A8E2831E81FA4D7C2F4346184EEC87CE42230FC320B2B4E392ECDF";
var key = new RSAKeyPair("10001", '', rsa_n);
return encryptedString(key, p);
}

 输入参数、加载代码、计算表达式,ok运行成功!拿到了加密后的结果。


二、在Python中拿到加密后的密文

先改一下js代码:

function getPwd(p,rsa_n) {
setMaxDigits(131);
var key = new RSAKeyPair("10001", '', rsa_n);
return encryptedString(key, p);
}

拿到加密后的密文:

import execjs
import  requests
import re
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 = "http://login.shikee.com/getkey?v=fbb1d0fcaa1e2d9c4c6e321ba6c5cc5f"

resp = requests.get(url,headers=header).text #拿到ras_n的密文
ex = 'var rsa_n = "(.*?)";' #正则
ras_n = re.findall(ex, resp)[0]

node = execjs.get() #创建node对象
pwd = '123456' #密码
ctx = node.compile(open('shikewan.js',encoding="utf-8").read()) #编译js文件
funcName = 'getPwd("{0}","{1}")'.format(pwd,ras_n) #为函数传入参数
password = ctx.eval(funcName) #执行函数
print(password)

 :输出结果:


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/674369.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号