本文主要是介绍Python爬虫从入门到精通:(45)JS逆向:空中网逆向分析:js混淆_Python涛哥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
我们来看下空中网的逆向分析
js逆向分析
抓包后,经过分析,我们看到password在一个login-handler xxx.js
文件中
我们点进去搜索password
:
但我们看到,password
在一段很长的文本中。
这里就涉及到了js混淆。
js混淆:
什么是js混淆:
将js核心的相关代码进行变相的加密,加密后的数据就是js混淆之后的结果。
js反混淆:
-
反混淆的线上工具(不理想)
-
浏览器自带的反混淆工具设置(推荐)
开发者工具中的
Sourse -> settings -> Sources ->第一项勾选
进行关键字的全局搜索 ->VMxx
(就是反混淆后的代码)
然后我们点进去。搜索password
,发现有好几处疑是加密的关键词,都打上断点,测试下:
我们看到了代码停留在了120行,说明这行就是密码加密。
我们在调试工具中来写一段js代码。
function getPwd(pwd) {
return encrypt(pwd, data["dc"]);
}
这里有一个data["dc"]
,我们不知道是什么。稍后再处理。
我们点击encrypt
所在的函数进去,把里面所有的代码复制到调试工具里。
代码加载成功后,我们再来搜索这个data["dc"]
.
果然不出所料,这里是搜索不到的,我们只能换种方式了。
我们知道,秘钥不是在前台网页中,就是请求获取到的。我们可以分析下请求后的响应数据,看看有没有类似的数据:
果然我们在这个请求响应中找到了dc
的值,我们复制值来测试下:
但这里又出现了错误。
在刚才的js代码中,encrypt(pwd, dc)
前是有个this.
的,那么这个this代表的是哪个对象呢?我们来分析下:
点击encrypt
查看最上面的引用,看到对象就是KZLoginHandler
.
好,那我们就继续改写代码:
计算结果,得出了正确的值。
Python代码实现
创建kongzhongwang.js
文件,把上述js代码改写并复制进去:
function getPwd(pwd, dc) {return KZLoginHandler.encrypt(pwd, dc);
}
Python代码:
import requests
import re
import execjs# 获取秘钥
url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1635517824810'
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
print(page_text)
写到这里,我们发现并没有打印出内容。
那是因为,这个url的headers
还需要Referer
:
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','Referer': 'https://passport.kongzhong.com/'
}
我们来继续写代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import re
import execjs
import json# 获取秘钥
url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1635517824810'
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','Referer': 'https://passport.kongzhong.com/'
}
page_text = requests.get(url=url, headers=headers).text
ex = r'KZLoginHandler.jsonpCallbackKongZ\((.*?)\)'
dc = re.findall(ex, page_text)[0]
dc = json.loads(dc)['dc']# 加密的逆向
node = execjs.get()
ctx = node.compile(open('./kongzhongwang.js', encoding='utf-8').read())
funcName = 'getPwd("{0}","{1}")'.format('123456', dc)
password = ctx.eval(funcName)
print(password)
这样,我们就获取到了密文!
知识点
- 了解
js混淆
秘钥
找不到时,可以到响应数据里找headers
里必要时,要加上Referer
、Cookies
等数据
关注Python涛哥!学习更多Python知识!
这篇关于Python爬虫从入门到精通:(45)JS逆向:空中网逆向分析:js混淆_Python涛哥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!