·2 分钟阅读

逆向还原视频站核心 JS:加密与请求体系

从一段混淆压缩的核心库入手,还原某视频站的加密、请求、缓存与广告上报体系,含模块架构图与逆向方法论。

逆向JavaScript混淆还原加密

逆向还原视频站核心 JS:加密与请求体系

逆向的对象是某视频站的 cores.min.js——一段 90KB 的混淆压缩代码。本文只谈技术方法,不涉及具体站点信息。

模块架构

flowchart TD
    subgraph 工具层["工具层 Utils"]
        AES[CryptoJS AES-CBC]
        COLLECT[Collector 数据上报]
        CACHE[storeCache 缓存]
        REQ[_get/_post 请求封装]
    end
    subgraph 广告层["广告层 Ad"]
        TRACK[曝光上报]
        OBS[IntersectionObserver 自动上报]
    end
    subgraph 业务层["业务层 Business"]
        CFG[配置加载]
        PLAYER[播放器初始化]
    end
    REQ --> CFG
    AES --> REQ
    CACHE --> CFG
    CFG --> PLAYER
    TRACK --> COLLECT

"分层还原"是处理混淆代码的关键——先画出模块边界,再逐个击破。

关键模块还原

加密层

核心是 AES-128-CBC。通过定位 CryptoJS 的特征函数,还原密钥派生和加解密调用链。

// 还原后的加解密调用骨架
function encrypt(payload) {
    const key = deriveKey();
    return CryptoJS.AES.encrypt(payload, key, {
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
}

请求层

还原了 _get、_post、sendBeacon、fetchHost 几个基础请求函数,理清参数组装、签名和错误处理。

缓存层

localStorage 的 TTL 缓存机制——什么数据缓存、缓存多久、如何失效。

播放器层

HLS/P2P 播放器的初始化流程,以及模板引擎(art-template)的集成方式。

方法论总结

步骤 方法
1. 画模块边界 先理清"谁调谁",不要一头扎进去
2. 定位特征函数 加密库、请求库有明显特征,先揪锚点
3. 动态调试辅助 静态读不动,用断点跟踪调用流

这个项目锻炼的是对压缩混淆代码的还原能力,属于典型的 Web 逆向基本功。