Obfuscator.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. import * as estraverse from 'estraverse';
  2. import { ICustomNode } from './interfaces/custom-nodes/ICustomNode';
  3. import { INode } from './interfaces/nodes/INode';
  4. import { IObfuscator } from "./interfaces/IObfuscator";
  5. import { IOptions } from "./interfaces/IOptions";
  6. import { TNodeObfuscator } from "./types/TNodeObfuscator";
  7. import { AppendState } from './enums/AppendState';
  8. import { NodeType } from './enums/NodeType';
  9. import { CatchClauseObfuscator } from './node-obfuscators/CatchClauseObfuscator';
  10. import { ConsoleOutputNodesGroup } from "./node-groups/ConsoleOutputNodesGroup";
  11. import { DebugProtectionNodesGroup } from './node-groups/DebugProtectionNodesGroup';
  12. import { DomainLockNodesGroup } from './node-groups/DomainLockNodesGroup';
  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 { Nodes } from "./Nodes";
  19. import { NodeUtils } from "./NodeUtils";
  20. import { ObjectExpressionObfuscator } from './node-obfuscators/ObjectExpressionObfuscator';
  21. import { SelfDefendingNodesGroup } from "./node-groups/SelfDefendingNodesGroup";
  22. import { UnicodeArrayNodesGroup } from './node-groups/UnicodeArrayNodesGroup';
  23. import { VariableDeclarationObfuscator } from './node-obfuscators/VariableDeclarationObfuscator';
  24. export class Obfuscator implements IObfuscator {
  25. /**
  26. * @type {Map<string, AbstractCustomNode>}
  27. */
  28. private nodes: Map <string, ICustomNode>;
  29. /**
  30. * @type {Map<string, TNodeObfuscator[]>}
  31. */
  32. private nodeObfuscators: Map <string, TNodeObfuscator[]> = new Map <string, TNodeObfuscator[]> ([
  33. [NodeType.ArrowFunctionExpression, [FunctionObfuscator]],
  34. [NodeType.ClassDeclaration, [FunctionDeclarationObfuscator]],
  35. [NodeType.CatchClause, [CatchClauseObfuscator]],
  36. [NodeType.FunctionDeclaration, [
  37. FunctionDeclarationObfuscator,
  38. FunctionObfuscator
  39. ]],
  40. [NodeType.FunctionExpression, [FunctionObfuscator]],
  41. [NodeType.MemberExpression, [MemberExpressionObfuscator]],
  42. [NodeType.MethodDefinition, [MethodDefinitionObfuscator]],
  43. [NodeType.ObjectExpression, [ObjectExpressionObfuscator]],
  44. [NodeType.VariableDeclaration, [VariableDeclarationObfuscator]],
  45. [NodeType.Literal, [LiteralObfuscator]]
  46. ]);
  47. /**
  48. * @type {IOptions}
  49. */
  50. private options: IOptions;
  51. /**
  52. * @param options
  53. */
  54. constructor (options: IOptions) {
  55. this.options = options;
  56. this.nodes = new Map <string, ICustomNode> ([
  57. ...new SelfDefendingNodesGroup(this.options).getNodes(),
  58. ...new ConsoleOutputNodesGroup(this.options).getNodes(),
  59. ...new DebugProtectionNodesGroup(this.options).getNodes(),
  60. ...new UnicodeArrayNodesGroup(this.options).getNodes(),
  61. ...new DomainLockNodesGroup(this.options).getNodes()
  62. ]);
  63. }
  64. /**
  65. * @param node
  66. * @returns {INode}
  67. */
  68. public obfuscateNode (node: INode): INode {
  69. if (Nodes.isProgramNode(node) && !node.body.length) {
  70. return node;
  71. }
  72. NodeUtils.parentize(node);
  73. this.beforeObfuscation(node);
  74. this.obfuscate(node);
  75. this.afterObfuscation(node);
  76. return node;
  77. }
  78. /**
  79. * @param astTree
  80. */
  81. private afterObfuscation (astTree: INode): void {
  82. this.nodes.forEach((node: ICustomNode) => {
  83. if (node.getAppendState() === AppendState.AfterObfuscation) {
  84. node.appendNode(astTree);
  85. }
  86. });
  87. }
  88. /**
  89. * @param astTree
  90. */
  91. private beforeObfuscation (astTree: INode): void {
  92. this.nodes.forEach((node: ICustomNode) => {
  93. if (node.getAppendState() === AppendState.BeforeObfuscation) {
  94. node.appendNode(astTree);
  95. }
  96. });
  97. };
  98. /**
  99. * @param node
  100. * @param parentNode
  101. */
  102. private initializeNodeObfuscators (node: INode, parentNode: INode): void {
  103. let nodeObfuscators: TNodeObfuscator[] | undefined = this.nodeObfuscators.get(node.type);
  104. if (!nodeObfuscators) {
  105. return;
  106. }
  107. nodeObfuscators.forEach((obfuscator: TNodeObfuscator) => {
  108. new obfuscator(this.nodes, this.options).obfuscateNode(node, parentNode);
  109. });
  110. }
  111. /**
  112. * @param node
  113. */
  114. private obfuscate (node: INode): void {
  115. estraverse.replace(node, {
  116. leave: (node: INode, parentNode: INode): any => {
  117. this.initializeNodeObfuscators(node, parentNode);
  118. }
  119. });
  120. }
  121. }