SelfDefendingNoEvalTemplate.spec.ts 7.0 KB

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