DebugProtectionFunctionCallTemplate.spec.ts 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  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((done) => {
  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. evaluateInWorker(
  26. obfuscatedCode,
  27. (response: number) => {
  28. evaluationResult = response;
  29. done();
  30. },
  31. () => {
  32. done();
  33. },
  34. () => {
  35. done();
  36. },
  37. evaluationTimeout
  38. );
  39. });
  40. it('should correctly evaluate code with enabled debug protection', () => {
  41. assert.equal(evaluationResult, expectedEvaluationResult);
  42. });
  43. });
  44. describe('Variant #2: correctly obfuscate code with `MangledIdentifierNamesGenerator` option', () => {
  45. const expectedEvaluationResult: number = 1;
  46. let obfuscatedCode: string,
  47. evaluationResult: number = 0;
  48. beforeEach((done) => {
  49. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  50. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  51. code,
  52. {
  53. ...NO_ADDITIONAL_NODES_PRESET,
  54. debugProtection: true,
  55. identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator
  56. }
  57. ).getObfuscatedCode();
  58. evaluateInWorker(
  59. obfuscatedCode,
  60. (response: number) => {
  61. evaluationResult = response;
  62. done();
  63. },
  64. () => {
  65. done();
  66. },
  67. () => {
  68. done();
  69. },
  70. evaluationTimeout
  71. );
  72. });
  73. it('should correctly evaluate code with enabled debug protection', () => {
  74. assert.equal(evaluationResult, expectedEvaluationResult);
  75. });
  76. });
  77. describe('Variant #3: correctly obfuscate code with `DictionaryIdentifierNamesGenerator` option', () => {
  78. const expectedEvaluationResult: number = 1;
  79. let obfuscatedCode: string,
  80. evaluationResult: number = 0;
  81. beforeEach((done) => {
  82. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  83. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  84. code,
  85. {
  86. ...NO_ADDITIONAL_NODES_PRESET,
  87. debugProtection: true,
  88. identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator,
  89. identifiersDictionary: ['foo', 'bar', 'baz', 'bark', 'hawk', 'eagle']
  90. }
  91. ).getObfuscatedCode();
  92. evaluateInWorker(
  93. obfuscatedCode,
  94. (response: number) => {
  95. evaluationResult = response;
  96. done();
  97. },
  98. () => {
  99. done();
  100. },
  101. () => {
  102. done();
  103. },
  104. evaluationTimeout
  105. );
  106. });
  107. it('should correctly evaluate code with enabled debug protection', () => {
  108. assert.equal(evaluationResult, expectedEvaluationResult);
  109. });
  110. });
  111. describe('Variant #4: correctly obfuscated code with target `BrowserNoEval`', () => {
  112. const expectedEvaluationResult: number = 1;
  113. let obfuscatedCode: string,
  114. evaluationResult: number = 0;
  115. beforeEach((done) => {
  116. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  117. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  118. code,
  119. {
  120. ...NO_ADDITIONAL_NODES_PRESET,
  121. debugProtection: true,
  122. target: ObfuscationTarget.BrowserNoEval
  123. }
  124. ).getObfuscatedCode();
  125. evaluateInWorker(
  126. obfuscatedCode,
  127. (response: number) => {
  128. evaluationResult = response;
  129. done();
  130. },
  131. () => {
  132. done();
  133. },
  134. () => {
  135. done();
  136. },
  137. evaluationTimeout
  138. );
  139. });
  140. it('should correctly evaluate code with enabled debug protection', () => {
  141. assert.equal(evaluationResult, expectedEvaluationResult);
  142. });
  143. });
  144. describe('Variant #5: obfuscated code with removed debug protection code', () => {
  145. const expectedEvaluationResult: number = 0;
  146. let obfuscatedCode: string,
  147. evaluationResult: number = 0;
  148. beforeEach((done) => {
  149. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  150. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  151. code,
  152. {
  153. ...NO_ADDITIONAL_NODES_PRESET,
  154. debugProtection: true
  155. }
  156. ).getObfuscatedCode();
  157. obfuscatedCode = obfuscatedCode.replace(/\+\+ *_0x([a-f0-9]){4,6}/, '');
  158. evaluateInWorker(
  159. obfuscatedCode,
  160. (response: number) => {
  161. evaluationResult = response;
  162. done();
  163. },
  164. () => {
  165. done();
  166. },
  167. () => {
  168. done();
  169. },
  170. evaluationTimeout
  171. );
  172. });
  173. it('should enter code in infinity loop', () => {
  174. assert.equal(evaluationResult, expectedEvaluationResult);
  175. });
  176. });
  177. describe('Variant #6: single call of debug protection code', () => {
  178. const expectedEvaluationResult: number = 1;
  179. let obfuscatedCode: string,
  180. evaluationResult: number = 0;
  181. beforeEach((done) => {
  182. const code: string = readFileAsString(__dirname + '/fixtures/single-call.js');
  183. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  184. code,
  185. {
  186. ...NO_ADDITIONAL_NODES_PRESET,
  187. debugProtection: true
  188. }
  189. ).getObfuscatedCode();
  190. evaluateInWorker(
  191. obfuscatedCode,
  192. (response: number) => {
  193. evaluationResult = response;
  194. done();
  195. },
  196. () => {
  197. done();
  198. },
  199. () => {
  200. done();
  201. },
  202. evaluationTimeout
  203. );
  204. });
  205. it('should correctly evaluate code with enabled debug protection', () => {
  206. assert.equal(evaluationResult, expectedEvaluationResult);
  207. });
  208. });
  209. });