声明
本文仅供参考学习,请勿用于其他途径,违者后果自负!
目标地址:
aHR0cHM6Ly9wYXNzcG9ydC54aW1hbGF5YS5jb20vcGFnZS93ZWIvbG9naW4/ZnJvbVVyaT1odHRwcyUzQSUyRiUyRnN0dWRpby54aW1hbGF5YS5jb20=
一、逆向分析
其中account、nonce、password、signature四个需要逆向。
二、关键字搜索
搜password或者signature,加断点后定位
分析 a.getEncryptPwd即可。
往上翻页,可以找到a赋值的代码。
这一层没有,所以继续往上翻页,找父级。
很明显是webpack。加断点后刷新页面。分析webpack
三、webpack
找到r加载加载器后,ctrl c+v全部复制。新建四个js文件, 分别是01env,02loader,03mode,04index 作用是补环境、加载器、模块和执行
在加载器中打印调用的模块索引/键 本次webpack使用的是数组,所以需要打印索引。
并执行。
在补环境定义一个变量 xx={},并且在加载器中接收函数i xx=i;
在index文件中导入前三个文件,然后执行,提示window不存在,在env中补上window=global。再次执行,提示没有模块。
直接复制整个模块,ctrl c+v到03mode中,再次执行
又报错了,直接全局搜索这个参数,第一个就是我们需要的
也是全选,ctrl c+v到03mode中, 放在上一串代码前面。(这里也可以新建),继续执行
接下来就是补环境,需要用环境代理。补环境流程不做讲解。
代码如下:
window = global;
xx = {}
window.addEventListener = function () {
}
document = {
createElement: function (res) {
if (res == 'canvas') {
// console.log('document.createElement:::', res)
return canvas
}
if (res == "div") {
// console.log('document.createElement:::', res)
return div
} else {
// console.log('document.createElement:::', res)
}
},
addEventListener: function (res) {
// console.log('document.addEventListener:::', res)
return DOMContentLoaded
},
documentElement: {
style: {
fontSize: {}
}
},
getElementById: function (res) {
// console.log('document.getElementById:::', res)
},
body:{
style:{
fontSize:{}
}
}
}
DOMContentLoaded = {}
div = {
style: {},
setAttribute: function () {
}
}
canvas = {
toDataURL: function (res) {
// console.log('document.createElement(canvas):::', res)
return 'image/webp'
}
}
navigator = {
userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}
location={}
执行结果如下:
这里用execjs行不通,因为js是不自动结束的。
所以需要在04index.js中 使用params = process.argv 接收参数
然后再python中,使用
data = {
'account': phone, # 账号
'password': pwd, # 密码
'nonce': nonce,
}
ret = subprocess.check_output(f'node 04index.js {data}', shell=True) 传入参数并调用04index.js。
ret返回的是字符串,需要使用函数将其转换成字典。
def parse_custom_dict_string(s):
# 使用正则表达式查找所有形如 "key: 'value'" 的子串
# 注意:这个正则表达式假设值被单引号包围,且键不包含空格或特殊字符(除了下划线)
# 如果键或值的格式可能更复杂,则需要调整正则表达式
matches = re.findall(r'(\w+):\s*\'([^\']*)\'', s)
# 将匹配结果转换成一个字典
return {k: v for k, v in matches}
然后获取account、password、nonce、signature四个逆向值,并发起登录请求即可。
结果如下: