异步跟栈 webpack

网站:

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的代码
  // ...
}

这个函数接收三个关键参数:

  1. module:模块实例对象,包含 exports 属性(用于导出模块内容)。
  2. exports:模块的导出对象,等同于 module.exports
  3. __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 方法显式传递参数:

  1. null:函数的 this 值(在模块函数中通常不需要,可传 null)。
  2. {}:第一个参数,对应模块函数的 module 对象(空对象即可)。
  3. {}:第二个参数,对应模块函数的 exports 对象(用于导出模块内容)。
  4. 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,导致报错。

所以就要继续补模块

完整解决方案

要彻底解决问题,需要同时:

  1. 正确传递参数(已完成)。
  2. 定义所有依赖模块(避免 e[moduleId] 为 undefined)。

先小总结一下:

  1. 参数传递的重要性:Webpack 模块函数依赖 moduleexports 和 __webpack_require__ 三个参数,必须显式传递。
  2. 依赖模块的定义:所有被调用的模块(如 n(31))都必须在传入的对象中定义,否则会因 undefined 导致错误。

现在继续补31模块。。。。。。。。。。

对了。。。。。前面做法纯属白费。。。。。。因为他就是个单纯的md5算法,对于sign参数而言。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值