• Python爬虫eval混淆,爬虫进阶实战系列


    ⛳️ 前置知识

    历经 10 篇左右的 Python 字体反爬系列文章,我们又进入了一个新的主题,常见混淆加密原理与实践。

    本篇博客从 eval 混淆开始,逐层为大家拆解 JS 逆向中混淆相关知识。

    eval 函数可以将 JS 字符串解析成源码执行

    在搜索引擎随机选择可进行加密 JS 代码的页面,然后加密下述内容。

    加密前

    var name = "橡皮擦";
    
    • 1

    加密后

    eval(
      (function (p, a, c, k, e, d) {
        e = function (c) {
          return (
            (c < a ? "" : e(parseInt(c / a))) +
            ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))
          );
        };
        if (!"".replace(/^/, String)) {
          while (c--) d[e(c)] = k[c] || e(c);
          k = [
            function (e) {
              return d[e];
            },
          ];
          e = function () {
            return "\\w+";
          };
          c = 1;
        }
        while (c--)
          if (k[c]) p = p.replace(new RegExp("\\b" + e(c) + "\\b", "g"), k[c]);
        return p;
      })('1 0 = "橡皮擦"', 62, 2, "name|var".split("|"), 0, {})
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    可以看到加密之后的代码变得更加复杂,并且可读性变弱。

    在 JS 中,eval 函数本身就是一个 JS 代码执行器,它可以将传入的字符串按照 JS 语法进行解析并执行。

    解密 eval 函数的方式比较简单,直接找工具。

    该形式代码最常见的场景就是百度的统计代码,具体案例你可以寻找一下。

    本次我们要采集的站点是电视猫,目标地址为:https://www.tvmao.com/program/BTV1

    在该页面点击更多之后,会加载节目列表数据,得到的接口与参数如下所示。

    • 请求网址: https://www.tvmao.com/api/pg?p=加密字符串
    • 请求形式:GET

    通过查看更多,我们可以抓取到数据请求位置。

    Python爬虫eval混淆,爬虫进阶实战系列

    ⛳️ 电视猫 实战场景

    伴随断点,我们进入到 JS 逆向环节,得到的第一段代码如下所示。

    $(".more-epg").click(function () {
      var b = "src";
      var a = A.d("a", b);
      ajaxVerify(
        "/api/pg",
        "GET",
        {
          p: a,
        },
        function (c, d) {
          $("#noon").after(d[1]);
          $(".more-epg").remove();
        }
      );
    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    代码中比较核心的是 A.d("a", b) ,其中函数 d() 可能是加密环节。

    接下来就是重点内容了,我们并没有找到加密函数所在的 JS 文件,该 JS 代码段是临时的,或者称为匿名的。

    Python爬虫eval混淆,爬虫进阶实战系列

    但是关键字 _keyStr 是可以直接被检索到的,全局搜索一下,得到如下内容。

    Python爬虫eval混淆,爬虫进阶实战系列

    顺着 base.js 爬过去,找到如下内容,发现 eval 函数,混淆点出现了。

    Python爬虫eval混淆,爬虫进阶实战系列

    ⛳️ 实战编码

    所有的 eval 函数包裹的代码,都可以使用 console.log 进行打印。

    Python爬虫eval混淆,爬虫进阶实战系列

    可以看到混淆前后的代码差异,解析之后恰巧是我们的目标函数。

    也可以搜索反混淆工具,直接查询即可,反混淆的时候,注意携带 eval() 函数,其中内容可以自己多次测试。

    当我们得到原函数时,基本表示加密逻辑已经解决了。

    最后在补充一点

    当你发现【匿名】函数时,大概率这段 JS 是加密过的字符串。

    Python爬虫eval混淆,爬虫进阶实战系列

    📢📢📢📢📢📢
    💗 你正在阅读 【梦想橡皮擦】 的博客
    👍 阅读完毕,可以点点小手赞一下
    🌻 发现错误,直接评论区中指正吧
    📆 橡皮擦的第 683 篇原创博客

  • 相关阅读:
    WebSocket 的 6 种集成方式
    This dependency was not found: vxe-table/lib/vxe-table in ./src/main.js
    Python入门
    Web前端大作业—个人网页(html+css+javascript)
    如何给玩偶建模并让它跳个舞?
    shell脚本中数组元素赋值
    哈希表、unordered_map和unordered_set模拟
    使用maven创建springboot项目
    SpringCloud学习笔记(二)
    云计算 3月6号 (crontab-计划任务 日志轮转 免密登录)
  • 原文地址:https://blog.csdn.net/hihell/article/details/124884483