LabeledStatementTransformer.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as estraverse from 'estraverse';
  4. import * as ESTree from 'estree';
  5. import { TObfuscationReplacerFactory } from '../../types/container/TObfuscationReplacerFactory';
  6. import { IOptions } from '../../interfaces/options/IOptions';
  7. import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
  8. import { IVisitor } from '../../interfaces/IVisitor';
  9. import { ObfuscationReplacers } from '../../enums/container/ObfuscationReplacers';
  10. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  11. import { Node } from '../../node/Node';
  12. /**
  13. * replaces:
  14. * label: {
  15. * for (var i = 0; i < 1000; i++) {
  16. * break label;
  17. * }
  18. * }
  19. *
  20. * on:
  21. * _0x12d45f: {
  22. * for (var i = 0; i < 1000; i++) {
  23. * break _0x12d45f;
  24. * }
  25. * }
  26. *
  27. */
  28. @injectable()
  29. export class LabeledStatementTransformer extends AbstractNodeTransformer {
  30. /**
  31. * @type {IObfuscationReplacerWithStorage}
  32. */
  33. private readonly identifierReplacer: IObfuscationReplacerWithStorage;
  34. /**
  35. * @param obfuscationReplacerFactory
  36. * @param options
  37. */
  38. constructor (
  39. @inject(ServiceIdentifiers.Factory__IObfuscationReplacer) obfuscationReplacerFactory: TObfuscationReplacerFactory,
  40. @inject(ServiceIdentifiers.IOptions) options: IOptions
  41. ) {
  42. super(options);
  43. this.identifierReplacer = <IObfuscationReplacerWithStorage>obfuscationReplacerFactory(ObfuscationReplacers.IdentifierReplacer);
  44. }
  45. /**
  46. * @return {IVisitor}
  47. */
  48. public getVisitor (): IVisitor {
  49. return {
  50. enter: (node: ESTree.Node, parentNode: ESTree.Node) => {
  51. if (Node.isLabeledStatementNode(node)) {
  52. return this.transformNode(node, parentNode);
  53. }
  54. }
  55. };
  56. }
  57. /**
  58. * @param labeledStatementNode
  59. * @param parentNode
  60. * @returns {ESTree.Node}
  61. */
  62. public transformNode (labeledStatementNode: ESTree.LabeledStatement, parentNode: ESTree.Node): ESTree.Node {
  63. const nodeIdentifier: number = this.nodeIdentifier++;
  64. this.storeLabeledStatementName(labeledStatementNode, nodeIdentifier);
  65. this.replaceLabeledStatementName(labeledStatementNode, nodeIdentifier);
  66. return labeledStatementNode;
  67. }
  68. /**
  69. * @param labeledStatementNode
  70. * @param nodeIdentifier
  71. */
  72. private storeLabeledStatementName (labeledStatementNode: ESTree.LabeledStatement, nodeIdentifier: number): void {
  73. this.identifierReplacer.storeNames(labeledStatementNode.label.name, nodeIdentifier);
  74. }
  75. /**
  76. * @param labeledStatementNode
  77. * @param nodeIdentifier
  78. */
  79. private replaceLabeledStatementName (labeledStatementNode: ESTree.LabeledStatement, nodeIdentifier: number): void {
  80. estraverse.replace(labeledStatementNode, {
  81. enter: (node: ESTree.Node, parentNode: ESTree.Node): any => {
  82. if (Node.isLabelIdentifierNode(node, parentNode)) {
  83. node.name = this.identifierReplacer.replace(node.name, nodeIdentifier);
  84. }
  85. }
  86. });
  87. }
  88. }