逆向分析的必要性
当直接请求目标数据 URL 返回错误(如 403 Forbidden, 401 Unauthorized)、返回乱码、或者返回提示“参数错误”、“签名无效”等信息时,就表明请求没有满足服务器的安全校验要求。
此时就需要进行通过“逆向分析”模拟浏览器成功发送请求并获得有效数据。
逆向处理
逆向处理这个过程往往充满挑战,需要耐心、细心和对 HTTP、JavaScript、加密基础知识的理解。遇到混淆(Obfuscation)严重的代码时,难度会更大。
一般逆向处理分为以下步骤:
- 通过浏览器开发者工具找到请求的url地址,分析并加密的类型。
- 定位代码块: 找到负责生成目标请求(特别是生成加密参数/签名)的 JavaScript 函数/代码块。
- 分析代码:
* 分析代码逻辑,理解参数生成算法、所需依赖。
* 识别使用的加密库(如 CryptoJS, Node.js 的crypto
模块等)或自定义算法。
* 弄清楚密钥的来源(硬编码?从其他接口获取?)。 - 复现:
扣代码 (Code Extraction): 尝试将关键的 JS 函数及其依赖(辅助函数、变量、伪加密库实现)提取出来。可能需要修改代码结构使其能在 Node.js 或 Python 环境中独立运行。
模拟环境 (Polyfill): 如果代码依赖浏览器环境特有的对象(如window
,document
,navigator
),需要提供模拟实现(Polyfill)。
第三方库移植: 如果使用了标准加密库,找到目标语言(Python/Node.js)的对应库(如 Python 的pycryptodome
,hashlib
,hmac
; Node.js 的crypto
)重写算法逻辑。有时也需要模拟不常见的或魔改过的库。
补环境 (Environment Mocking): 对于非常复杂或混淆严重的代码,可能需要构建一个接近浏览器环境的 JS 运行时(如使用jsdom
,puppeteer
的无头浏览器执行关键 JS 片段获取结果)。 - 集成: 将复现的加密/参数生成逻辑集成到你的爬虫程序中。
* 在发送数据请求前,先调用你的复现代码生成必要的加密参数、签名或特殊请求头。
* 正确管理 Cookies(使用requests.Session
或类似的会话对象)。
* 构造包含正确 URL、Headers 和 Body 的 HTTP 请求。 - 请求与解析: 发送构造好的请求,接收服务器返回的数据。如果数据也是加密的,还需调用相应的解密逻辑进行处理。最后解析所需的数据(JSON, XML 等)。