SelfDefendingNoEvalTemplate.spec.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import { assert } from 'chai';
  2. import { ObfuscationTarget } from '../../../../../src/enums/ObfuscationTarget';
  3. import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
  4. import { IdentifierNamesGenerator } from '../../../../../src/enums/generators/identifier-names-generators/IdentifierNamesGenerator';
  5. import { evaluateInWorker } from '../../../../helpers/evaluateInWorker';
  6. import { readFileAsString } from '../../../../helpers/readFileAsString';
  7. import { beautifyCode } from '../../../../helpers/beautifyCode';
  8. import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
  9. describe('SelfDefendingNoEvalTemplate', function () {
  10. const correctEvaluationTimeout: number = 100;
  11. const redosEvaluationTimeout: number = 3500;
  12. this.timeout(10000);
  13. describe('Variant #1: correctly obfuscate code with `HexadecimalIdentifierNamesGenerator``', () => {
  14. const expectedEvaluationResult: number = 1;
  15. let obfuscatedCode: string,
  16. evaluationResult: number = 0;
  17. before(() => {
  18. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  19. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  20. code,
  21. {
  22. ...NO_ADDITIONAL_NODES_PRESET,
  23. selfDefending: true,
  24. identifierNamesGenerator: IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator,
  25. target: ObfuscationTarget.BrowserNoEval
  26. }
  27. ).getObfuscatedCode();
  28. return evaluateInWorker(obfuscatedCode, correctEvaluationTimeout)
  29. .then((result: string | null) => {
  30. if (!result) {
  31. return;
  32. }
  33. evaluationResult = parseInt(result, 10);
  34. });
  35. });
  36. it('should correctly evaluate code with enabled self defending', () => {
  37. assert.equal(evaluationResult, expectedEvaluationResult);
  38. });
  39. });
  40. describe('Variant #2: correctly obfuscate code with `MangledIdentifierNamesGenerator` option', () => {
  41. const expectedEvaluationResult: number = 1;
  42. let obfuscatedCode: string,
  43. evaluationResult: number = 0;
  44. before(() => {
  45. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  46. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  47. code,
  48. {
  49. ...NO_ADDITIONAL_NODES_PRESET,
  50. selfDefending: true,
  51. identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
  52. target: ObfuscationTarget.BrowserNoEval
  53. }
  54. ).getObfuscatedCode();
  55. return evaluateInWorker(obfuscatedCode, correctEvaluationTimeout)
  56. .then((result: string | null) => {
  57. if (!result) {
  58. return;
  59. }
  60. evaluationResult = parseInt(result, 10);
  61. });
  62. });
  63. it('should correctly evaluate code with enabled self defending', () => {
  64. assert.equal(evaluationResult, expectedEvaluationResult);
  65. });
  66. });
  67. describe('Variant #3: correctly obfuscate code with `DictionaryIdentifierNamesGenerator` option', () => {
  68. const expectedEvaluationResult: number = 1;
  69. let obfuscatedCode: string,
  70. evaluationResult: number = 0;
  71. before(() => {
  72. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  73. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  74. code,
  75. {
  76. ...NO_ADDITIONAL_NODES_PRESET,
  77. selfDefending: true,
  78. identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator,
  79. identifiersDictionary: ['foo', 'bar', 'baz', 'bark', 'hawk', 'eagle'],
  80. target: ObfuscationTarget.BrowserNoEval
  81. }
  82. ).getObfuscatedCode();
  83. return evaluateInWorker(obfuscatedCode, correctEvaluationTimeout)
  84. .then((result: string | null) => {
  85. if (!result) {
  86. return;
  87. }
  88. evaluationResult = parseInt(result, 10);
  89. });
  90. });
  91. it('should correctly evaluate code with enabled self defending', () => {
  92. assert.equal(evaluationResult, expectedEvaluationResult);
  93. });
  94. });
  95. describe('Variant #4: obfuscated code with beautified self defending code', () => {
  96. describe('Variant #1: beautify with spaces', () => {
  97. const expectedEvaluationResult: number = 0;
  98. let obfuscatedCode: string,
  99. evaluationResult: number = 0;
  100. before(() => {
  101. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  102. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  103. code,
  104. {
  105. ...NO_ADDITIONAL_NODES_PRESET,
  106. selfDefending: true,
  107. target: ObfuscationTarget.BrowserNoEval
  108. }
  109. ).getObfuscatedCode();
  110. obfuscatedCode = beautifyCode(obfuscatedCode, 'space');
  111. return evaluateInWorker(obfuscatedCode, redosEvaluationTimeout)
  112. .then((result: string | null) => {
  113. if (!result) {
  114. return;
  115. }
  116. evaluationResult = parseInt(result, 10);
  117. });
  118. });
  119. it('should enter code in infinity loop', () => {
  120. assert.equal(evaluationResult, expectedEvaluationResult);
  121. });
  122. });
  123. describe('Variant #2: beautify with tabs', () => {
  124. const expectedEvaluationResult: number = 0;
  125. let obfuscatedCode: string,
  126. evaluationResult: number = 0;
  127. before(() => {
  128. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  129. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  130. code,
  131. {
  132. ...NO_ADDITIONAL_NODES_PRESET,
  133. selfDefending: true,
  134. target: ObfuscationTarget.BrowserNoEval
  135. }
  136. ).getObfuscatedCode();
  137. obfuscatedCode = beautifyCode(obfuscatedCode, 'tab');
  138. return evaluateInWorker(obfuscatedCode, redosEvaluationTimeout)
  139. .then((result: string | null) => {
  140. if (!result) {
  141. return;
  142. }
  143. evaluationResult = parseInt(result, 10);
  144. });
  145. });
  146. it('should enter code in infinity loop', () => {
  147. assert.equal(evaluationResult, expectedEvaluationResult);
  148. });
  149. });
  150. });
  151. });