Python爬虫,JS逆向之 webpack 打包站点原理与实战

举报
梦想橡皮擦 发表于 2022/05/25 11:16:20 2022/05/25
【摘要】 📢📢📢📢📢📢💗 你正在阅读 【梦想橡皮擦】 的博客👍 阅读完毕,可以点点小手赞一下🌻 发现错误,直接评论区中指正吧📆 橡皮擦的第 621 篇原创博客 ⛳️ webpack 原理说明webpack 是前端程序员用来进行打包 JS 的技术,打包之后的代码特征非常明显,例如下述代码。(window.webpackJsonp = window.webpackJsonp || []...

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

⛳️ webpack 原理说明

webpack 是前端程序员用来进行打包 JS 的技术,打包之后的代码特征非常明显,例如下述代码。

(window.webpackJsonp = window.webpackJsonp || []).push([[0], []]);

有经验之后,当看到出现 app.版本号.jschunk-libs.版本号.js> 就能大概猜到 JS 是使用了 webpack 加密。

学习过程中,我们顺手解决一个 webpack 的加密站点,地址如下所示:https://passport.gm99.com/

添加了包含关键字 login/login3 的断点之后,通过开发者工具调试得到下述代码段。

当通过调试进入 a.encode() 函数内部之后,发现了大量的 webpack 打包 JS 的痕迹,例如下图红框部分。

其实发现加密逻辑之后,可以直接用 Python 进行复写代码也是可以的。

这里面出现的关键字包含如下内容。

  • n = function(t,e,n)
  • n.exports = s
  • .call(e,i,e,t)

然后翻阅到 JS 文件头部,简化代码得到如下内容,到这里 webpack 的痕迹。

!(function (t) {
  function e(s) {
    return t[s].call(n.exports, n, n.exports, e), (n.loaded = !0), n.exports;
  }
})();

如果在细研究一下,webpack 打包之后的代码执行规则也非常简单。

!(function (t) {
  function e(s) {
    // 代码省略
    return t[s].call(n.exports, n, n.exports, e), (n.loaded = !0), n.exports;
  }
  e(0); // 调用下面的 0
  e(1); // 调用下面的 1
})({
  0: function (t, e, i) {
    // 这里有一大堆打码
  },
  1: function (t, e) {
    t.exports = jQuery;
  },
});

扣 JS 代码

接下来我们就实战扣取一下可执行的 JS 代码。

第一步:创建一个 JS 文件,名称任意
编写如下代码,将函数 e 暴露出来。

var _e;
!(function (t) {
  var i = {};
  function e(s) {
    if (i[s]) return i[s].exports;
    var n = (i[s] = {
      exports: {},
      id: s,
      loaded: !1,
    });
    return t[s].call(n.exports, n, n.exports, e), (n.loaded = !0), n.exports;
  }
  _e = e;
})();

接下来分区域扣取 JS 代码,这里依据 function() 进行区分即可。

所有不全之后的代码,可以去 gitcode 进行下载。

接下来运行生成的静态文件,测试可执行函数,就能得到对应的数据了。

📣📣📣📣📣📣
右下角有个大拇指,点赞的漂亮加倍

欢迎大家订阅专栏:

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。