DebugProtectionFunctionCallTemplate.spec.ts 7.5 KB

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