DebugProtectionFunctionCallTemplate.spec.ts 6.2 KB

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