声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵犯了您的合法权益,请告知,我将及时更正、删除,谢谢。邮箱地址:lc1139411732@163.com
本专题将和大家一起分析、学习猿人学web练习题。不同意见或想法可以评论或私信,大佬勿喷!
练习地址:第一题 js混淆源码乱码 - 猿人学
一、抓包
本题的目标是抓取出全部机票的价格然后求平均值,抓包后发现有一个异步请求返回的内容既是对应的机票价格;可以看出本地只有一个加密参数就是m。根据参数的形态可以将他分为2部分,前面部分像是个md5的密文 + | + 后半部分像是时间戳。
m: 96fb11bc10441289975dd4547e420813丨1666951466
二、堆栈跟踪
1.跟栈后定位到加密位置,可以看出以下代码就是加密的核心 部分了。_0x2268f9 = 时间戳
_0x57feae = oo0O0加密
var _0x2268f9 = Date['\x70\x61\x72\x73\x65'](new Date()) + (16798545 + -72936737 + 156138192)
_0x57feae = oo0O0(_0x2268f9['\x74\x6f\x53\x74\x72' + '\x69\x6e\x67']()) + window['\x66'];
2.跟oo0O0加密函数,进来以后发现代码都被压缩成了1行,看来这题的难点就在这里。我们把oo0O0函数全部拷贝出来进行格式化分析。
三、本地调试
1.执行 oo0O0函数,参数和浏览器一样,报错缺少window。补齐
window = this;
2.报错window.a.length = undefined 补齐,这个可以直接去浏览器调用window.a复制出来。
3.缺少document,由于代码量比较少,补齐。由于代码量比较小,搜索发现一共就掉了4次还都在这一行,我们也可以直接去浏览器把结果复制出来。在最后面我们还可以看到有个window.c,也是一样直接复制出来。
4.报错缺少atob,要知道这个方法是node不存在的。
nodejs 里没有 atob btoa 的方法,这两个方法是浏览器 js 环境中的 window 对象的方法,且这两个方法好像不能转汉字。其实这两个方法就是base64
nodejs 可以用自己的方法实现转 base64
new Buffer(window.b, 'base64').toString()
5.实现加密
我们观察还原后的代码直接看出来这是个md5加密,然后用window.f将结果导出来的。所以也对上了,我们上面的window调用。
本地生成与浏览器对比,结果一致。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
"""
@Author : LingXiaoShuai
@File : 第一题
@Time : 2022-10-27 15:51
@Desc :
"""
# -*- coding: utf-8 -*-
import requests
import execjs
import time
def get_md5_value():
with open(r'第一题.js',encoding='utf-8',mode='r') as f:
get_m = f.read()
psd = execjs.compile(get_m).call('get_m')
# print(psd)
return psd
def get_data(page):
result = 0
m = get_md5_value()
url = f'http://match.yuanrenxue.com/api/match/1?page={page}&m={m}'
# print(url)
headers = {
'accept': 'application/json, text/javascript, */*; q=0.01',
'cookie': 'sessionid=你自己的',
'referer': 'https://match.yuanrenxue.com/match/1',
'User-Agent':'yuanrenxue.project',
}
html = requests.get(url,headers=headers).json()
# print(html['data'])
for nu in html['data']:
result += int(nu['value'])
return result
if __name__ == '__main__':
# get_md5_value()
result = 0
for page in range(1,6):
data = get_data(page)
print(data)
result += data
print(f'结果:{result / 50}')