JavaScript反混淆插件三:优化无实参的自执行函数

                                                      前言         

相信大家对 自执行函数 并不陌生,在混淆的代码中随处可见。如下图:

而在代码块里面的作用域和在自执行函数外的作用域是相同的,因此,如果自执行函数如果没有参数的话,可以进行简化。去掉烦人的:


   
  1. !(function()
  2. {
  3. somecode;
  4. })();

插件功能

优化无实参的自执行函数

处理实例

处理前:


   
  1. !(function()
  2. {
  3. a = b;
  4. })();

处理后:

a = b;

  

插件源码


   
  1. const types     = require("@babel/types");
  2. const simplify_auto_exec = {
  3. UnaryExpression(path)
  4. {
  5. let {operator,argument} = path.node;
  6.     if (operator != "!" || !types.isCallExpression(argument)) return;
  7. let {arguments,callee} = argument;
  8. if (arguments.length !=0 || !types.isFunctionExpression(callee)) return;
  9. let {id,params,body} = callee;
  10.     if (id != null || params.length !=0 || !types.isBlockStatement(body)) return;
  11.     path.replaceWithMultiple(body.body);
  12. },
  13. }

思路


   
  1. 其实就是将函数体里面的内容替换整个表达式
  2. 1.因为是替换表达式,因此这里遍历UnaryExpression节点,这个可以在对照网站看的很清楚。
  3. 2.特征判断,UnaryExpression表达式的operator节点为符号"!";而argument节点是CallExpression类型
  4. 3.再次对argument节点进行特征判断,具体见代码。
  5. 4.满足条件后进行替换。

注意事项

内嵌同类型的UnaryExpression表达式同样可以进行替换。代码无需修改。

结语

某著名前端滑块的js代码,大量的使用了这种类型的表达式,其实只需要这么几行代码就可以将函数外层的代码脱掉,看起来会稍微清晰一点。

写插件的通用套路就是先判断特征,再进行处理,当然,大多数情况下都是对字面量的处理。

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

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

(完)