利用XHR断点逆向某度翻译网站sign参数算法

文章介绍了如何通过开发者工具分析XHR请求,定位并理解JavaScript中用于生成sign参数的函数,以及如何修改和测试这个算法来复现与网站相同的校验值。主要步骤包括设置断点、检查栈堆、识别关键方法并提取代码。
摘要由CSDN通过智能技术生成
  1. 抓包分析网站发送的请求数据,发现了一个sign参数,并且会随着要翻译的词不同而变化,判断这是一个校验参数,并且是一个XHR的请求包。

  1. 我们直接复制POST提交中的地址的一部分不变动的标识,加入到XHR断点(开发人员工具右边)

  1. 然后,再随便输入一些词语再次翻译,进入到断点位置,XHR断点,永远是断在send上面,我们查看data,也就是POST提交的数据,已包含了sign参数,那生成这个参数的方法肯定是在上面或上一个调用该方法的栈堆。

  1. 我们看右边的栈堆,发现前面两个是JQ,那是一个前端库,一般算法是不可能在这里的,所以我们直接看第三个。

  1. 从上图,我们看到提交的参数是一个W,我们往上找,就找到了W参数的组成部分,并发现疑似的方法, sign: b(e)

  1. 然后我们进入到B方法,再下一个断点

  1. 最后一步,就是把这个方法的JS抠出来就可以了,值的注意的是这个方法里面有一个h值需要注意一下,这个h = (null !== r ? r : (r = window[d] || "") || "").split(".") 改成 h = ['320305', '131321201']

  1. 最后用自己的JS调试工具测试一下,校验一下是不是跟网站提交的值完全相同

好啦,大功告成,经对比,是完全一样,下面我直接把代码贴出来吧!

   function sign(t) {
       var o, i = t.match(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g);
       if (null === i) {
           var a = t.length;
           a > 30 && (t = "".concat(t.substr(0, 10)).concat(t.substr(Math.floor(a / 2) - 5, 10)).concat(t.substr(-10, 10)))
       } else {
           for (var s = t.split(/[\uD800-\uDBFF][\uDC00-\uDFFF]/), c = 0, l = s.length, u = []; c < l; c++) "" !== s[c] && u.push.apply(u, function(t) {
               if (Array.isArray(t)) return e(t)
           }(o = s[c].split("")) || function(t) {
               if ("undefined" != typeof Symbol && null != t[Symbol.iterator] || null != t["@@iterator"]) return Array.from(t)
           }(o) || function(t, n) {
               if (t) {
                   if ("string" == typeof t) return e(t, n);
                   var r = Object.prototype.toString.call(t).slice(8, -1);
                   return "Object" === r && t.constructor && (r = t.constructor.name),
                       "Map" === r || "Set" === r ? Array.from(t) : "Arguments" === r || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r) ? e(t, n) : void 0
               }
           }(o) || function() {
               throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
           }()),
           c !== l - 1 && u.push(i[c]);
           var p = u.length;
           p > 30 && (t = u.slice(0, 10).join("") + u.slice(Math.floor(p / 2) - 5, Math.floor(p / 2) + 5).join("") + u.slice(-10).join(""))
       }
       for (var d = "".concat(String.fromCharCode(103)).concat(String.fromCharCode(116)).concat(String.fromCharCode(107)), h = ['320305', '131321201'], f = Number(h[0]) || 0, m = Number(h[1]) || 0, g = [], y = 0, v = 0; v < t.length; v++) {
           var _ = t.charCodeAt(v);
           _ < 128 ? g[y++] = _ : (_ < 2048 ? g[y++] = _ >> 6 | 192 : (55296 == (64512 & _) && v + 1 < t.length && 56320 == (64512 & t.charCodeAt(v + 1)) ? (_ = 65536 + ((1023 & _) << 10) + (1023 & t.charCodeAt(++v)),
           g[y++] = _ >> 18 | 240,
           g[y++] = _ >> 12 & 63 | 128) : g[y++] = _ >> 12 | 224,
           g[y++] = _ >> 6 & 63 | 128),
           g[y++] = 63 & _ | 128)
       }
       for (var b = f, w = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(97)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(54)), k = "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(51)) + "".concat(String.fromCharCode(94)).concat(String.fromCharCode(43)).concat(String.fromCharCode(98)) + "".concat(String.fromCharCode(43)).concat(String.fromCharCode(45)).concat(String.fromCharCode(102)), x = 0; x < g.length; x++)
       b = n(b += g[x], w);
       return b = n(b, k), (b ^= m) < 0 && (b = 2147483648 + (2147483647 & b)),
           "".concat((b %= 1e6).toString(), ".").concat(b ^ f)
   }

   function n(t, e) {
       for (var n = 0; n < e.length - 2; n += 3) {
           var r = e.charAt(n + 2);
           r = "a" <= r ? r.charCodeAt(0) - 87 : Number(r),
           r = "+" === e.charAt(n + 1) ? t >>> r : t << r,
           t = "+" === e.charAt(n) ? t + r & 4294967295 : t ^ r
       }
       return t
   }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值