DebugProtectionFunctionCallTemplate.spec.ts 6.7 KB

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