Obfuscator.js 4.9 KB

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