JS逆向爬虫----请求参数加密【token】①

访问主页,定位数据接口

  1. 访问主页https://spa6.scrape.center/page/1
    JS逆向爬虫----请求参数加密【token】①_第1张图片
  2. f12抓包,定位数据接口
    数据为异步请求的接口,响应结果为json
    JS逆向爬虫----请求参数加密【token】①_第2张图片

接口参数加密分析

数据接口请求详情
请求头没有特别的加密数据
JS逆向爬虫----请求参数加密【token】①_第3张图片
请求参数有加密参数token
JS逆向爬虫----请求参数加密【token】①_第4张图片

加密参数生成定位

  1. 搜索关键词token,定位js
    定位到两个js文件JS逆向爬虫----请求参数加密【token】①_第5张图片

  2. 依次在来源面板打开js,根据其他参数limit,offset定位生成位置
    定位到疑似位置,token值为_0x263439变量赋值。

JS逆向爬虫----请求参数加密【token】①_第6张图片

  1. 定位变量_0x263439生成逻辑
    在_0x263439前面打断点,继续点击其他页码,页面停在当前位置

JS逆向爬虫----请求参数加密【token】①_第7张图片

观察_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生成方法的构建。

token生成函数_0x2fa7bd[‘a’]逆向

  1. 在以上断点位置选择关键字_0x2fa7bd[‘a’],点击进入函数定义位置
    JS逆向爬虫----请求参数加密【token】①_第8张图片
    _0x456254函数就为_0x2fa7bd[‘a’]函数的定义位置

  2. 在函数的以下位置打上断点,并让脚本继续执行
    JS逆向爬虫----请求参数加密【token】①_第9张图片

点击箭头所在位置,继续执行脚本
JS逆向爬虫----请求参数加密【token】①_第10张图片

执行第一步,脚本执行到如下位置:
JS逆向爬虫----请求参数加密【token】①_第11张图片
输出了变量_0x5da681值,通过观察可知,这个为秒级时间戳,可以通过很多js方法生成。
在控制台位置输入_0x31a891’join’;发现里面是固定字符串+变量_0x5da681值【‘/api/movie,1694500917’】。

JS逆向爬虫----请求参数加密【token】①_第12张图片
再次点击继续执行脚本,调试到了以下位置。
JS逆向爬虫----请求参数加密【token】①_第13张图片
此时变量_0xf7c3c7变成了 cf656fa83e9f3c3791ecd8e21d11ea6ca3f344fa 数据与sha1加密后的字符串/api/movie,1694500917一致。可以确定_0x189cbb’SHA1’'toString’这行代码运行过程为将字符串进行sha1加密

JS逆向爬虫----请求参数加密【token】①_第14张图片
下面我们来解析这行代码的运行过程:_0x3c8435 = [_0xf7c3c7, _0x5da681]‘join’
代码运行到下一行的开始位置,调试页面出现了一些结果。对比_0xf7c3c7 _0x5da681 _0x3c8435。这行代码应该是将时间字符串变量_0x5da681与上面sha1解密后的数据通过逗号拼接成另一个字符串_0x3c8435
JS逆向爬虫----请求参数加密【token】①_第15张图片
下面我们来解析最后返回结果生成的一行:_0x104b5b = _0x358b1f’encode’;
这一行应该是通过_0x358b1f[‘encode’]函数对变量_0x3c8435做了处理,我们调试到这一行结束位置。如下:
JS逆向爬虫----请求参数加密【token】①_第16张图片
上图展示了最后的结果变量_0x104b5b值为Yzk1NDQxZGVlOTFiMDZhMmQyODA2MDQzYjA5MjU3YmFmN2ZmMDY2YiwxNjk0NTg0NzEy
最后的结果有大写有小写,我们猜测这应该是一种非常常用的加密【编码】方法。这个字符串非常符合base64编码字符串的结果,同时由于base64编码在网络开发中非常常用,我们来验证这个猜想。

在线base64直接加密字符串c95441dee91b06a2d2806043b09257baf7ff066b,1694584712,查看结果。

JS逆向爬虫----请求参数加密【token】①_第17张图片

由结果图片可知,我们的猜想被验证了。_0x104b5b = _0x358b1f’encode’;这一行的确是将变量_0x3c8435base64编码!

nodejs 加密函数还原

完整的加密函数我已经开发完了,注释内我对关键步骤做出解释:
完整加密函数如下:

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 中。以下是逐行解释:

  1. 首先导入了 Node.js 的 cryptoBuffer 模块,这些模块用于进行哈希运算和处理数据。

  2. token_gen 函数定义了一个令牌生成的过程。

  3. _0x5da681 存储了当前时间的毫秒数,并将其转换为字符串。这个值将被用于生成令牌的一部分。

  4. _0x2a83dd 存储了传递给函数的参数的数量。

  5. _0x31a891 是一个数组,用于存储参数和其他数据。在这里,它初始化为 ['/api/movie']

  6. _0x31a891.push(_0x5da681)_0x5da681(时间戳)添加到 _0x31a891 数组中。

  7. console.log(_0x31a891) 打印了 _0x31a891 数组的内容,这将是生成令牌的一部分。

  8. var data_sha1 = _0x31a891.join(',')_0x31a891 数组的元素用逗号连接起来,构成一个字符串 data_sha1

  9. 接下来,代码创建了一个 SHA-1 哈希对象,并使用 crypto.createHash('sha1') 创建。

  10. sha1Hash.update(data_sha1, 'utf-8') 更新了哈希对象的内容,将之前构造的字符串 data_sha1 加入到哈希计算中。

  11. _0xf7c3c7 存储了计算后的 SHA-1 哈希值,以十六进制编码输出。

  12. _0x3c8435 是一个包含两个值的数组,这两个值是 _0xf7c3c7_0x5da681

  13. 然后,代码将 _0x3c8435 数组的内容连接成一个字符串 inputString

  14. var buffer = Buffer.from(inputString, 'utf-8') 创建了一个 Buffer 对象,并将字符串 inputString 写入其中。

  15. var base64String = buffer.toString('base64') 进行了 Base64 编码,将 Buffer 对象转换为 Base64 编码的字符串。

  16. console.log('Base64 result', base64String) 打印了生成的 Base64 编码结果。

  17. 最后,将 Base64 编码的令牌添加到 URL 中,生成完整的 URL,并将其打印出来。

这段代码的核心部分是使用 SHA-1 哈希算法对一组数据进行哈希运算,然后将结果以 Base64 编码形式输出,最终添加到 URL 中。这个过程通常用于生成用于身份验证或授权的令牌。

逆向视频提供

js逆向----参数加密

你可能感兴趣的:(python爬虫综合,javascript,爬虫,node.js)