LabeledStatementObfuscator.ts 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 { IOptions } from '../../interfaces/options/IOptions';
  6. import { IReplacer } from '../../interfaces/node-transformers/IReplacer';
  7. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
  8. import { NodeType } from '../../enums/NodeType';
  9. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  10. import { IdentifierReplacer } from './replacers/IdentifierReplacer';
  11. import { Node } from '../../node/Node';
  12. import { NodeUtils } from '../../node/NodeUtils';
  13. import { Utils } from '../../Utils';
  14. /**
  15. * replaces:
  16. * label: {
  17. * for (var i = 0; i < 1000; i++) {
  18. * break label;
  19. * }
  20. * }
  21. *
  22. * on:
  23. * _0x12d45f: {
  24. * for (var i = 0; i < 1000; i++) {
  25. * break _0x12d45f;
  26. * }
  27. * }
  28. *
  29. */
  30. @injectable()
  31. export class LabeledStatementObfuscator extends AbstractNodeTransformer {
  32. /**
  33. * @type {IdentifierReplacer}
  34. */
  35. private readonly identifierReplacer: IdentifierReplacer;
  36. /**
  37. * @param nodeObfuscatorsReplacersFactory
  38. * @param options
  39. */
  40. constructor(
  41. @inject(ServiceIdentifiers['Factory<IReplacer>']) nodeObfuscatorsReplacersFactory: (replacer: NodeObfuscatorsReplacers) => IReplacer,
  42. @inject(ServiceIdentifiers.IOptions) options: IOptions
  43. ) {
  44. super(options);
  45. this.identifierReplacer = <IdentifierReplacer>nodeObfuscatorsReplacersFactory(NodeObfuscatorsReplacers.IdentifierReplacer);
  46. }
  47. /**
  48. * @param labeledStatementNode
  49. */
  50. public transformNode (labeledStatementNode: ESTree.LabeledStatement): void {
  51. this.identifierReplacer.setPrefix(Utils.getRandomGenerator().string({
  52. length: 5,
  53. pool: Utils.randomGeneratorPool
  54. }));
  55. this.storeLabeledStatementName(labeledStatementNode);
  56. this.replaceLabeledStatementName(labeledStatementNode);
  57. }
  58. /**
  59. * @param labeledStatementNode
  60. */
  61. private storeLabeledStatementName (labeledStatementNode: ESTree.LabeledStatement): void {
  62. NodeUtils.typedTraverse(labeledStatementNode.label, NodeType.Identifier, {
  63. enter: (node: ESTree.Identifier) => this.identifierReplacer.storeNames(node.name)
  64. });
  65. }
  66. /**
  67. * @param labeledStatementNode
  68. */
  69. private replaceLabeledStatementName (labeledStatementNode: ESTree.LabeledStatement): void {
  70. estraverse.replace(labeledStatementNode, {
  71. enter: (node: ESTree.Node, parentNode: ESTree.Node): any => {
  72. if (Node.isLabelIdentifierNode(node, parentNode)) {
  73. node.name = this.identifierReplacer.replace(node.name);
  74. }
  75. }
  76. });
  77. }
  78. }