网站:
https://www.jizhy.com/44/search?searchVal=%E5%9B%9B%E5%B7%9D
目标:逆向sign
使用XHR断点跟栈 searchcenter/search
(1)
(2) 从 h.request 开始跟,因为有拦截器
(3) 不停步入,直到发现加密入口
不停跟............直到这里初露端倪
最后发现加密入口
然后开始破解参数
var t = {
search_key: "北京",
search_type: 3,
};
var params = Qt(t);
function Qt() {
var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}
, e = {
app_id: F,
ts: +new Date,
platform: "desktop",
v: 210
};
Object.assign(t, e);
var n = Wt(t);
return n += "&key=" + U,
t.sign = Xt(n),
Object.assign(t, e)
}
发现所在文件是一个webpack,猜测是webpack 扣代码就可以
目标:尝试找加载器函数
找到加载器函数:
function f(t) {
if (n[t])
return n[t].exports;
var r = n[t] = {
i: t,
l: !1,
exports: {}
};
return e[t].call(r.exports, r, r.exports, f),
r.l = !0,
r.exports
}
将加载器所在的自执行函数扣下来,后续补充模块参数
在加载器函数里面加上打印,便于知道使用了哪些模块
// 将加载器函数的作用域设置为全局变量,方便调用
window.load_f = f;
尝试找到入口,关键在Qt
发现Qt 函数在23 模块,尝试将23模块扣下来
保存成功,可以尝试继续调用
报错:猜想应该继续补
在改报错之前,把23模块所在在webpack其他模块也扣下来,后续可能需要用,也可能会解决了报错
发现还是报错,n.d 这里有问题,通过查找分析,n.d 指代的就是前面的f.d
最终发现是函数调用的时的参数有问题,一开始我是这样子调用的,说明是参数有问题
// 查看加载器函数
console.log(window.load_f);
// 调用
var t = {
search_key: "北京",
search_type: 3,
};
console.log(window.load_f.m[23]);
// console.log(window.load_f.m[23].toString());
var module23 = window.load_f.m[23](); // 错误!未传递任何参数
var params = module23.Qt(t);
console.log(params);
在 Webpack 打包的代码中,每个模块实际上是一个函数,例如:
23: function (module, exports, __webpack_require__) {
// 模块23的代码
// ...
}
这个函数接收三个关键参数:
module
:模块实例对象,包含exports
属性(用于导出模块内容)。exports
:模块的导出对象,等同于module.exports
。__webpack_require__
:Webpack 的模块加载函数(即你的代码中的f
或load_f
),用于加载其他依赖模块。
错误原因:参数未正确传递
在原来的代码中:
var module23 = window.load_f.m[23](); // 错误!未传递任何参数
这行代码直接调用模块函数,但没有传递任何参数,导致函数内部的 n
(即 __webpack_require__
)为 undefined
。当模块 23 执行 n.d(e, "b", ...)
时,就会报错 Cannot read properties of undefined (reading 'd')
。
修复原理:显式传递参数
修改后的代码:
var module23 = load_f.m[23].call(null, {}, {}, load_f);
这里使用 Function.prototype.call
方法显式传递参数:
null
:函数的this
值(在模块函数中通常不需要,可传null
)。{}
:第一个参数,对应模块函数的module
对象(空对象即可)。{}
:第二个参数,对应模块函数的exports
对象(用于导出模块内容)。load_f
:第三个参数,对应模块函数的__webpack_require__
(即加载器函数f
)。
通过这三个参数,模块 23 内部的 n
(即 load_f
)就不再是 undefined
,从而避免了 n.d
调用时的错误。
就是说 n 就是load_f ,n.d ==> f.d
虽然修复了 n.d
的错误,但后续遇到了新错误:
TypeError: Cannot read properties of undefined (reading 'call')
at f (your_code.js:42:17)
这是因为模块 23 中调用了 n(31)
(即 load_f(31)
),但你的代码中没有定义模块 31(传入立即执行函数的对象中缺少 31
这个键)。当加载器尝试执行 e[31].call(...)
时,e[31]
为 undefined
,导致报错。
所以就要继续补模块
完整解决方案
要彻底解决问题,需要同时:
- 正确传递参数(已完成)。
- 定义所有依赖模块(避免
e[moduleId]
为undefined
)。
先小总结一下:
- 参数传递的重要性:Webpack 模块函数依赖
module
、exports
和__webpack_require__
三个参数,必须显式传递。 - 依赖模块的定义:所有被调用的模块(如
n(31)
)都必须在传入的对象中定义,否则会因undefined
导致错误。
现在继续补31模块。。。。。。。。。。
对了。。。。。前面做法纯属白费。。。。。。因为他就是个单纯的md5算法,对于sign参数而言。。。