跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonNode.jsSaaS算法

JS 逆向:PEDATA 资讯接口加密解密与 zlib.gunzipSync 应用

PEDATA SaaS 系统资讯接口的加密机制,识别出其采用 Base64 编码、XOR 异或及 Gzip 压缩的多层加密方式。通过逆向浏览器源码定位到核心解密函数 M,利用 Node.js zlib 模块的 gunzipSync 方法实现解压。文章提供了完整的 JavaScript 算法还原代码及 Python 调用示例,详细说明了如何提取 Token、构建异或密钥并还原明文 JSON 数据,适用于同类 JS 逆向场景参考。

乱七八糟发布于 2025/2/6更新于 2026/9/866 浏览
JS 逆向:PEDATA 资讯接口加密解密与 zlib.gunzipSync 应用

JS 逆向:PEDATA 资讯接口加密解密与 zlib.gunzipSync 应用

1. 逆向目标

  • 目标系统:某投资领域 SaaS 系统 PEDATA MAX 资讯模块
  • 请求地址:https://max.pedata.cn/api/q4x/newsflash/list
  • 返回特征:响应数据中的 data 字段为经过多层加密的字符串,包含 exor 异或密钥和 ts 时间戳。
  • 核心难点:数据经过 Base64、XOR 异或及 Gzip 压缩处理,需还原明文 JSON。

2. 抓包分析

在页面加载时,通过开发者工具 XHR 面板筛选出 newsflash/list 请求。观察请求参数与响应结构:

2.1 请求参数

Payload 主要包含翻页信息(如页码、每页数量),无明显加密特征。重点在于请求头:

  • HTTP-X-TOKEN:用于标识用户身份,替代 Cookie 进行鉴权。
  • Cookie:部分广告统计参数(如 Hm_lvt_xxx)可忽略。

2.2 响应结构

{
  "data": "L+o+YmIyNDE...",
  "exor": "01",
  "ts": 1708632000
}

其中 data 为加密串,exor 为后续解密所需的异或密钥。

3. 加密逻辑逆向

3.1 定位解密函数

在浏览器调试器中搜索键名 exor,定位到唯一引用处。该处代码调用了对象方法 Object(p["y"])(e.data.data, e.data.exor)。跟进该方法发现其内部调用了名为 M 的函数。

3.2 关键函数解析

核心解密逻辑位于 M(t, n) 函数中:

function M(t, n) {
    var a = L(Object(s["a"])(), n);
    var r = Y(B(t), a);
    var c = o.a.gunzipSync(e.from(r)).toString("utf-8");
    return JSON.parse(c);
}

各步骤含义如下:

  1. 获取 Token:Object(s["a"])() 获取登录凭证(即 HTTP-X-TOKEN)。
  2. 生成异或数组:L(token, exor) 根据 token 和 exor 生成异或密钥数组。
  3. Base64 解码:B(t) 将加密字符串转为普通字符串。
  4. XOR 异或:Y(decoded_str, key_array) 执行异或运算得到二进制流。
  5. 解压数据:gunzipSync 对二进制流进行 Gunzip 解压。
  6. 解析 JSON:最后将解压后的 UTF-8 字符串解析为 JSON 对象。

3.3 zlib.gunzipSync 说明

zlib.gunzipSync 是 Node.js zlib 模块提供的同步解压方法。它支持 Buffer、TypedArray 等类型输入。在浏览器环境中通常无法直接使用,但在爬虫脚本(Node.js/Python via execjs)中可直接调用。

4. 完整实现方案

4.1 JavaScript 核心算法

将逆向得到的 JS 函数提取为独立模块,便于在其他语言中复现。

var zlib = require('zlib');

// 生成异或密钥数组
function L(e, t) {
    if ("1" == t) return [7, 65, 75, 31, 71, 101, 57, 0];
    for (var n = [], a = 0, r = t.length; a < r; a += 2)
        n.push(e.substr(1 * t.substr(a, 2), 1).charCodeAt());
    return n;
}

// XOR 异或运算
function Y(e, t) {
    for (var n, a = new Uint8Array(e.length), r = 0, c = e.length; r < c; r++)
        n = t[r % t.length], a[r] = e[r].charCodeAt() ^ n;
    return a;
}

// Base64 解码辅助
function B(e) {
    var t, n, a, r, c, u, i, o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", s = "", f = 0;
    e = e.replace(/[^A-Za-z0-9\+\/\=]/g, "");
    while (f < e.length)
        r = o.indexOf(e.charAt(f++)), c = o.indexOf(e.charAt(f++)),
        u = o.indexOf(e.charAt(f++)), i = o.indexOf(e.charAt(f++)),
        t = r << 2 | c >> 4, n = (15 & c) << 4 | u >> 2,
        a = (3 & u) << 6 | i, s += String.fromCharCode(t),
        64 != u && (s += String.fromCharCode(n)), 64 != i && (s += String.fromCharCode(a));
    return s;
}

// 主解密入口
function getDecryptedData(encryptedData, exor, loginToken) {
    var a = L(loginToken, exor);
    var r = Y(B(encryptedData), a);
    var decryptedData = zlib.gunzipSync(r).toString();
    return decryptedData;
}

4.2 Python 调用示例

使用 execjs 调用上述 JS 逻辑,结合 requests 发起请求。

import execjs
import requests
import json

# 配置项
NEWS_URL = "https://max.pedata.cn/api/q4x/newsflash/list"
LOGIN_TOKEN = "YOUR_LOGIN_TOKEN_HERE"  # 替换为实际 Token

headers = {
    "Accept": "application/json, text/plain, */*",
    "Content-Type": "application/json",
    "Host": "max.pedata.cn",
    "HTTP-X-TOKEN": LOGIN_TOKEN,
    "Origin": "https://max.pedata.cn",
    "Referer": "https://max.pedata.cn/client/news/newsflash",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}

def load_js_context():
    with open('pedata_decrypt.js', 'r', encoding='utf-8') as f:
        return execjs.compile(f.read())

def decrypt_data(encrypted_data, exor, ctx):
    return ctx.call('getDecryptedData', encrypted_data, exor, LOGIN_TOKEN)

def fetch_news():
    payload = {
        "type": "",
        "module": "LP",
        "page": {"currentPage": 1, "pageSize": 10}
    }
    resp = requests.post(NEWS_URL, headers=headers, json=payload)
    resp.raise_for_status()
    data = resp.json()
    
    encrypted_data = data.get("data")
    exor = data.get("exor")
    
    if not encrypted_data or not exor:
        raise ValueError("Missing encryption parameters")
        
    ctx = load_js_context()
    decrypted_json = decrypt_data(encrypted_data, exor, ctx)
    return json.loads(decrypted_json)

if __name__ == '__main__':
    try:
        news_list = fetch_news()
        print(json.dumps(news_list, ensure_ascii=False, indent=2))
    except Exception as e:
        print(f"Error: {e}")

5. 注意事项

  1. Token 有效期:HTTP-X-TOKEN 可能有时效性,若请求失败请重新获取。
  2. 环境依赖:Python 端需安装 requests 和 execjs 库。
  3. Buffer 兼容性:Node.js zlib 处理 Uint8Array 时需确保版本 >= v8.0.0。
  4. 合规性:本方案仅供技术学习,请勿用于非法爬取或商业用途。

目录

  1. JS 逆向:PEDATA 资讯接口加密解密与 zlib.gunzipSync 应用
  2. 1. 逆向目标
  3. 2. 抓包分析
  4. 2.1 请求参数
  5. 2.2 响应结构
  6. 3. 加密逻辑逆向
  7. 3.1 定位解密函数
  8. 3.2 关键函数解析
  9. 3.3 zlib.gunzipSync 说明
  10. 4. 完整实现方案
  11. 4.1 JavaScript 核心算法
  12. 4.2 Python 调用示例
  13. 配置项
  14. 5. 注意事项

更多推荐文章

查看全部
  • C++ 红黑树进阶:手撕 STL 源码实现 map 和 set
  • Whisper-large-v3-turbo 深度解析:8 倍速语音识别技术
  • 微信开放官方 Bot API:ClawBot 插件技术解析与 AI 应用
  • Python 基础教程:从环境搭建到核心语法详解
  • 10 个开源免费的大模型学习资料推荐
  • 腾讯混元大模型 AIGC 系列产品深度体验
  • 中国人工智能大模型技术白皮书:发展历程、关键技术及应用展望
  • GLM-4.7 与 Dify 平台深度集成实践
  • 深入理解 Flood Fill 算法:递归、搜索与回溯专题
  • Llama 4 Scout 深度解析:Meta 新一代 MoE 模型技术亮点
  • 大厂为何一边裁员一边招聘:背后的商业逻辑与职场真相
  • Vue Print Designer 前端可视化打印设计器详解
  • 链表两两交换的三种 Java 解法
  • 快手开源 KwaiAgents 系统:小参数模型实现超越 GPT-3.5 效果
  • Oracle WebLogic 代理插件未授权 RCE 漏洞检测与分析
  • HarmonyOS 秋季更新深度解析:分布式架构与开发演进
  • Rust 复合类型高级用法:结构体、枚举与模式匹配
  • OpenClaw 多飞书机器人接入与多 Agent 团队协作实战
  • SpringAI 通过 Ollama 本地部署 Deepseek 模型实现对话机器人
  • 程序员转行大模型领域:热门岗位与学习路径解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online