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

                                                      前言         

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

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

!(function()
{
    somecode;
})();

插件功能

优化无实参的自执行函数

处理实例

处理前:

!(function()
{
  a = b;
})();

处理后:

a = b;

插件源码

const types     = require("@babel/types");
const simplify_auto_exec = {
  UnaryExpression(path)
  {
    let {operator,argument} = path.node;
    if (operator != "!" || !types.isCallExpression(argument)) return;
    let {arguments,callee} = argument;
    if (arguments.length !=0 || !types.isFunctionExpression(callee)) return;
    
    let {id,params,body} = callee;
    if (id != null || params.length !=0 || !types.isBlockStatement(body)) return;
    path.replaceWithMultiple(body.body);
  },
}

思路

其实就是将函数体里面的内容替换整个表达式


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

注意事项

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

结语

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值