Obfuscator.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. "use strict";
  2. const estraverse = require('estraverse');
  3. const AppendState_1 = require('./enums/AppendState');
  4. const NodeType_1 = require("./enums/NodeType");
  5. const CatchClauseObfuscator_1 = require("./node-obfuscators/CatchClauseObfuscator");
  6. const FunctionDeclarationObfuscator_1 = require('./node-obfuscators/FunctionDeclarationObfuscator');
  7. const FunctionObfuscator_1 = require('./node-obfuscators/FunctionObfuscator');
  8. const LiteralObfuscator_1 = require('./node-obfuscators/LiteralObfuscator');
  9. const MemberExpressionObfuscator_1 = require('./node-obfuscators/MemberExpressionObfuscator');
  10. const MethodDefinitionObfuscator_1 = require('./node-obfuscators/MethodDefinitionObfuscator');
  11. const ObjectExpressionObfuscator_1 = require('./node-obfuscators/ObjectExpressionObfuscator');
  12. const UnicodeArrayNode_1 = require('./nodes/UnicodeArrayNode');
  13. const UnicodeArrayNodesGroup_1 = require('./node-groups/UnicodeArrayNodesGroup');
  14. const Utils_1 = require('./Utils');
  15. const VariableDeclarationObfuscator_1 = require('./node-obfuscators/VariableDeclarationObfuscator');
  16. class Obfuscator {
  17. constructor(options = {}) {
  18. this.nodes = new Map();
  19. this.nodeObfuscators = new Map([
  20. [NodeType_1.NodeType.ArrowFunctionExpression, [FunctionObfuscator_1.FunctionObfuscator]],
  21. [NodeType_1.NodeType.ClassDeclaration, [FunctionDeclarationObfuscator_1.FunctionDeclarationObfuscator]],
  22. [NodeType_1.NodeType.CatchClause, [CatchClauseObfuscator_1.CatchClauseObfuscator]],
  23. [NodeType_1.NodeType.FunctionDeclaration, [
  24. FunctionDeclarationObfuscator_1.FunctionDeclarationObfuscator,
  25. FunctionObfuscator_1.FunctionObfuscator
  26. ]],
  27. [NodeType_1.NodeType.FunctionExpression, [FunctionObfuscator_1.FunctionObfuscator]],
  28. [NodeType_1.NodeType.MemberExpression, [MemberExpressionObfuscator_1.MemberExpressionObfuscator]],
  29. [NodeType_1.NodeType.MethodDefinition, [MethodDefinitionObfuscator_1.MethodDefinitionObfuscator]],
  30. [NodeType_1.NodeType.ObjectExpression, [ObjectExpressionObfuscator_1.ObjectExpressionObfuscator]],
  31. [NodeType_1.NodeType.VariableDeclaration, [VariableDeclarationObfuscator_1.VariableDeclarationObfuscator]],
  32. [NodeType_1.NodeType.Literal, [LiteralObfuscator_1.LiteralObfuscator]]
  33. ]);
  34. this.options = options;
  35. }
  36. obfuscateNode(node) {
  37. if (this.options['rotateUnicodeArray']) {
  38. this.setNodesGroup(new UnicodeArrayNodesGroup_1.UnicodeArrayNodesGroup(node));
  39. }
  40. else {
  41. this.setNode('unicodeArrayNode', new UnicodeArrayNode_1.UnicodeArrayNode(node, Utils_1.Utils.getRandomVariableName(UnicodeArrayNode_1.UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH)));
  42. }
  43. this.beforeObfuscation(node);
  44. estraverse.replace(node, {
  45. enter: (node, parent) => this.nodeControllerFirstPass(node, parent)
  46. });
  47. estraverse.replace(node, {
  48. leave: (node, parent) => this.nodeControllerSecondPass(node, parent)
  49. });
  50. this.afterObfuscation(node);
  51. }
  52. setNode(nodeName, node) {
  53. this.nodes.set(nodeName, node);
  54. }
  55. setNodesGroup(nodesGroup) {
  56. let nodes = nodesGroup.getNodes();
  57. nodes.forEach((node, key) => {
  58. this.nodes.set(key, node);
  59. });
  60. }
  61. afterObfuscation(node) {
  62. this.nodes.forEach((node) => {
  63. if (node.getAppendState() === AppendState_1.AppendState.AfterObfuscation) {
  64. node.appendNode();
  65. }
  66. });
  67. }
  68. beforeObfuscation(node) {
  69. this.nodes.forEach((node) => {
  70. if (node.getAppendState() === AppendState_1.AppendState.BeforeObfuscation) {
  71. node.appendNode();
  72. }
  73. });
  74. }
  75. ;
  76. nodeControllerFirstPass(node, parent) {
  77. Object.defineProperty(node, 'parentNode', {
  78. configurable: true,
  79. enumerable: true,
  80. value: parent || node,
  81. writable: true
  82. });
  83. }
  84. nodeControllerSecondPass(node, parent) {
  85. switch (node.type) {
  86. default:
  87. this.initializeNodeObfuscators(node, parent);
  88. }
  89. }
  90. initializeNodeObfuscators(node, parent) {
  91. if (!this.nodeObfuscators.has(node.type)) {
  92. return;
  93. }
  94. this.nodeObfuscators.get(node.type).forEach((obfuscator) => {
  95. new obfuscator(this.nodes).obfuscateNode(node, parent);
  96. });
  97. }
  98. }
  99. exports.Obfuscator = Obfuscator;