网站链接
aHR0cHM6Ly9tb2JpbGVuZXh0LXdlYi5tZWl0dWFuLmNvbS9yYW5raW5nTGlzdD9ib2FyZFR5cGU9OCZjaT0wMDczJmFyZWFJZD02NzIzJmNhdGVJZD0yJmRpc3RyaWN0SWQ9MCZwb2lJZD01OTUxNzUwMzEmZj1hbmRyb2lkJmxhdD0zNi41MjYwNDYxOTExNTk0NDUmbG5nPTEyMi4wNjIyMTc4MTE=
(base64解密后可见)
正文
就是这个参数
扫了一眼网站源代码,然后看了看加载的js,发现了可疑的代码。那就打上断点从这里开始分析
一步步往下再走,会发现走到了这个js里。
先看下这个H5guard都有什么吧
有兴趣的可疑所有函数都打上断点看一看都干了什么。这里就不在跟了,直接说结果。首先是初始化的initWithKey,然后最后会调用sign出加密的结果。
有时间的话可以跟一跟,扣一个纯算。这里怎么简单怎么来吧,补环境。直接上补环境的代码,这里也直接用jsdom吧
innerWidth = 391
innerHeight = 855
const jsdom = require("jsdom")
const {JSDOM} = jsdom;
const dom = new JSDOM("", {url: "https://mobilenext-web.meituan.com/"})
window = dom.window
document = window.document
XMLHttpRequest = window.XMLHttpRequest
location = {
"ancestorOrigins": {},
"href": "https://mobilenext-web.meituan.com/",
"origin": "https://mobilenext-web.meituan.com/",
"protocol": "https:",
"host": "mobilenext-web.meituan.com/",
"hostname": "mobilenext-web.meituan.com/",
"port": "",
"pathname": "/meishi/c11/",
"search": "",
"hash": ""
}
navigator = {
appName: "Netscape",
appVersion: "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
userAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
vendor: 'Google Inc.'
}
screen = {
availHeight: 1040,
availLeft: 0,
availTopL: 0,
availWidth: 1920,
colorDepth: 24,
height: 1080,
isExtended: true,
orientation: {
type: "landscape-primary"
},
pixelDepth: 24,
width: 1920
}
document.cookie = ""
把H5guard.js里所有的代码都复制出来放到本地,然后加上上面的补环境代码,自己写个调用initWithKey和sign的代码后,在node下一运行。来坑了。会卡着不动。最后返回源码去分析,看到了一个这个函数。因为本身sign函数就是异步的。这里在node下还会一直卡住。
修改下,就把这个函数制空,让他return this
就好了。
因为sign是异步的,最简单的调用方法还是写成node接口来调用,不然一不小心就会绕进死胡同。直接给出代码
// 引入依赖包
var express = require('express');
var bodyParser = require('body-parser');
// 引入自定义的JS文件
var JS = require('./h5_mtgsig');
// 创建应用实例
var app = express();
app.use(bodyParser.urlencoded({ extended:true }));
app.use(bodyParser.json());
app.post('/h5_mtgsig', function (request, response) {
let result = request.body;
let h5_url = result.h5_url;
JS.get_mtgsig(h5_url).then(resu => {
response.send(resu);
});
});
// 启动服务,监听指定主机和端口上的连接
app.listen(3000, () =>{
console.log('开启服务,端口3000')
});
// 启动命令cmd : node 文件名
// npm install -g express # -g表示是全局安装
// http://localhost:端口/路由地址
这样就结束了,调用接口,传入sign需要的参数就能得到Mtgsig的值了
小结
补环境的话还算简单,跟纯算的话,需要点耐心,但整体也不是特别难,最好能ast解混淆后分析,会更轻松一点。