js反混淆

var esprima = require('esprima');
var estraverse = require('estraverse');
var escodegen = require('escodegen');
 
function shouldSwitchScope(node) {
  return node.type.match(/^Function(Express|Declarat)ion$/);
}
 
function main(fileName) {
  var code = require('fs').readFileSync(fileName).toString();
  var ast = esprima.parse(code);
  var strings = {};
  var scopeDepth = 0; // initial: global
 
  // pass 1: extract all strings
  estraverse.traverse(ast, {
    enter: function(node) {
      if (shouldSwitchScope(node)) {
    scopeDepth++;
      }
       
      if (scopeDepth == 0 &&
    node.type === esprima.Syntax.VariableDeclarator &&
        node.init &&
        node.init.type === esprima.Syntax.ArrayExpression &&
    node.init.elements.every(function(e) {return e.type === esprima.Syntax.Literal})) {
        strings[node.id.name] = node.init.elements.map(function(e) {
          return e.value;
        });
        this.skip();
      }
    },
    leave: function(node) {
      if (shouldSwitchScope(node)) {
        scopeDepth--;
      }
    }
  });
 
  // pass 2: restore code
  ast = estraverse.replace(ast, {
    enter: function(node) {},
    leave: function(node) {
      // restore strings
      if (node.type === esprima.Syntax.MemberExpression &&
        node.computed &&
        strings.hasOwnProperty(node.object.name) &&
        node.property.type === esprima.Syntax.Literal
      ) {
        var val = strings[node.object.name][node.property.value];
        return {
          type: esprima.Syntax.Literal,
          value: val,
          raw: val
        }
      }
       
      if (node.type === esprima.Syntax.MemberExpression &&
        node.property.type === esprima.Syntax.Literal &&
        typeof node.property.value === 'string'
      ) {
        return {
          type: esprima.Syntax.MemberExpression,
          computed: false,
          object: node.object,
          property: {
            type: esprima.Syntax.Identifier,
            name: node.property.value
          }
        }
      }
    }
  });
 
  console.log(escodegen.generate(ast));
}
 
main(process.argv[2]);

代码转自:http://cnodejs.org/topic/55b3116c692e0e7706b36754

测试了一下,效果不错。

转载于:https://my.oschina.net/mingyuejingque/blog/789025

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值