·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 逆向基本功。