UnicodeArrayDecodeNode.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import * as ESTree from 'estree';
  2. import 'format-unicorn';
  3. import { IOptions } from "../../interfaces/IOptions";
  4. import { TNodeWithBlockStatement } from "../../types/TNodeWithBlockStatement";
  5. import { AppendState } from "../../enums/AppendState";
  6. import { NO_CUSTOM_NODES_PRESET } from "../../preset-options/NoCustomNodesPreset";
  7. import { AtobTemplate } from "../../templates/custom-nodes/AtobTemplate";
  8. import { SelfDefendingTemplate } from "../../templates/custom-nodes/unicode-array-nodes/unicode-array-decode-node/SelfDefendingTemplate";
  9. import { UnicodeArrayDecodeTemplate } from "../../templates/custom-nodes/unicode-array-nodes/unicode-array-decode-node/UnicodeArrayDecodeTemplate";
  10. import { AbstractCustomNode } from '../AbstractCustomNode';
  11. import { JavaScriptObfuscator } from '../../JavaScriptObfuscator';
  12. import { NodeUtils } from "../../NodeUtils";
  13. import { UnicodeArray } from "../../UnicodeArray";
  14. export class UnicodeArrayDecodeNode extends AbstractCustomNode {
  15. /**
  16. * @type {AppendState}
  17. */
  18. protected appendState: AppendState = AppendState.AfterObfuscation;
  19. /**
  20. * @type {UnicodeArray}
  21. */
  22. private unicodeArray: UnicodeArray;
  23. /**
  24. * @type {string}
  25. */
  26. private unicodeArrayName: string;
  27. /**
  28. * @param unicodeArrayName
  29. * @param unicodeArray
  30. * @param options
  31. */
  32. constructor (
  33. unicodeArrayName: string,
  34. unicodeArray: UnicodeArray,
  35. options: IOptions
  36. ) {
  37. super(options);
  38. this.unicodeArrayName = unicodeArrayName;
  39. this.unicodeArray = unicodeArray;
  40. }
  41. /**
  42. * @param blockScopeNode
  43. */
  44. public appendNode (blockScopeNode: TNodeWithBlockStatement): void {
  45. if (!this.unicodeArray.getLength()) {
  46. return;
  47. }
  48. NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), 1);
  49. }
  50. /**
  51. * @returns {ESTree.Node}
  52. */
  53. public getNode (): ESTree.Node {
  54. return super.getNode();
  55. }
  56. /**
  57. * @returns {ESTree.Node}
  58. */
  59. protected getNodeStructure (): ESTree.Node {
  60. const forLoopFunctionName: string = 'forLoopFunc';
  61. let code: string;
  62. if (this.options.selfDefending) {
  63. code = SelfDefendingTemplate().formatUnicorn({
  64. forLoopFunctionName,
  65. unicodeArrayName: this.unicodeArrayName
  66. });
  67. } else {
  68. code = `${forLoopFunctionName}();`;
  69. }
  70. return NodeUtils.convertCodeToStructure(
  71. JavaScriptObfuscator.obfuscate(
  72. UnicodeArrayDecodeTemplate().formatUnicorn({
  73. atobPolyfill: AtobTemplate(),
  74. code,
  75. forLoopFunctionName,
  76. unicodeArrayName: this.unicodeArrayName
  77. }),
  78. NO_CUSTOM_NODES_PRESET
  79. ).getObfuscatedCode()
  80. );
  81. }
  82. }