StringArrayRotateFunctionCodeHelper.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { inject, injectable, } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import { TIdentifierNamesGeneratorFactory } from '../../types/container/generators/TIdentifierNamesGeneratorFactory';
  4. import { TStatement } from '../../types/node/TStatement';
  5. import { ICustomCodeHelperFormatter } from '../../interfaces/custom-code-helpers/ICustomCodeHelperFormatter';
  6. import { ICustomCodeHelperObfuscator } from '../../interfaces/custom-code-helpers/ICustomCodeHelperObfuscator';
  7. import { IEscapeSequenceEncoder } from '../../interfaces/utils/IEscapeSequenceEncoder';
  8. import { IOptions } from '../../interfaces/options/IOptions';
  9. import { IRandomGenerator } from '../../interfaces/utils/IRandomGenerator';
  10. import { initializable } from '../../decorators/Initializable';
  11. import { SelfDefendingTemplate } from './templates/string-array-rotate-function/SelfDefendingTemplate';
  12. import { StringArrayRotateFunctionTemplate } from './templates/string-array-rotate-function/StringArrayRotateFunctionTemplate';
  13. import { AbstractCustomCodeHelper } from '../AbstractCustomCodeHelper';
  14. import { NodeUtils } from '../../node/NodeUtils';
  15. import { NumberUtils } from '../../utils/NumberUtils';
  16. @injectable()
  17. export class StringArrayRotateFunctionCodeHelper extends AbstractCustomCodeHelper {
  18. /**
  19. * @type {string}
  20. */
  21. @initializable()
  22. private stringArrayName!: string;
  23. /**
  24. * @param {number}
  25. */
  26. @initializable()
  27. private stringArrayRotationAmount!: number;
  28. /**
  29. * @type {IEscapeSequenceEncoder}
  30. */
  31. private readonly escapeSequenceEncoder: IEscapeSequenceEncoder;
  32. /**
  33. * @param {TIdentifierNamesGeneratorFactory} identifierNamesGeneratorFactory
  34. * @param {ICustomCodeHelperFormatter} customCodeHelperFormatter
  35. * @param {ICustomCodeHelperObfuscator} customCodeHelperObfuscator
  36. * @param {IRandomGenerator} randomGenerator
  37. * @param {IOptions} options
  38. * @param {IEscapeSequenceEncoder} escapeSequenceEncoder
  39. */
  40. public constructor (
  41. @inject(ServiceIdentifiers.Factory__IIdentifierNamesGenerator)
  42. identifierNamesGeneratorFactory: TIdentifierNamesGeneratorFactory,
  43. @inject(ServiceIdentifiers.ICustomCodeHelperFormatter) customCodeHelperFormatter: ICustomCodeHelperFormatter,
  44. @inject(ServiceIdentifiers.ICustomCodeHelperObfuscator) customCodeHelperObfuscator: ICustomCodeHelperObfuscator,
  45. @inject(ServiceIdentifiers.IRandomGenerator) randomGenerator: IRandomGenerator,
  46. @inject(ServiceIdentifiers.IOptions) options: IOptions,
  47. @inject(ServiceIdentifiers.IEscapeSequenceEncoder) escapeSequenceEncoder: IEscapeSequenceEncoder
  48. ) {
  49. super(
  50. identifierNamesGeneratorFactory,
  51. customCodeHelperFormatter,
  52. customCodeHelperObfuscator,
  53. randomGenerator,
  54. options
  55. );
  56. this.escapeSequenceEncoder = escapeSequenceEncoder;
  57. }
  58. /**
  59. * @param {string} stringArrayName
  60. * @param {number} stringArrayRotationAmount
  61. */
  62. public initialize (
  63. stringArrayName: string,
  64. stringArrayRotationAmount: number
  65. ): void {
  66. this.stringArrayName = stringArrayName;
  67. this.stringArrayRotationAmount = stringArrayRotationAmount;
  68. }
  69. /**
  70. * @param {string} codeHelperTemplate
  71. * @returns {TStatement[]}
  72. */
  73. protected getNodeStructure (codeHelperTemplate: string): TStatement[] {
  74. return NodeUtils.convertCodeToStructure(codeHelperTemplate);
  75. }
  76. /**
  77. * @returns {string}
  78. */
  79. protected getCodeHelperTemplate (): string {
  80. const timesName: string = this.identifierNamesGenerator.generateNext();
  81. const whileFunctionName: string = this.identifierNamesGenerator.generateNext();
  82. const preservedNames: string[] = [`^${this.stringArrayName}$`];
  83. let code: string = '';
  84. if (this.options.selfDefending) {
  85. code = this.customCodeHelperFormatter.formatTemplate(SelfDefendingTemplate(this.escapeSequenceEncoder), {
  86. timesName,
  87. whileFunctionName
  88. });
  89. } else {
  90. code = `${whileFunctionName}(++${timesName})`;
  91. }
  92. return this.customCodeHelperObfuscator.obfuscateTemplate(
  93. this.customCodeHelperFormatter.formatTemplate(StringArrayRotateFunctionTemplate(), {
  94. code,
  95. timesName,
  96. whileFunctionName,
  97. stringArrayName: this.stringArrayName,
  98. stringArrayRotationAmount: NumberUtils.toHex(this.stringArrayRotationAmount)
  99. }),
  100. {
  101. reservedNames: preservedNames
  102. }
  103. );
  104. }
  105. }