前言
只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢!
目标网址: aHR0cHM6Ly9oNS53YWltYWkubWVpdHVhbi5jb20vd2FpbWFpL21pbmRleC9tZW51
分析过程可以看这篇 写的挺详细的 JS逆向—获取某知名外卖平台数据(_token)
根据分析可以在网页控制台直接运行一下window.Rohr_Opt.reload('')
如图 是这个方法生成的
把js文件down下载开始搭架子 这里用的java j2v8库 J2V8–java调用JS文件执行js函数的高效类库,高并发下表现依然高效
主要是jdk17不能直接运行js 而且这篇文章也写了效率很低 所以采用j2v8库
Maven地址 linux和mac的自行搜索 替换
<dependency>
<groupId>com.eclipsesource.j2v8</groupId>
<artifactId>j2v8_win32_x86_64</artifactId>
<version>4.6.0</version>
</dependency>
之前是用的nodejs+jsdom方式 然后http调用 每次都得运行node才能跑很麻烦 这次直接用java跑js
文件下载到java目录开搞
public void runScript() {
// 文件地址
String JS_BASE_PATH = System.getProperty("user.dir") + "/lib/rohr.min.js";
// 读取内容 用的hutool库
String jsContent = FileUtil.readString(JS_BASE_PATH, StandardCharsets.UTF_8);
V8 runtime = V8.createV8Runtime();
runtime.executeVoidScript(jsContent);
// 释放内存
runtime.release(true);
}
给补上就行了var Rohr_Opt = {};
注意一定要严格用var和分号结尾
用let的话会报错
回归正题 然后补document 按浏览器内容能补全就补全
然后就是一些window navigator 自己补全就行
然后就是这个方法会报错 只能修改源码 这个参数e直接修改为空数组 分析的文章也有些 也可以按文章改
filter: function(e, dY) {
var dQ, iH = [];
// 直接改为空数组
e = [];
for (dQ = 0; dQ < e.length; dQ++) {
dY(e[dQ], dQ, e) && iH.push(e[dQ])
}
;return iH
},
然后j2v8是没有浏览器的setTimeout和setInterval方法的 直接补空的
function setTimeout(arg1, arg2) {}
function setInterval(arg1, arg2) {}
已经能正常运行 然后添加function进行调用
Rohr_Opt是之前添加的 经过脚本运行完会有一个reload方法 参数为url 可以自行搜索reload方法然后断点看入参
function generateToken(url) {
return Rohr_Opt.reload(url);
}
接下来就是java调用了
public void runScript() {
// 文件地址
String JS_BASE_PATH = System.getProperty("user.dir") + "/lib/rohr.min.js";
// 读取内容 用的hutool库
String jsContent = FileUtil.readString(JS_BASE_PATH, StandardCharsets.UTF_8);
V8 runtime = V8.createV8Runtime();
runtime.executeVoidScript(jsContent);
// 函数入参数组
V8Array param = new V8Array(runtime);
param.push("http://xxxx.com");
// 运行函数
String ret = runtime.executeStringFunction("generateToken", param);
System.out.println(ret);
// 记得手动释放
param.release();
// 释放内存
runtime.release(true);
}
成功生成
测试一下 根据之前文章还需要一个mtgsig参数 没问题