前言:记录一下
分析参数
从图中可以看到第一页没有什么加密参数,第二页才开始有 ,其中最为关键的是v,t
加密入口方向
进去后会看到这可能是个AES加密
在这里下个断点
会看到这个pwd和secret_key
向上跟栈,他们是从这里return yU_[_v].apply(yU_, __)进来的
其实这两处就是本题最关键的了,对于jsvmp常见的有两种方法,第一中是补环境,第二个是日志断点算法还原,我这里用的是日志断点算法还原,分别在这两个位置
第一个
第二个
下完后刷新看控制台
这是日志结果 , 从第一红线处可以看到将十位数的时间戳通过 toString(16)转化为16进制的字符串64dfad00 ,secret_key =64dfad00+64dfad00,pwd= 2|72m569,71m569,70m569,70d569,70u569,2为page,72m569,71m569,70m569,70d569,70u569是滑动轨迹,可以固定
secret_key其实就是AES加密的密钥,通过parse化为words
pwd是AES加密的内容 ,通过parse化为message,
iv和key都是通过secret_key得来的,iv=key
分析到这就差不多了
v=['N', 'j', 'z', 'w', 'B', 'l', 'C', 's', 'F', 'C', 'w', 'k', 'I', 'f', '9', 't', 'i', 'z', 'Y', '3', '7', 'C', 'R', '5', 'd', 'e', 'M', 'A', 'R', 'T', 'p', 'S', 'e', '1', 'y', 'h', 'X', 'B', 'V', 'H', 'r', 'G', 'U', 'P', 'b', 'F', 'v', 'Q', 'A', '6', '7', 'w', 'R', 'K', 'F', 'b', 'D', 'i', 'X', 'F', 'C', '1', 'm', '2'].join ('')
JS加密代码
const CryptoJS = require("crypto-js") function getEncrypteddata(page) { t = Date['parse'](new Date()) / 1000 secret_key = t.toString(16) + t.toString(16) key = iv = CryptoJS.enc.Utf8.parse(secret_key); srcs = CryptoJS.enc.Utf8.parse(`${page}|56d400,56d400,56u400,56u400,136u16`); let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return { page: page, t: t, v: encrypted.toString(), } }
python代码
import execjs import requests from loguru import logger js_code=execjs.compile(open('demo.js','r',encoding='utf-8').read()) cookies = {自己的cookie} headers = {自己的headers} nums=0 for page in range(1,6): params=js_code.call('getEncrypteddata',page) if page>3: headers['user-agent']='yuanrenxue.project' response = requests.get('https://match.yuanrenxue.com/match/18data', headers=headers, params=params,cookies=cookies) res=response.json() logger.debug(res) for k in res['data']: nums+=k['value'] logger.debug(nums)
提交结果图
如果还是不是很清楚,可以参考下面的文章
js逆向之猿人学-反混淆刷题平台第十八题(jsvmp) - 知乎 (zhihu.com)
如有侵权请及时联系删除,谢谢!!!