2024-07-12
js逆向
00
请注意,本文编写于 88 天前,最后修改于 88 天前,其中某些信息可能已经过时。

目录

本次逆向是shopee的请求头反爬参数的第一部分
参数定位
af-ac-enc-dat
x-sap-ri
x-sap-ri参数逆向
后记

本次逆向是shopee的请求头反爬参数的第一部分

参数定位

shopee是反爬届中参数复杂程度较高的,我们可以看到复杂的参数生成以及代码混淆,在请求头中,比较重要的参数是下面这些:

coffee01.jpg coffee02.jpg

我们这次先解决比较简单的两个,一个是x-sap-ri,另外一个是af-ac-enc-dat这两个参数。

af-ac-enc-dat

在以前的版本中,例如211001这类的版本,这个参数是十分复杂的,但是在现在这个版本下,这个参数就很简单了,以及不是风控的关键。我们全局搜索参数关键字即可获取数据。

js
function y() { var e, t = function (e) { for (var t = "", n = 0; n < e.length; n++) t += e[n].toString(16).padStart(2, "0"); return t }(function () { for (var e = new Uint8Array(8), t = 0; t < 8; t++) e[t] = Math.floor(256 * Math.random()); return e }()); return (e = {})["af-ac-enc-dat"] = t, e }

简单分析一下代码就知道,这个是一个随机数。

x-sap-ri

这个参数就不像上一个参数这么简单了,我们首先需要定位到参数生成的关键位置,通过请求链我们可以发现这个参数是在一个sap-hook-latest.js中生成的,通过名字我们可以发现,这个应该就是参数生成的文件了。

我们点进文件可以发现,这是一个巨大的webpack,然后外加超强混淆,我们需要耐心一点,一步一步去跟一下,找到他的核心代码位置。

image.png

在这里,他对许多结果进行拼接以及计算,我们在他的下方打上日志点

js
'rrt:', r[rt], '\nnt:', nt, '\nit:', it, '\not:', ot

就可以发现一大堆有用的信息了。

image.png

这里,我们已经找到了x-sap-ri的生成位置,下面进行分析。

x-sap-ri参数逆向

我们通过日志可以发现,这个参数是一个26位的unit8Array通过下面这个函数变成的16进制字符串:

js
// 还原前 e.QXw = function (t) { for (var e = O0QUD, r = "", n = 0; n < t.length; n++) { var i = t[n] >> 4 & 15 , o = 15 & t[n]; r = (r += i[e(253)](16)) + o[e(253)](16) } return r } // 还原后 function to_hex_string(t) { for (var r = "", e = 0; e < t.length; e++) { var o = t[e] >> 4 & 15 , i = 15 & t[e]; r = (r += o["toString"](16)) + i["toString"](16) } return r }

我们再往上追溯,可以发现这个26位的uint8Array是通过时间戳拼接随机数生成的:

js
const timestamp = Math.ceil(Date.now() / 1e3); const buffer = new ArrayBuffer(26); const view = new DataView(buffer); view.setUint32.apply(view, [0, timestamp, true]); const randomArray = window.crypto.getRandomValues(new Uint8Array(22)); let array = new Uint8Array(view.buffer) array.set.apply(array, [randomArray, 4])

但是我们发现,如果我们按照他的这个方法生成的参数,总有3位和浏览器上生成的不一样,特别是第12位和第13位,浏览器上会固定时3和1,但是我们代码生成的参数却不是这样的,这是为什么呢?

带着这个疑问我们追栈,一步一步跟下去发现,在后续的流程中,他对这个unit8Array进行了修改。他取出来数组中的第11位,进行几步操作,然后把第12和第13位设置为固定的数字,直到这里,我们就把参数完全逆向完毕。

整理成函数就是这个样子:

js
function get_x_sap_ri() { const timestamp = Math.ceil(Date.now() / 1e3); const buffer = new ArrayBuffer(26); const view = new DataView(buffer); view.setUint32.apply(view, [0, timestamp, true]); const randomArray = window.crypto.getRandomValues(new Uint8Array(22)); let array = new Uint8Array(view.buffer) array.set.apply(array, [randomArray, 4]) let magic = array[11] magic = (3 << 4) + (15 & magic) array[11] = magic array[12] = 3 array[13] = 1 const hexString = utils.to_hex_string(array); return { 'x-sap-ri': hexString, 'timestamp': timestamp, 'b1x': randomArray.at(0) } }

参数里面的时间戳以及随机数组的第一位都在后续的流程中有应用~

后记

这个参数其实也是很简单的,主要就是中间有点变化,他把随机数变成伪随机的了,我后端检测的时候只需要简单检测一下就可以干掉一大批纯算用户。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:回锅炒辣椒

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!