LabeledStatementObfuscator.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import * as estraverse from 'estraverse';
  2. import * as ESTree from 'estree';
  3. import { ICustomNode } from '../interfaces/custom-nodes/ICustomNode';
  4. import { IOptions } from '../interfaces/IOptions';
  5. import { NodeType } from '../enums/NodeType';
  6. import { AbstractNodeObfuscator } from './AbstractNodeObfuscator';
  7. import { IdentifierReplacer } from './replacers/IdentifierReplacer';
  8. import { Node } from '../node/Node';
  9. import { NodeUtils } from '../node/NodeUtils';
  10. /**
  11. * replaces:
  12. * label: {
  13. * for (var i = 0; i < 1000; i++) {
  14. * break label;
  15. * }
  16. * }
  17. *
  18. * on:
  19. * _0x12d45f: {
  20. * for (var i = 0; i < 1000; i++) {
  21. * break _0x12d45f;
  22. * }
  23. * }
  24. *
  25. */
  26. export class LabeledStatementObfuscator extends AbstractNodeObfuscator {
  27. /**
  28. * @type {IdentifierReplacer}
  29. */
  30. private identifierReplacer: IdentifierReplacer;
  31. /**
  32. * @param nodes
  33. * @param options
  34. */
  35. constructor(nodes: Map <string, ICustomNode>, options: IOptions) {
  36. super(nodes, options);
  37. this.identifierReplacer = new IdentifierReplacer(this.nodes, this.options);
  38. }
  39. /**
  40. * @param labeledStatementNode
  41. */
  42. public transformNode (labeledStatementNode: ESTree.LabeledStatement): void {
  43. this.storeLabeledStatementName(labeledStatementNode);
  44. this.replaceLabeledStatementName(labeledStatementNode);
  45. }
  46. /**
  47. * @param labeledStatementNode
  48. */
  49. private storeLabeledStatementName (labeledStatementNode: ESTree.LabeledStatement): void {
  50. NodeUtils.typedReplace(labeledStatementNode.label, NodeType.Identifier, {
  51. enter: (node: ESTree.Identifier) => this.identifierReplacer.storeNames(node.name)
  52. });
  53. }
  54. /**
  55. * @param labeledStatementNode
  56. */
  57. private replaceLabeledStatementName (labeledStatementNode: ESTree.LabeledStatement): void {
  58. estraverse.replace(labeledStatementNode, {
  59. enter: (node: ESTree.Node, parentNode: ESTree.Node): any => {
  60. if (Node.isLabelIdentifierNode(node, parentNode)) {
  61. node.name = this.identifierReplacer.replace(node.name);
  62. }
  63. }
  64. });
  65. }
  66. }