爬虫技术:攻防对抗与数据采集——Web Js逆向篇

爬虫原本仅涉及基本的网络请求、数据处理和存储。然而,随着网站采取各种措施以提高数据传输速度和安全性,爬虫开发变得日益复杂。本篇文章将介绍爬虫技术中的一些关键环节,包括抓包、参数分析、加密定位、代码压缩与混淆处理,以及模拟浏览器环境等。

一、抓包

了解我们所需数据是由哪个请求生成的,请求接口和参数分别是什么。

常用抓包工具:

  • Charles:一个HTTP代理服务器,用于HTTP和SSL协议的网络调试。跨平台,可在Windows、macOS和Linux上运行。
  • Fiddler:主要用于抓包、分析和调试网络请求,支持HTTP、HTTPS、WebSocket等协议。主要关注于抓包和分析功能,但在非Windows系统上可能存在兼容性问题。
  • Wireshark:一个开源的网络协议分析器,可以捕获和分析网络中的所有协议的数据报文。提供强大的过滤规则,适合学习和分析网络协议。
  • mitmproxy:一个开源的中间人代理,支持HTTP和HTTPS的抓包和分析。特点是使用Python编写,可以通过编写脚本来自定义处理流量的方式。

    二、请求参数和响应参数分析

    查看请求参数和响应数据是否经过编码或加密。

    常见编码方式:

    1. Base64:这是一种将二进制数据编码成64个可打印字符的表示方法。Base64编码常用于在不支持二进制数据的系统之间传输数据,例如在HTTP协议中传输图片数据。
    2. Unicode:Unicode是一种计算机编码系统,用于表示几乎所有的书写系统中的字符。在网页编码中,Unicode常用于表示国际化的字符。

    常见加密方式:

    1. MD5:MD5是一种广泛使用的哈希函数,它可以产生一个128位的哈希值。MD5常用于验证数据的完整性。
    2. AES(高级加密标准):AES是一种对称密钥加密标准,它支持128、192或256位的密钥长度。
    3. DES(数据加密标准):DES是一种较早的对称密钥加密算法,其长度为较短的56位密钥。
    4. RSA:RSA是一种非对称加密算法,常用于数字签名和密钥交换。

    三、加密参数定位

    首先定位参数的加密位置,主要方法有:全局搜索、hook、堆栈、断点、内存漫游、XHR监听、事件监听等。

    四、常见压缩与混淆

    在网络爬虫的开发过程中,我们经常需要处理经过压缩和混淆的JavaScript代码。这些技术通常用于提高代码的执行效率和保护源码。以下是一些常见的压缩与混淆方法,以及相应的解决策略。

    Webpack 是一个前端资源打包工具,能够将多个模块文件按规则组织起来,并最终生成优化后的静态资源。它可以通过插件实现代码的压缩和混淆。例如,使用 "TerserPlugin" 可以对JS代码进行压缩和混淆。

    aa/jj混淆 是一种利用Unicode特性的混淆方法,它将代码转换为包含特殊意义的字符,如网络表情符号等。这种混淆方式提高了代码阅读的难度,但可以通过查找相应的转换表或编写特定的解码脚本来还原。

    JSfuck混淆 是一种极端的混淆方法,它仅使用 "[]!()+" 等有限的字符来编码程序。由于其复杂性和难以阅读的特性,这种混淆方式很难被直接解读。针对JSfuck混淆,可能需要专门的解析器或自定义的脚本来解码。

    OLLVM混淆 是一种底层的混淆技术,主要针对LLVM编译的代码。它包括控制流平坦化、指令替换等手段,使得代码的逻辑更加难以跟踪。对付OLLVM混淆通常需要专业的逆向工程工具和深入的分析。

    ob混淆 是一种常见的JavaScript混淆方法,它包括数组位移、将字符串转换为 "_0x" 的形式、变量名替换、控制流平坦化等手段。

    eval混淆 是指将可执行的JavaScript语句转化为字符串形式,并通过 "eval" 函数执行。这种方式常配合base64编码和解码进行混淆。

    解决思路:

    • 解混淆工具:可以使用如 "ob-decrypt" 等解混淆工具来还原混淆后的代码。
    • 导出和拆包还原:将混淆后的代码导出并进行拆包还原,以便进一步分析和理解代码逻辑。
    • 运行和解码:在控制台运行代码,并使用解码工具对可能的base64编码进行解码。有时还需要分割语句以还原完整的代码逻辑。
    • 硬扣js:手动逐行分析混淆后的代码逻辑,费时费力但有时是有效的。
    • AST还原:抽象语法树(Abstract Syntax Tree) 还原是指将混淆后的代码转换回正常的代码结构,以便于分析和理解代码逻辑。

      五、常见补环境方式

      在网络爬虫开发中,当我们处理完代码混淆和解密问题后,尝试执行JavaScript代码时可能会遇到因网站对浏览器特征的检测而导致的错误。这是因为很多网站会通过检测用户的浏览器环境来识别是否为真实用户访问。

      常见检测:

      1. 网站属性检测:网站可能会检查navigator、window、location、screen等对象和它们的属性,如userAgent、platform、language等,以判断运行环境是否为真实的浏览器。
      2. 自动化检测:一些网站能够检测出使用自动化工具(如Selenium、Puppeteer等)的迹象。这些工具可能会修改或未能设置某些DOM属性或事件处理行为,从而暴露自己不是普通浏览器。
      3. Node环境检测:如果网站检测到运行环境是Node.js,它可能认为这是一个非正常的浏览器环境。
      4. 其他浏览器指纹:浏览器指纹包括但不限于用户代理(User-Agent)、屏幕分辨率、语言偏好、插件信息等,网站可能会通过这些信息来识别爬虫。

      解决思路:

      • 属性缺啥补啥:根据网站的检测点,针对性地设置缺失的属性。例如,如果网站检测window或navigator对象,可以通过修改JavaScript上下文来添加这些对象和相应的属性。
      • 自动化特征隐藏:对于自动化检测,可以尝试使用无头浏览器模式(Headless mode),或者模拟正常浏览器的行为,如延迟、随机化点击间隔等。
      • 生成随机指纹:对于更复杂的检测机制,如画布指纹,可以使用生成随机画布指纹的方法来欺骗检测。
      • User-Agent字符串:自定义User-Agent字符串以模仿不同的浏览器和操作系统组合。
      • 代理和VPN:通过使用代理服务器或VPN,可以改变爬虫的IP地址和地理位置信息,减少被网站识别为爬虫的风险。
      • 禁用JavaScript特性:对于一些通过特定JavaScript代码片段来检测环境的情况,可以选择禁用这些特性。
      • 使用现有工具库:使用像DrissionPage这样的高级自动化库,它们提供了许多真实浏览器的特性,并且可以帮助绕过一些简单的检测。

        六、其他方法补充

        在数据量不多、找不到加解密方法、部分低频验证场景可以采用自动化或RPC的方式获取相关数据或参数。

        常用自动化工具:

        • selenium
        • DrissionPage
        • airtest
        • appium
        • pyppetter
        • playwright

          RPC:

          通过websocket进行RPC调用或其他现成轮子,如:js-rpc、Sekiro等。