Obfuscator.ts 5.1 KB

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