Obfuscator.ts 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import { INode } from './interfaces/INode';
  2. import { INodeObfuscator } from './interfaces/INodeObfuscator';
  3. import { INodesGroup } from './interfaces/INodesGroup';
  4. import { AppendState } from './enums/AppendState';
  5. import { CatchClauseObfuscator } from "./node-obfuscators/CatchClauseObfuscator";
  6. import { FunctionDeclarationObfuscator } from './node-obfuscators/FunctionDeclarationObfuscator';
  7. import { FunctionObfuscator } from './node-obfuscators/FunctionObfuscator';
  8. import { LiteralObfuscator } from './node-obfuscators/LiteralObfuscator';
  9. import { MemberExpressionObfuscator } from './node-obfuscators/MemberExpressionObfuscator';
  10. import { MethodDefinitionObfuscator } from './node-obfuscators/MethodDefinitionObfuscator';
  11. import { ObjectExpressionObfuscator } from './node-obfuscators/ObjectExpressionObfuscator';
  12. import { UnicodeArrayNode } from './nodes/UnicodeArrayNode';
  13. import { UnicodeArrayNodesGroup } from './node-groups/UnicodeArrayNodesGroup';
  14. import { Utils } from './Utils';
  15. import { VariableDeclarationObfuscator } from './node-obfuscators/VariableDeclarationObfuscator';
  16. let estraverse = require('estraverse');
  17. export class Obfuscator {
  18. /**
  19. * @type {Map<string, Node>}
  20. */
  21. private nodes: Map <string, INode> = new Map <string, INode> ();
  22. /**
  23. * @type {Map<string, Function[]>}
  24. */
  25. private nodeObfuscators: Map <string, Function[]> = new Map <string, Function[]> ([
  26. ['ClassDeclaration', [FunctionDeclarationObfuscator]],
  27. ['CatchClause', [CatchClauseObfuscator]],
  28. ['FunctionDeclaration', [
  29. FunctionDeclarationObfuscator,
  30. FunctionObfuscator
  31. ]],
  32. ['ArrowFunctionExpression', [FunctionObfuscator]],
  33. ['FunctionExpression', [FunctionObfuscator]],
  34. ['MethodDefinition', [MethodDefinitionObfuscator]],
  35. ['VariableDeclaration', [VariableDeclarationObfuscator]],
  36. ['ObjectExpression', [ObjectExpressionObfuscator]],
  37. ['MemberExpression', [MemberExpressionObfuscator]],
  38. ['Literal', [LiteralObfuscator]]
  39. ]);
  40. /**
  41. * @type any
  42. */
  43. private options: any = {
  44. rotateUnicodeArray: true
  45. };
  46. /**
  47. * @param options
  48. */
  49. constructor (options: any) {
  50. Object.assign(this.options, options);
  51. }
  52. /**
  53. * @param node
  54. */
  55. public obfuscateNode (node: any): 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, parent) => this.nodeControllerFirstPass(node, parent)
  67. });
  68. estraverse.replace(node, {
  69. leave: (node, parent) => 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: any): 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: any): 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, parent): void {
  114. Object.defineProperty(node, 'parentNode', {
  115. enumerable: true,
  116. configurable: true,
  117. writable: true,
  118. value: parent || node
  119. });
  120. }
  121. /**
  122. * @param node
  123. * @param parent
  124. */
  125. private nodeControllerSecondPass (node, parent): 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: any, parent: any): 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. }