数据接口请求详情
请求头没有特别的加密数据
请求参数有加密参数token
观察_0x263439参数的生成方法:Object(_0x2fa7bd[‘a’])(this[‘ s t o r e ′ ] [ ′ s t a t e ′ ] [ ′ u r l ′ ] [ ′ i n d e x ′ ] ) ; 其中 t h i s [ ′ store']['state']['url']['index']); 其中this[' store′][′state′][′url′][′index′]);其中this[′store’][‘state’][‘url’][‘index’]为固定字符串"/api/movie";经过_0x2fa7bd[‘a’]函数加密后生成了结果token:“ZjIzYWY2M2YyMmMyOGI2YTg5MDY1OWE0ZWIxNDRmZjVlZmNlNjE1ZSwxNjk0NTAwNTI5”(token每次生成都会变化,并不唯一。)
我们的重点是逆向_0x2fa7bd[‘a’]函数,则可以完成token生成方法的构建。
执行第一步,脚本执行到如下位置:
输出了变量_0x5da681值,通过观察可知,这个为秒级时间戳,可以通过很多js方法生成。
在控制台位置输入_0x31a891’join’;发现里面是固定字符串+变量_0x5da681值【‘/api/movie,1694500917’】。
再次点击继续执行脚本,调试到了以下位置。
此时变量_0xf7c3c7变成了 cf656fa83e9f3c3791ecd8e21d11ea6ca3f344fa 数据与sha1加密后的字符串/api/movie,1694500917一致。可以确定_0x189cbb’SHA1’'toString’这行代码运行过程为将字符串进行sha1加密。
下面我们来解析这行代码的运行过程:_0x3c8435 = [_0xf7c3c7, _0x5da681]‘join’
代码运行到下一行的开始位置,调试页面出现了一些结果。对比_0xf7c3c7 _0x5da681 _0x3c8435。这行代码应该是将时间字符串变量_0x5da681与上面sha1解密后的数据通过逗号拼接成另一个字符串_0x3c8435
下面我们来解析最后返回结果生成的一行:_0x104b5b = _0x358b1f’encode’;
这一行应该是通过_0x358b1f[‘encode’]函数对变量_0x3c8435做了处理,我们调试到这一行结束位置。如下:
上图展示了最后的结果变量_0x104b5b值为Yzk1NDQxZGVlOTFiMDZhMmQyODA2MDQzYjA5MjU3YmFmN2ZmMDY2YiwxNjk0NTg0NzEy
最后的结果有大写有小写,我们猜测这应该是一种非常常用的加密【编码】方法。这个字符串非常符合base64编码字符串的结果,同时由于base64编码在网络开发中非常常用,我们来验证这个猜想。
在线base64直接加密字符串c95441dee91b06a2d2806043b09257baf7ff066b,1694584712,查看结果。
由结果图片可知,我们的猜想被验证了。_0x104b5b = _0x358b1f’encode’;这一行的确是将变量_0x3c8435base64编码!
完整的加密函数我已经开发完了,注释内我对关键步骤做出解释:
完整加密函数如下:
const crypto = require('crypto');
const Buffer = require('buffer').Buffer;
function token_gen() {
for (var _0x5da681 = Math['round'](new Date()['getTime']() / 0x3e8)['toString'](), _0x2a83dd = arguments['length'], _0x31a891 = new Array(_0x2a83dd), _0x596a02 = 0x0; _0x596a02 < _0x2a83dd; _0x596a02++)
_0x31a891[_0x596a02] = arguments[_0x596a02];
var _0x31a891 = ['/api/movie']
_0x31a891['push'](_0x5da681);
console.log(_0x31a891);
// 将数组_0x31a891构造成字符串
var data_sha1 = _0x31a891.join(',');
const sha1Hash = crypto.createHash('sha1');
// 更新哈希对象的内容
sha1Hash.update(data_sha1, 'utf-8');
// 计算哈希值并以十六进制编码输出
var _0xf7c3c7 = sha1Hash.digest('hex');
// sha1方法加密数据
console.log(_0xf7c3c7);
_0x3c8435 = [_0xf7c3c7, _0x5da681]['join'](',');
// 要编码的字符串
var inputString = _0x3c8435;
// 创建一个 Buffer 对象并将字符串写入
var buffer = Buffer.from(inputString, 'utf-8');
// 进行 Base64 编码
var base64String = buffer.toString('base64');
console.log('Base64 result', base64String);
_0x104b5b = base64String;
console.log(_0x104b5b);
return _0x104b5b;
}
url = 'https://spa6.scrape.center/api/movie?limit=10&offset=10&token='+token_gen();
console.log(url);
这段 Node.js 代码的作用是生成一个包含 Base64 编码的令牌 (token),并将其添加到一个 URL 中。以下是逐行解释:
首先导入了 Node.js 的 crypto
和 Buffer
模块,这些模块用于进行哈希运算和处理数据。
token_gen
函数定义了一个令牌生成的过程。
_0x5da681
存储了当前时间的毫秒数,并将其转换为字符串。这个值将被用于生成令牌的一部分。
_0x2a83dd
存储了传递给函数的参数的数量。
_0x31a891
是一个数组,用于存储参数和其他数据。在这里,它初始化为 ['/api/movie']
。
_0x31a891.push(_0x5da681)
将 _0x5da681
(时间戳)添加到 _0x31a891
数组中。
console.log(_0x31a891)
打印了 _0x31a891
数组的内容,这将是生成令牌的一部分。
var data_sha1 = _0x31a891.join(',')
将 _0x31a891
数组的元素用逗号连接起来,构成一个字符串 data_sha1
。
接下来,代码创建了一个 SHA-1 哈希对象,并使用 crypto.createHash('sha1')
创建。
sha1Hash.update(data_sha1, 'utf-8')
更新了哈希对象的内容,将之前构造的字符串 data_sha1
加入到哈希计算中。
_0xf7c3c7
存储了计算后的 SHA-1 哈希值,以十六进制编码输出。
_0x3c8435
是一个包含两个值的数组,这两个值是 _0xf7c3c7
和 _0x5da681
。
然后,代码将 _0x3c8435
数组的内容连接成一个字符串 inputString
。
var buffer = Buffer.from(inputString, 'utf-8')
创建了一个 Buffer 对象,并将字符串 inputString
写入其中。
var base64String = buffer.toString('base64')
进行了 Base64 编码,将 Buffer 对象转换为 Base64 编码的字符串。
console.log('Base64 result', base64String)
打印了生成的 Base64 编码结果。
最后,将 Base64 编码的令牌添加到 URL 中,生成完整的 URL,并将其打印出来。
这段代码的核心部分是使用 SHA-1 哈希算法对一组数据进行哈希运算,然后将结果以 Base64 编码形式输出,最终添加到 URL 中。这个过程通常用于生成用于身份验证或授权的令牌。
js逆向----参数加密