JavaScript反混淆插件四:JavaScript全局函数计算值替换

举报
悦来客栈的老板 发表于 2020/12/29 00:58:18 2020/12/29
2.4k+ 0 0
【摘要】 插件功能 获取实参,计算出全局函数调用的结果,并用结果替换该全局函数的调用表达式。 处理实例 处理前: var a = parseInt("12345",16),b = Number("123"),c = String(true),d = unescape("hello%2CAST%21");eval("a = 1"); 处理后: var a&nb...

插件功能

获取实参,计算出全局函数调用的结果,并用结果替换该全局函数的调用表达式。

处理实例

处理前:


       var a = parseInt("12345",16),b = Number("123"),c = String(true),d = unescape("hello%2CAST%21");
       eval("a = 1");
   
  

处理后:


       var a = 74565,b = 123,c = "true",d = "hello,AST!";
       eval("a = 1");
   
  

插件源码


       const types = require("@babel/types");
       const evaluate_global_func =
       {
        "CallExpression"(path)
         {
       let {callee,arguments} = path.node;
       if (!types.isIdentifier(callee) || callee.name == "eval") return;
       if (!arguments.every(arg=>types.isLiteral(arg))) return;
       let func = global[callee.name];
       if (typeof func !== "function") return;
           let args = [];
       arguments.forEach((ele,index) =>{args[index] = ele.value;});
       let value = func.apply(null,args);
       if (typeof value == "function") return;
        path.replaceInline(types.valueToNode(value));
         },
       }
   
  

插件原理

JavaScript有几个的全局函数,当它的实参是字面量时,是可以直接计算出结果的,而且都是唯一的,也就是纯函数。根据这个可以将计算出来的结果替换全局函数的调用表达式。这样的好处是让程序简单些,甚至可以做进行进一步的还原,达到简化程序的目的。思路如下:

  1. CallExpression表达式的callee节点必须是Identifier类型

  2. 函数名不能是eval,因为eval函数无返回值,无法进行替换。

  3. 判断global[funcname]的类型,如果是"function",则表示它是全局函数。

  4. 获取实参,计算结果。

  5. 计算出来的结果不能是function类型,不能进行替换。

  6. 构造节点,进行替换即可。

文章来源: blog.csdn.net,作者:悦来客栈的老板,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq523176585/article/details/110103055

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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