SelfDefendingUnicodeNode.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as format from 'string-template';
  4. import { TStatement } from '../../types/node/TStatement';
  5. import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
  6. import { IOptions } from '../../interfaces/options/IOptions';
  7. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  8. import { initializable } from '../../decorators/Initializable';
  9. import { NO_CUSTOM_NODES_PRESET } from '../../options/presets/NoCustomNodes';
  10. import { SelfDefendingTemplate } from '../../templates/custom-nodes/self-defending-nodes/self-defending-unicode-node/SelfDefendingTemplate';
  11. import { AbstractCustomNode } from '../AbstractCustomNode';
  12. import { JavaScriptObfuscator } from '../../JavaScriptObfuscatorFacade';
  13. import { NodeUtils } from '../../node/NodeUtils';
  14. @injectable()
  15. export class SelfDefendingUnicodeNode extends AbstractCustomNode {
  16. /**
  17. * @type {IEscapeSequenceEncoder}
  18. */
  19. private readonly escapeSequenceEncoder: IEscapeSequenceEncoder;
  20. /**
  21. * @type {string}
  22. */
  23. @initializable()
  24. private callsControllerFunctionName: string;
  25. /**
  26. * @type {IRandomGenerator}
  27. */
  28. private readonly randomGenerator: IRandomGenerator;
  29. /**
  30. * @param {IRandomGenerator} randomGenerator
  31. * @param {IEscapeSequenceEncoder} escapeSequenceEncoder
  32. * @param {IOptions} options
  33. */
  34. constructor (
  35. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  36. @inject(ServiceIdentifiers.IEscapeSequenceEncoder) escapeSequenceEncoder: IEscapeSequenceEncoder,
  37. @inject(ServiceIdentifiers.IOptions) options: IOptions
  38. ) {
  39. super(options);
  40. this.randomGenerator = randomGenerator;
  41. this.escapeSequenceEncoder = escapeSequenceEncoder;
  42. }
  43. /**
  44. * @param {string} callsControllerFunctionName
  45. */
  46. public initialize (callsControllerFunctionName: string): void {
  47. this.callsControllerFunctionName = callsControllerFunctionName;
  48. }
  49. /**
  50. * @returns {TStatement[]}
  51. */
  52. protected getNodeStructure (): TStatement[] {
  53. return NodeUtils.convertCodeToStructure(this.getTemplate());
  54. }
  55. /**
  56. * @returns {string}
  57. */
  58. protected getTemplate (): string {
  59. return JavaScriptObfuscator.obfuscate(
  60. format(SelfDefendingTemplate(this.escapeSequenceEncoder), {
  61. selfDefendingFunctionName: this.randomGenerator.getRandomVariableName(6),
  62. singleNodeCallControllerFunctionName: this.callsControllerFunctionName
  63. }),
  64. {
  65. ...NO_CUSTOM_NODES_PRESET,
  66. seed: this.options.seed,
  67. unicodeEscapeSequence: true
  68. }
  69. ).getObfuscatedCode();
  70. }
  71. }