SelfDefendingTemplate.spec.ts 6.7 KB

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