url: https://www.weibotop.cn/2.0/

分析过程

  1. 打开开发者工具,页面直接进入了debugger模式。
    编辑

想要跳过这个debugger模式,可以在debugger这行代码的前面右键,选择never pause here

js逆向-某博博返回数据解密_字符串

  1. 编辑

重新刷新界面,就不会进入debugger模式了。抓流量包。

js逆向-某博博返回数据解密_数据_02

  1. 编辑

主要关注currentitems,它的响应数据是加密字符串,需要找到其的解密过程。

  1. 由于还是寻找响应数据的解密过程,经过前面两篇文章,立马去搜索interceptors,但是很遗憾,这里没有。
    编辑

这个方法行不通,只能搜索url关键字了,只有一条记录。

js逆向-某博博返回数据解密_数据_03

  1. 编辑
  2. 定位到该函数,上下文看看,就看到了加密和解密的地方。
    编辑
  3. 是老朋友了,AES算法,主要需要找到keyivmode,在解密的地方打断点,刷新界面。
    编辑

单步调试。i = t = String(t),把加密的字符串赋值给io = n.enc.Base64.parse(i),对i进行base64解码,赋值给or = aa在上面有定义,是通过一个固定字符串计算SHA1值之后截取前32位得到,是一个固定值。

js逆向-某博博返回数据解密_python_04

  1. 编辑

下面就是AES解密,o是需要解密的字符串,r是key,modeECBiv不需要。

// 使用 CryptoJS 解密 AES 密文
CryptoJS.AES.decrypt(
  {
    ciphertext: o  // 密文
  },
  r,  // 密钥
  {
    mode: CryptoJS.mode.ECB,  // 加密模式(ECB)
    padding: CryptoJS.pad.Pkcs7  // 填充方式(PKCS7)
  }
)
.toString(CryptoJS.enc.Utf8);  // 解密后的结果转为 UTF-8 编码的字符串
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

js逆向-某博博返回数据解密_数据_05

编辑

  1. 编写python代码,开始爬取数据,但是这里没成功,经过不断的调试,是python的base64解码和JS中的base64解码的结果不一致导致,暂时没找到解决办法,所以只能采用python调用js代码的方式实现。
// 引入 CryptoJS 库
var CryptoJS = require("crypto-js");

// 定义一个常量 s,用 SHA1 加密后获取一个值,并取前 32 位
let s = CryptoJS.SHA1(CryptoJS.enc.Utf8.parse("tSdGtmwh49BcR1irt18mxG41dGsBuGKS"))
  , a = CryptoJS.enc.Hex.parse(s.toString(CryptoJS.enc.Hex).substr(0, 32));

// 定义解密函数
function h(t) {
    // 将输入的 t 转换为字符串
    let e = (i = t = String(t),
              // 解析输入的 base64 编码
              o = CryptoJS.enc.Base64.parse(i),
              // 使用常量 a 作为密钥进行 AES 解密
              r = a,
              // 使用 AES 解密,ECB 模式,Pkcs7 填充
              CryptoJS.AES.decrypt({
                  ciphertext: o
              }, r, {
                  mode: CryptoJS.mode.ECB,
                  padding: CryptoJS.pad.Pkcs7
              }).toString(CryptoJS.enc.Utf8));

    // 声明不在当前函数使用的变量 i, o, r(避免干扰)
    var i, o, r;

    // 返回解析后的 JSON 对象
    return JSON.parse(e);
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
# 引入 functools 中的 partial 用于部分参数函数的创建
from functools import partial

# 锁定 subprocess.Popen 的 encoding 参数为 'utf-8'
import subprocess
subprocess.Popen = partial(subprocess.Popen, encoding="utf-8")

# 引入 requests 库用于发起 HTTP 请求
import requests

# 引入 execjs 库用于执行 JavaScript 代码
import execjs

# 设置要请求的 URL
url = "https://api.weibotop.cn/currentitems"

# 发起 GET 请求,获取响应内容
resp = requests.get(url, headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36"
})

# 获取响应文本
mi_str = resp.text

# 打开并读取 JavaScript 解密代码文件 '解密.js'
file_object = open("解密.js", mode="r")
exec_code = file_object.read()

# 编译并执行 JavaScript 代码
exec_js = execjs.compile(exec_code)

# 调用 JavaScript 中的解密函数 'h',并传入响应文本进行解密
call = exec_js.call("h", mi_str)

# 打印解密后的结果
print(call)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.

运行结果如下:

js逆向-某博博返回数据解密_python_06

编辑

成功获取到数据。

js逆向-某博博返回数据解密_数据_07

编辑