Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥

我们来看下试客联盟的逆向分析,切换到密码登陆。

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第1张图片


JS代码解析

我们进行抓包。经过分析,我们看到密码可能在这个js里实现

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第2张图片

点进去后,我们发现源码里有一段var key = new RSAKeyPair("10001",'',rsa_n);,那我们就怀疑这个可能就是密码的实现方式。我们打断点验证一下,果然停留在了这里。我们来看下这一部分源码:

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第3张图片

setMaxDigits(131);
            var formData = $("#loginForm").serializeArray();
            var key = new RSAKeyPair("10001",'',rsa_n);
            for (var i = 0; i < formData.length; i++) {
     
                if (formData[i].name === 'password') {
     
                    formData[i].value = encryptedString(key, formData[i].value);
                    break;
                }
  • setMaxDigits(131);:不知道是什么,先留着
  • serializeArray():这是一个js函数,其作用是:使用来实现序列化(对登陆页面的表单中的值进行序列化,序列化成一个数组,数组元素就是表单中的数据【用户名和密码】)
  • var key = new RSAKeyPair("10001",'',rsa_n);:说明密码是RSA加密方式key就是公钥,公钥的生成需要用rsa_n,rsa_n是什么鬼目前还不知道。后续对其做处理
  • for循环:如果表单的名字是password,那么进行加密。

我们进入setMaxDigits(131)encryptedString的js函数,发现他俩都在一个barrett.js文件里,我们复制整个文件里的代码放到调试工具里。

然后我们再写一个函数getPwd(),把加密的代码改写并复制进去调试下:

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第4张图片

我们看到,计算后提示rsa_n未定义。

我们可以想到,整个rsa_n肯定在网页源码中,我们来搜下:

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第5张图片

没搜到!那我们就把整个网页刷新下,在搜索下:

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第6张图片

现在我们搜索到了,复制rsa_n的值,来调试计算下:

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第7张图片

这时,我们就获取到了加密后的密码。


Python代码实现

创建shike.js文件,并修改上述js代码复制进去。

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第8张图片

Python代码:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import re
import execjs

# 获取rsa_n
url = 'http://login.shikee.com/getkey?v=fb8ccb83550b28b545fe22c68aef5091'
headers = {
     
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}
page_text = requests.get(url=url, headers=headers).text
#正则取出
ex = r'var rsa_n = "(.*?)";'
rsa_n = re.findall(ex, page_text)[0]

# 加密的逆向
node = execjs.get()
pwd = '123456'
file = 'shike.js'
ctx = node.compile(open(file, encoding='utf-8').read())
funcName = 'getPwd("{0}","{1}")'.format(pwd, rsa_n)
password = ctx.eval(funcName)
print(password)

这样就获取了密文。

关注Python涛哥!学习更多Python知识!

Python爬虫从入门到精通:(44)JS逆向:试客联盟的逆向分析_Python涛哥_第9张图片

你可能感兴趣的:(python,爬虫,python,爬虫,javascript)