最近观看了志远大佬关于某书vmp思路分析的公开课,感觉有了新的思路,特此进行整理,这一篇重点记录参数入口方法定位的思路,望懂行的大佬轻喷。
网址:aHR0cHM6Ly93d3cueGlhb2hvbmdzaHUuY29tL2V4cGxvcmU=
接口:aHR0cHM6Ly9lZGl0aC54aWFvaG9uZ3NodS5jb20vYXBpL3JlZGNhcHRjaGEvdjIvZ2V0Y29uZmln
思路一:志远大佬视频中的方法(比较通用且快速的方法,推荐:⭐⭐⭐⭐⭐)
1. 通过查看x-s参数可以发现XYW_之后的内容为base64加密数据,使用atob方法进行节能能得到一个json字符串内容
2. 查看内容发现内部包含payload项,因x-s为json字符串经base64加密而来,可以判断必定使用JSON.stringify方法进行对象转字符串操作,
此处可以对JSON.stringify方法进行hook获取参数生成位置
3. hook方法如下
4. 有了hook方法,接下来需要定位何时hook,那么肯定需要定位何时下hook
直接搜索"/api/redcaptcha/v2/getconfig",发现在vendor-dynamic.cc05cd1.js内定义了变量
redConfig = "/api/redcaptcha/v2/getconfig",继续搜索redConfig,发现只有一处用到该变量,在方法
function verifyInit_ConfigHttp() {
var t;
return browser.ZP.http.post(concat_default()(t = "".concat(getRedHost())).call(t, redConfig), {}, {
withCredentials: !0,
transform: !1
})
}
内,此处直接在return出下断点,然后进行hook即可
5. hook后通过跟栈信息可以发现参数生成入口在vendor-dynamic.cc05cd1.js内
l = (a && void 0 !== window._webmsxyw ? window._webmsxyw : encrypt_sign)(s, i) || {};
e.headers["X-t"] = l["X-t"],
e.headers["X-s"] = l["X-s"]
位置,即l包括了生成的x-s,x-t参数,最后跟栈可发现在window._webmsxyw方法内,而window._webmsxyw方法在6e0d0a976c31ec4cf07d8dfaea68aefe79a8c678.js文件内,通过查看该js文件可以发现为一个jsvmp流程
JSON.stringify_ = JSON.stringify;
JSON.stringify = function () {
if (arguments[0]&&arguments[0]['payload']) {
debugger
}
let temp = JSON.stringify_.apply(this,arguments)
return temp
}
思路二:比较取巧的思路(不一定通用,推荐:⭐⭐⭐)
直接全局搜索X-s可以找到几个关键位置,全部在vendor-dynamic.cc05cd1.js文件内,全部下断点,刷新页面可在
l = (a && void 0 !== window._webmsxyw ? window._webmsxyw : encrypt_sign)(s, i) || {};
处成功断住程序,表示此处即为x-s生成参数入口位置
思路三:硬刚的思路(一定能找到,但是效率较低,推荐:⭐⭐⭐⭐)
通过观察栈,以及跟栈打断点的方式可以定位带关键位置在vendor-dynamic.cc05cd1.js文件内的u内的fulfilled方法内,关键代码如下,
此处e内包含了headers信息,并且携带了X-s数据,而上一步为被循环调用的方法,t(e, i, o);
由此可以断定,X-s一定在循环执行的t方法内生成,而t为传入参数,直接监控e可发现第五次调用的时候会生成X-s参数,
因此单步执行此处断点,能进入到方法signAdaptor内,最后会跳如xsXt方法,观察可知关键函数仍为window._webmsxyw
u = {
fulfilled: function (e) {
e !== o && (0,
S.ZK)("[Http Warning] config reference has been changed during dispatch interceptor");
var r = t(e);
if (!r || !r.then)
throw new Error("[Http Exception] send must return a promise object");
return r
}
};
p = function(t) {
return function(e) {
return t ? t(e, i, o) : e
}
};
function signAdaptor(t, e) {
return signAdaptor_awaiter(this, void 0, void 0, (function() {
return signAdaptor_generator(this, (function(r) {
return xsXt(t, e),
xsCommon(t, e),
[2, e]
}
))
}
))
};
function xsXt(t, e) {
var r = e.url
, n = e.params
, o = e.paramsSerializer
, i = e.data
, a = t.configInit
, u = t.xsIgnore
, c = t.autoReload;
if (!(!some_default()(u).call(u, (function(t) {
return index_of_default()(r).call(r, t) >= 0
}
)) && shouldSign(r)))
return e;
c && signLackReload();
try {
var s = getRealUrl(r, n, o)
, l = (a && void 0 !== window._webmsxyw ? window._webmsxyw : encrypt_sign)(s, i) || {};
e.headers["X-t"] = l["X-t"],
e.headers["X-s"] = l["X-s"]
} catch (f) {}
return e
};
视频连接:
https://www.bilibili.com/video/BV1DA4m137ua/?vd_source=ef8c870f1871754d3268729bd72f9086#reply209530914496
下一篇会整理视频中插桩的思路