[gadget] 半自动化扣取webpack

目录

声明

前言

实现步骤

1.记录需要加载的模块

2.执行AST脚本剔除

3、运行结果

4、AST代码

总结


声明


        本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
        本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使用本文讲解的技术而导致的任何意外,作者均不负责,若有侵权,请联系作者立即删除!


前言


     [JS逆向] 某医保服务平台数据获取icon-default.png?t=N7T8https://blog.csdn.net/weixin_46874932/article/details/134834269           

        在这篇文章那边扣的webpack是全部模块都扣下来的、

        想写一个小工具来实现自动化去除一下用不上的模块

实现步骤

1.记录需要加载的模块


        1、需要对该webpack模块进行记录需要用那些模块

                                1、需要添加一个列表来存放模块

                                2、反正webpack自执行一次,定义一个sp来判断状态

                                3、在需要导出的模块之前再命名sp为1

                        

                          让sp为1,确认下面模块是需要执行的

                        

        2、复制arr数组

        

                

2.执行AST脚本剔除


        1、需要替换arr的列表,进行剔除

        

        2、会输出以下的日志

        

         3、对比之前来看,少了 6万多行

        

        
 

3、运行结果


        运行下来完全没有什么问题

4、AST代码

const parser = require("@babel/parser").parse;
const traverse = require("@babel/traverse").default;
const generate = require("@babel/generator").default
const t = require("@babel/types");
const fs = require('fs')


/**
 *  去除Webpack未被使用的模块
 */

let DelWebpack = (function (Ast, arr) {
    /**
     * Ast: 节点树
     * arr: 需要保留的webpack模块
     * return: Ast
     */
    !function () {
        var arr_ = []
        for (var item of arr) {
            arr_.push(item + "")
        }
        arr = arr_
    }()

    function NAME(value, name) {
        if (value !== undefined) {
            return value
        }
        return name
    };
    var visitor = {
        ObjectProperty(path) {
            let node = path.node
            // console.log(node.key.name, node.key.value)
            if ((node.key.value !== undefined || node.key.name !== undefined) && path.parent.type === "ObjectExpression") {
                if (path.parentPath.parent.type === "CallExpression" && path.parentPath.parentPath.parent.type === "UnaryExpression") {
                    name = NAME(node.key.value, node.key.name)
                    if (arr.indexOf(name.toString()) === -1) {
                        console.log("[未使用] =>", name.toString())
                        path.remove()
                    } else {
                        console.log("[已使用] =>", name.toString(), path.parentPath.parent.type)
                    }
                }
            } else {
                return undefined
            }
            path.skip()
        }
    };

    traverse(Ast, opts = visitor)
    return Ast
})


exports.Run = DelWebpack;

if (require.main === module) {
    const code = fs.readFileSync('./webpack_mixer.js', 'utf-8');

    var ast = parser(code, {sourceType: "module"})
    let arr = [
        "e04e",
    ];
    ast = DelWebpack(ast, arr)
    code_ = generate(ast)
    fs.writeFile('./Decode.js', code_.code, (err => {
    }))
}

        

总结

        1、出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来.

        2、本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步

        3、如果这篇文章对你有帮助,就点赞、关注、收藏、三连击一下

        4、本篇分享到这里就结束了,欢迎大家关注下期,我们不见不散☀️☀️😊
 

  • 18
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值