Obfuscator.ts 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import * as estraverse from 'estraverse';
  2. import { INode } from './interfaces/INode';
  3. import { INodeObfuscator } from './interfaces/INodeObfuscator';
  4. import { INodesGroup } from './interfaces/INodesGroup';
  5. import { ITreeNode } from './interfaces/nodes/ITreeNode';
  6. import { AppendState } from './enums/AppendState';
  7. import { CatchClauseObfuscator } from "./node-obfuscators/CatchClauseObfuscator";
  8. import { FunctionDeclarationObfuscator } from './node-obfuscators/FunctionDeclarationObfuscator';
  9. import { FunctionObfuscator } from './node-obfuscators/FunctionObfuscator';
  10. import { LiteralObfuscator } from './node-obfuscators/LiteralObfuscator';
  11. import { MemberExpressionObfuscator } from './node-obfuscators/MemberExpressionObfuscator';
  12. import { MethodDefinitionObfuscator } from './node-obfuscators/MethodDefinitionObfuscator';
  13. import { ObjectExpressionObfuscator } from './node-obfuscators/ObjectExpressionObfuscator';
  14. import { UnicodeArrayNode } from './nodes/UnicodeArrayNode';
  15. import { UnicodeArrayNodesGroup } from './node-groups/UnicodeArrayNodesGroup';
  16. import { Utils } from './Utils';
  17. import { VariableDeclarationObfuscator } from './node-obfuscators/VariableDeclarationObfuscator';
  18. export class Obfuscator {
  19. /**
  20. * @type {Map<string, Node>}
  21. */
  22. private nodes: Map <string, INode> = new Map <string, INode> ();
  23. /**
  24. * @type {Map<string, Function[]>}
  25. */
  26. private nodeObfuscators: Map <string, Function[]> = new Map <string, Function[]> ([
  27. ['ClassDeclaration', [FunctionDeclarationObfuscator]],
  28. ['CatchClause', [CatchClauseObfuscator]],
  29. ['FunctionDeclaration', [
  30. FunctionDeclarationObfuscator,
  31. FunctionObfuscator
  32. ]],
  33. ['ArrowFunctionExpression', [FunctionObfuscator]],
  34. ['FunctionExpression', [FunctionObfuscator]],
  35. ['MethodDefinition', [MethodDefinitionObfuscator]],
  36. ['VariableDeclaration', [VariableDeclarationObfuscator]],
  37. ['ObjectExpression', [ObjectExpressionObfuscator]],
  38. ['MemberExpression', [MemberExpressionObfuscator]],
  39. ['Literal', [LiteralObfuscator]]
  40. ]);
  41. /**
  42. * @type any
  43. */
  44. private options: any;
  45. /**
  46. * @param options
  47. */
  48. constructor (options: any = {}) {
  49. this.options = options;
  50. }
  51. /**
  52. * @param node
  53. */
  54. public obfuscateNode (node: ITreeNode): void {
  55. if (this.options['rotateUnicodeArray']) {
  56. this.setNodesGroup(new UnicodeArrayNodesGroup(node));
  57. } else {
  58. this.setNode(
  59. 'unicodeArrayNode',
  60. new UnicodeArrayNode(node, Utils.getRandomVariableName(UnicodeArrayNode.UNICODE_ARRAY_RANDOM_LENGTH))
  61. );
  62. }
  63. this.beforeObfuscation(node);
  64. estraverse.replace(node, {
  65. enter: (node: ITreeNode, parent: ITreeNode): any => this.nodeControllerFirstPass(node, parent)
  66. });
  67. estraverse.replace(node, {
  68. leave: (node: ITreeNode, parent: ITreeNode): any => this.nodeControllerSecondPass(node, parent)
  69. });
  70. this.afterObfuscation(node);
  71. }
  72. /**
  73. * @param nodeName
  74. * @param node
  75. */
  76. public setNode (nodeName: string, node: INode): void {
  77. this.nodes.set(nodeName, node);
  78. }
  79. /**
  80. * @param nodesGroup
  81. */
  82. public setNodesGroup (nodesGroup: INodesGroup): void {
  83. let nodes: Map <string, INode> = nodesGroup.getNodes();
  84. nodes.forEach((node: INode, key: string) => {
  85. this.nodes.set(key, node);
  86. });
  87. }
  88. /**
  89. * @param node
  90. */
  91. private afterObfuscation (node: ITreeNode): void {
  92. this.nodes.forEach((node: INode) => {
  93. if (node.getAppendState() === AppendState.AfterObfuscation) {
  94. node.appendNode();
  95. }
  96. });
  97. }
  98. /**
  99. * @param node
  100. */
  101. private beforeObfuscation (node: ITreeNode): void {
  102. this.nodes.forEach((node: INode) => {
  103. if (node.getAppendState() === AppendState.BeforeObfuscation) {
  104. node.appendNode();
  105. }
  106. });
  107. };
  108. /**
  109. * @param node
  110. * @param parent
  111. */
  112. private nodeControllerFirstPass (node: ITreeNode, parent: ITreeNode): void {
  113. Object.defineProperty(node, 'parentNode', {
  114. configurable: true,
  115. enumerable: true,
  116. value: parent || node,
  117. writable: true
  118. });
  119. }
  120. /**
  121. * @param node
  122. * @param parent
  123. */
  124. private nodeControllerSecondPass (node: ITreeNode, parent: ITreeNode): void {
  125. switch (node.type) {
  126. default:
  127. this.initializeNodeObfuscators(node, parent);
  128. }
  129. }
  130. /**
  131. * @param node
  132. * @param parent
  133. */
  134. private initializeNodeObfuscators (node: ITreeNode, parent: ITreeNode): void {
  135. if (!this.nodeObfuscators.has(node.type)) {
  136. return;
  137. }
  138. this.nodeObfuscators.get(node.type).forEach((obfuscator: Function) => {
  139. new (<INodeObfuscator> obfuscator(this.nodes)).obfuscateNode(node, parent);
  140. });
  141. }
  142. }