StringArrayCallsWrapper.ts 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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 { IOptions } from '../../interfaces/options/IOptions';
  6. import { IStorage } from '../../interfaces/storages/IStorage';
  7. import { StringArrayEncoding } from '../../enums/StringArrayEncoding';
  8. import { initializable } from '../../decorators/Initializable';
  9. import { NO_CUSTOM_NODES_PRESET } from '../../options/presets/NoCustomNodes';
  10. import { AtobTemplate } from '../../templates/custom-nodes/AtobTemplate';
  11. import { Rc4Template } from '../../templates/custom-nodes/Rc4Template';
  12. import { SelfDefendingTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/SelfDefendingTemplate';
  13. import { StringArrayBase64DecodeNodeTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayBase64DecodeNodeTemplate';
  14. import { StringArrayCallsWrapperTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayCallsWrapperTemplate';
  15. import { StringArrayRc4DecodeNodeTemplate } from '../../templates/custom-nodes/string-array-nodes/string-array-calls-wrapper/StringArrayRC4DecodeNodeTemplate';
  16. import { AbstractCustomNode } from '../AbstractCustomNode';
  17. import { JavaScriptObfuscator } from '../../JavaScriptObfuscator';
  18. import { NodeUtils } from '../../node/NodeUtils';
  19. @injectable()
  20. export class StringArrayCallsWrapper extends AbstractCustomNode {
  21. /**
  22. * @type {IStorage <string>}
  23. */
  24. @initializable()
  25. private stringArrayStorage: IStorage <string>;
  26. /**
  27. * @type {string}
  28. */
  29. @initializable()
  30. private stringArrayName: string;
  31. /**
  32. * @type {string}
  33. */
  34. @initializable()
  35. private stringArrayCallsWrapperName: string;
  36. /**
  37. * @param options
  38. */
  39. constructor (
  40. @inject(ServiceIdentifiers.IOptions) options: IOptions
  41. ) {
  42. super(options);
  43. }
  44. /**
  45. * @param stringArrayStorage
  46. * @param stringArrayName
  47. * @param stringArrayCallsWrapperName
  48. */
  49. public initialize (
  50. stringArrayStorage: IStorage <string>,
  51. stringArrayName: string,
  52. stringArrayCallsWrapperName: string
  53. ): void {
  54. this.stringArrayStorage = stringArrayStorage;
  55. this.stringArrayName = stringArrayName;
  56. this.stringArrayCallsWrapperName = stringArrayCallsWrapperName;
  57. }
  58. /**
  59. * @returns {TStatement[]}
  60. */
  61. protected getNodeStructure (): TStatement[] {
  62. return NodeUtils.convertCodeToStructure(this.getTemplate());
  63. }
  64. /**
  65. * @returns {string}
  66. */
  67. protected getTemplate (): string {
  68. const decodeNodeTemplate: string = this.getDecodeStringArrayTemplate();
  69. return JavaScriptObfuscator.obfuscate(
  70. format(StringArrayCallsWrapperTemplate(), {
  71. decodeNodeTemplate,
  72. stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
  73. stringArrayName: this.stringArrayName
  74. }),
  75. {
  76. ...NO_CUSTOM_NODES_PRESET,
  77. seed: this.options.seed
  78. }
  79. ).getObfuscatedCode();
  80. }
  81. /**
  82. * @returns {string}
  83. */
  84. private getDecodeStringArrayTemplate (): string {
  85. let decodeStringArrayTemplate: string = '',
  86. selfDefendingCode: string = '';
  87. if (this.options.selfDefending) {
  88. selfDefendingCode = format(SelfDefendingTemplate(), {
  89. stringArrayCallsWrapperName: this.stringArrayCallsWrapperName,
  90. stringArrayName: this.stringArrayName
  91. });
  92. }
  93. switch (this.options.stringArrayEncoding) {
  94. case StringArrayEncoding.Rc4:
  95. decodeStringArrayTemplate = format(StringArrayRc4DecodeNodeTemplate(), {
  96. atobPolyfill: AtobTemplate(),
  97. rc4Polyfill: Rc4Template(),
  98. selfDefendingCode,
  99. stringArrayCallsWrapperName: this.stringArrayCallsWrapperName
  100. });
  101. break;
  102. case StringArrayEncoding.Base64:
  103. decodeStringArrayTemplate = format(StringArrayBase64DecodeNodeTemplate(), {
  104. atobPolyfill: AtobTemplate(),
  105. selfDefendingCode,
  106. stringArrayCallsWrapperName: this.stringArrayCallsWrapperName
  107. });
  108. break;
  109. }
  110. return decodeStringArrayTemplate;
  111. }
  112. }