Obfuscator.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import * as estraverse from 'estraverse';
  2. import { ICustomNode } from './interfaces/ICustomNode';
  3. import { INodesGroup } from './interfaces/INodesGroup';
  4. import { INode } from './interfaces/nodes/INode';
  5. import { IObfuscator } from "./interfaces/IObfuscator";
  6. import { IOptions } from "./interfaces/IOptions";
  7. import { TNodeObfuscator } from "./types/TNodeObfuscator";
  8. import { AppendState } from './enums/AppendState';
  9. import { NodeType } from './enums/NodeType';
  10. import { CatchClauseObfuscator } from './node-obfuscators/CatchClauseObfuscator';
  11. import { ConsoleOutputDisableExpressionNode } from './custom-nodes/console-output-nodes/ConsoleOutputDisableExpressionNode';
  12. import { DebugProtectionNodesGroup } from './node-groups/DebugProtectionNodesGroup';
  13. import { FunctionDeclarationObfuscator } from './node-obfuscators/FunctionDeclarationObfuscator';
  14. import { FunctionObfuscator } from './node-obfuscators/FunctionObfuscator';
  15. import { LiteralObfuscator } from './node-obfuscators/LiteralObfuscator';
  16. import { MemberExpressionObfuscator } from './node-obfuscators/MemberExpressionObfuscator';
  17. import { MethodDefinitionObfuscator } from './node-obfuscators/MethodDefinitionObfuscator';
  18. import { NodeUtils } from "./NodeUtils";
  19. import { ObjectExpressionObfuscator } from './node-obfuscators/ObjectExpressionObfuscator';
  20. import { SelfDefendingNodesGroup } from "./node-groups/SelfDefendingNodesGroup";
  21. import { UnicodeArrayNodesGroup } from './node-groups/UnicodeArrayNodesGroup';
  22. import { VariableDeclarationObfuscator } from './node-obfuscators/VariableDeclarationObfuscator';
  23. export class Obfuscator implements IObfuscator {
  24. /**
  25. * @type {Map<string, Node>}
  26. */
  27. private nodes: Map <string, ICustomNode> = new Map <string, ICustomNode> ();
  28. /**
  29. * @type {Map<string, TNodeObfuscator[]>}
  30. */
  31. private nodeObfuscators: Map <string, TNodeObfuscator[]> = new Map <string, TNodeObfuscator[]> ([
  32. [NodeType.ArrowFunctionExpression, [FunctionObfuscator]],
  33. [NodeType.ClassDeclaration, [FunctionDeclarationObfuscator]],
  34. [NodeType.CatchClause, [CatchClauseObfuscator]],
  35. [NodeType.FunctionDeclaration, [
  36. FunctionDeclarationObfuscator,
  37. FunctionObfuscator
  38. ]],
  39. [NodeType.FunctionExpression, [FunctionObfuscator]],
  40. [NodeType.MemberExpression, [MemberExpressionObfuscator]],
  41. [NodeType.MethodDefinition, [MethodDefinitionObfuscator]],
  42. [NodeType.ObjectExpression, [ObjectExpressionObfuscator]],
  43. [NodeType.VariableDeclaration, [VariableDeclarationObfuscator]],
  44. [NodeType.Literal, [LiteralObfuscator]]
  45. ]);
  46. /**
  47. * @type {IOptions}
  48. */
  49. private options: IOptions;
  50. /**
  51. * @param options
  52. */
  53. constructor (options: IOptions) {
  54. this.options = options;
  55. }
  56. /**
  57. * @param node
  58. * @returns {INode}
  59. */
  60. public obfuscateNode (node: INode): INode {
  61. this.setNewNodes();
  62. NodeUtils.parentize(node);
  63. this.beforeObfuscation(node);
  64. this.obfuscate(node);
  65. this.afterObfuscation(node);
  66. return node;
  67. }
  68. /**
  69. * @param nodeName
  70. * @param node
  71. */
  72. private setNode (nodeName: string, node: ICustomNode): void {
  73. this.nodes.set(nodeName, node);
  74. }
  75. /**
  76. * @param nodesGroup
  77. */
  78. private setNodesGroup (nodesGroup: INodesGroup): void {
  79. let nodes: Map <string, ICustomNode> = nodesGroup.getNodes();
  80. nodes.forEach((node: ICustomNode, key: string) => {
  81. this.nodes.set(key, node);
  82. });
  83. }
  84. /**
  85. * @param astTree
  86. */
  87. private afterObfuscation (astTree: INode): void {
  88. this.nodes.forEach((node: ICustomNode) => {
  89. if (node.getAppendState() === AppendState.AfterObfuscation) {
  90. node.appendNode(astTree);
  91. }
  92. });
  93. }
  94. /**
  95. * @param astTree
  96. */
  97. private beforeObfuscation (astTree: INode): void {
  98. this.nodes.forEach((node: ICustomNode) => {
  99. if (node.getAppendState() === AppendState.BeforeObfuscation) {
  100. node.appendNode(astTree);
  101. }
  102. });
  103. };
  104. /**
  105. * @param node
  106. * @param parentNode
  107. */
  108. private initializeNodeObfuscators (node: INode, parentNode: INode): void {
  109. if (!this.nodeObfuscators.has(node.type)) {
  110. return;
  111. }
  112. this.nodeObfuscators.get(node.type).forEach((obfuscator: TNodeObfuscator) => {
  113. new obfuscator(this.nodes, this.options).obfuscateNode(node, parentNode);
  114. });
  115. }
  116. /**
  117. * @param node
  118. */
  119. private obfuscate (node: INode): void {
  120. estraverse.replace(node, {
  121. leave: (node: INode, parentNode: INode): any => {
  122. this.initializeNodeObfuscators(node, parentNode);
  123. }
  124. });
  125. }
  126. private setNewNodes (): void {
  127. if (this.options.get('selfDefending')) {
  128. this.setNodesGroup(new SelfDefendingNodesGroup(this.options));
  129. }
  130. if (this.options.get('disableConsoleOutput')) {
  131. this.setNode(
  132. 'consoleOutputDisableExpressionNode',
  133. new ConsoleOutputDisableExpressionNode(this.options)
  134. );
  135. }
  136. if (this.options.get('debugProtection')) {
  137. this.setNodesGroup(new DebugProtectionNodesGroup(this.options));
  138. }
  139. if (this.options.get('unicodeArray')) {
  140. /**
  141. * Important to set this nodes latest to prevent runtime errors caused by `rotateUnicodeArray` option
  142. */
  143. this.setNodesGroup(new UnicodeArrayNodesGroup(this.options));
  144. }
  145. }
  146. }