js逆向——webpack扣法

01 webpack讲解

webpack是个静态模块打包工具,目的是为了让前端工程师写的前端代码变成浏览器可以识别的代码,并且可以达到前端项目的模块化,也就是如何更高效地管理和维护项目中的每一个资源。

但无疑是对js逆向造成了妨碍。但如果掌握了扣取webpack的一些技巧也是不难的。接下来,说一下我对扣取webpack代码的一些理解。

1.1 webpack组成

一个最基本的webpack组成有两个部分:

  • 自执行函数
  • 模块加载器(实际上也就是一个函数而已)

image-20230319204944486

//1.传入的参数是一个数组
var _xxx;function(x){
    function xxx(y){    #这个是模块加载器,这个y传入的可以是索引和对象的key,参数表示的是列表或对象的形参
        x[y].call(参数) 
    }
    _xxx = xxx;
}( [function(){console.log("第一个")},
    function(){consolelog("第二个")},
    function(){console.log("第三个")}
   ] );

//比如
_xxx(0); //执行得到的就是输出——第一个
_xxx(1);//执行得到的就是输出——第二个

//2.传入的参数是一个对象
var _xxx;function(x){
    function xxx(y){    #这个是模块加载器,这个y传入的可以是索引和对象的key,参数表示的是列表或对象的形参
        x[y].call(参数) 
    }
    _xxx = xxx;
}( {
    obj1:function(){console.log("第一个")},
    obj2:function(){consolelog("第二个")},
    obj3:function(){console.log("第三个")}
   } );
//因为传入的是一个对象,那想要调用对象就要指明key
_xxx("obj1")
_xxx("obj2")//和数组相比只是调用方式不同而已,原理基本一致
1.2 实战看webpack组成

光说不练假把式,接下来我们从真实的网站中看一看关于webpack组成:

image-20230319213048708

通过观察真实网站的webpack可以发现,这种情况与我们自己写的那个大差不差,无非就是加载器函数中功能更完善了些,这种加载器函数与执行对象在一个文件中的webpack很好扣js,至于如何扣我们以后再说,今天要解决的是下面的这种要怎么扣呢?

image-20230319214542282

就像图中所展示的那样,要怎么才能把目标给扣出来呢?

首先,想要扣取webpack代码就要先找到其基本要素,注意:自执行函数不是关键,关键的是传入的实参,也就是那个对象(数组)

  • 传入的实参

    • 传入的实参也就是我们的目标,把目标函数放到自己构建的对象里面就行了
    //构建自己的对象,把上面的目标给填到这个里面就行
    {
         "wk8/": function(e, t, n) {
            "use strict";
            n.d(t, "g", function() {
            n.d(t, "q", function() {
            n.d(t, "m", function() {
            n.d(t, "I", function() {
            n.d(t, "o", function() {
            n.d(t, "r", function() {
            n.d(t, "v", function() {
            n.d(t, "n", function() {
            var o = n("zvER")
              , a = n("MuMZ");
            function r(e, t, n) {
                var r = {
                    username: e,
                    password: Object(a.a)(t),
                    captcha: n
                };
                return o.a.formPost("/user/login", r)
            }
            function i(e) {
            function m(e) {
            function g(e, t) {
            function y(e) {
            function L(e) {
        },
        "test":function(){console.log("test success!!")} //这个仅用于测试使用
    }
    
    • 当目标函数中有依赖的模块时,把依赖的模块也通通放到自己写的对象里面即可
  • 加载器函数

    • 当看到如上图的代码时可能会有人会不明白这哪里有加载器,就连自执行函数都没有

    • 但实际上肯定是有加载器的,如图

      image-20230319215958392

    • 所以在定位到目标时,目标的大函数一般会加载其他模块,若要加载其他模块就会使用到加载器,以此就可以找到加载器了

  • 但是,当断到我们想要的目标函数时再去定位n(“”)函数哪里是显示不出来的,如图

    image-20230319220820088

    这是因为加载器函数实际上是在你打开网页的时候就已经加载到内存中了,而只有当我们进行登录这一具体操作时才会执行调用这个函数,所以这时是找不到加载器的。

    解决方法也很简单: 只需在加载模块的前面加上断点,然后刷新页面就可以找到加载器的位置了

    image-20230319221510724

  • 到此,目标函数以及加载器都已经找齐了

1.3 webpack调用原理分析

在上面的环节中我们确定了目标函数并找到了加载器,但正如我们看到的那样,它并不像我们自己写的那个webpack直接把大对象给传进去了,而是在另一个独立的文件里面,那么加载器又是如何对另一份独立的文件中的模块进行加载的呢?

首先来看我们找的的那个加载器,如图

image-20230319222944106

接下来我们要解决的是自执行函数的形参c是如何变成独立文件中的那个存有模块的对象的:

  1. 我们把得到的自执行函数拿出来放到node.js环境中执行一下

    • 其中将传入的空数组变成一个对象,对象里面放有一个测试函数
    • 输出自执行函数的形参
    • 并将加载器函数给导出来

    image-20230319224329832

  2. 我们将目标函数所在的那个独立文件全部写入到另一个文件当中去

    image-20230319224607066

  3. 在自执行函数的上面对刚刚写入的文件进行引入,再次执行函数

    image-20230319225212394

  4. 通过实验,我们知道了通过引入外部文件可以将模块加载到形参里面,那么是如何实现的呢? 通过调试自执行代码可以明白

    • 在与单个文件有相同部分下面可疑部分打上几个断点如下:

    image-20230319225713761

    • 接着向下进行,通过读代码可以知道通过for循环执行了函数n(),通过下图可以知道是为了加载外部模块

    image-20230319230354001

    • 再向下进行到第三个断点

    image-20230319231137980

    • 至于那个for循环是怎么将外部模块进行引入的我们并不需要深究,只需要知道当扣代码时一定不能将这个for循环给忘掉,如果忘掉的话外部文件是无法加载进来的。。。

接下来会结合几个具体例子来讲解一下webpack的扣法

over!!

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
JavaScript逆向工程涉及到逆向分析、代码还原、代码修改等多个方面,其中Webpack作为一个重要的静态模块打包器,也是逆向工程中需要重点关注的一部分。以下是一些关于Webpack逆向的笔记: 1. Webpack的打包过程是从入口文件开始的,Webpack会递归地遍历所有依赖模块,并将它们打包成一个或多个Bundle文件。因此,逆向工程的第一步就是找到Webpack打包的入口文件。 2. 在入口文件中,Webpack会通过require或import语句加载其他模块,并递归地遍历所有依赖模块。因此,我们可以通过分析入口文件来了解应用的整体结构和模块依赖关系。 3. 在Webpack的打包过程中,每个模块都会被赋予一个唯一的标识符,这个标识符可以通过module.id来获取。因此,我们可以通过分析打包后的代码,来了解每个模块的标识符和依赖关系。 4. 在Webpack的打包过程中,Loader和Plugin是非常重要的扩展机制,它们可以对模块进行转换和优化。因此,我们可以通过分析Loader和Plugin的源代码,来了解它们的作用和实现原理。 5. 在逆向工程中,我们可以使用Webpack的source-map选项来生成源映射文件,从而方便我们进行代码还原和调试。同时,我们也可以使用Webpack的devtool选项来设置不同的调试工具,以便更好地进行逆向分析和调试。 总的来说,Webpack作为静态模块打包器,在JavaScript逆向工程中扮演着重要的角色。通过对Webpack逆向分析,我们可以更加深入地了解应用的整体结构和模块依赖关系,从而更好地进行代码还原和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值