• JavaScript奇淫技巧:清理无效的垃圾代码


    JavaScript奇淫技巧:清理无效的垃圾代码

    在编程过程中,难免会产生一些无效的、冗长的长码。

    很常见的是:定义了某些变量,但未使用,或者是曾使用过,但在修改代码后不再使用。那么,它就成了无用的垃圾代码,而它占用着代码空间,使代码庞大、影响代码阅读。

    在较大的工程中,往往有不少这种代码。

    本文,演示一种方法,自动化地去除无效的变量。

    例程:

     

     

    添加图片注释,不超过 140 字(可选)

    以上代码中,变量b是无用的。

    通过编程,实现去除,完整代码如下:

     

    添加图片注释,不超过 140 字(可选)

    其原理是:将代码转化为AST(抽象语法树),从语法树中遍历变量定义,然后检测变量是否被引用或修改,如果变量既未引用、也未被修改过。则删除该变量。最后,再把AST重新生成为JS代码。

    这段代码在NodeJS环境中使用,运行效果:

     

    添加图片注释,不超过 140 字(可选)

    从运行效果可以看到,删除了未使用的变量b,并重新生成了代码。

    这个操作,可以精简、优化JS代码。

    与这波操作相反的,有时,为了保护JS代码,防止代码被分析、复制、盗用;防止他人理解代码;或因小游戏过审等需要,而对JS代码进行混淆加密。

    在JS代码混淆加密时,经常会有“僵尸代码植入操作”,会插入一些无用的变量和函数等,比如JShaman就具有这项功能。下面,再测试一下,用JShaman插入的JS代码,是否能用这种方式去除。

    例程如下:

     

    添加图片注释,不超过 140 字(可选)

    在配置中,只选择“僵尸代码植入”。JShaman有很多JS加密选项,本文只测试是否能去除插入的JS代码,所以,只启用这一项:

     

    添加图片注释,不超过 140 字(可选)

    用JShaman混淆加密后,得到代码:

     

    添加图片注释,不超过 140 字(可选)

    代码中的红色标识处,都是随机插入的僵尸代码。

    把这段代码,放到刚刚的程序中,并运行:

     

    添加图片注释,不超过 140 字(可选)

    从运行结果看,并未能去除被JShaman插入的僵尸代码,原因是因为僵尸变量也有引用和修改。

    本文仅演示了无效变量的去除,同理,还可以用类似的方法去除无效的函数。

    最后,附上本文使用的代码:

    //自动去除无效变量

    //Auther: JShaman.com w2sft

    var parser = require("@babel/parser");

    var traverse = require("@babel/traverse").default;

    var generator = require("@babel/generator").default;

    var jscode = `

    function get_copyright() {

    var _0x4d = 1 + 5;

    var domain = "jshaman.com";

    _0x4d = "apib";

    var _0x05f;

    var from_year = 2017;

    _0x05f = 9;

    var _0x;

    var copyright = "(c)" + from_year + "-" + new Date().getFullYear() + "," + domain;

    _0x = 8 + 2;

    return copyright;

    }

    console.log(get_copyright());

    `;

    var ast = parser.parse(jscode);

    var visitor = {

    VariableDeclarator(path){

    var binding = path.scope.getBinding(path.node.id.name);

    //变量被修改过

    if (!binding || binding.constantViolations.length > 0) {

    return;

    }

    //变量没有被使用过

    if (binding.referencePaths.length == 0) {

    console.log(" 已删除变量:",path.node.id.name);

    console.log();

    path.remove();

    }

    },

    }

    traverse(ast, visitor);

    console.log(generator(ast).code);

    console.log();

  • 相关阅读:
    maven知识总结
    C#面对对象(用Dictionary字典实现银行取钱系统)
    【0108】checkpoint运行原理
    基于nodejs+vue电子病历管理系统-计算机毕业设计
    AI智能电话客服机器人的交互流程
    【汇编】第一个汇编程序(学习笔记)
    共轭梯度法
    内核对设备树的处理__从源头分析__内核head.S对dtb的简单处理
    逐次变分模态分解(Sequential Variational Mode Decomposition,SVMD)(附代码)
    网络编程学习part1
  • 原文地址:https://blog.csdn.net/w2sft/article/details/127650221