JavaScriptObfuscator.spec.ts 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import { assert } from 'chai';
  2. import { Chance } from 'chance';
  3. import { IObfuscationResult } from '../../src/interfaces/IObfuscationResult';
  4. import { JavaScriptObfuscator } from '../../src/JavaScriptObfuscator';
  5. import { NO_CUSTOM_NODES_PRESET } from '../../src/options/presets/NoCustomNodes';
  6. import { readFileAsString } from '../helpers/readFileAsString';
  7. import { RandomGeneratorUtils } from '../../src/utils/RandomGeneratorUtils';
  8. describe('JavaScriptObfuscator', () => {
  9. describe('obfuscate (sourceCode: string, customOptions?: IObfuscatorOptions): IObfuscationResult', () => {
  10. beforeEach(() => {
  11. RandomGeneratorUtils.setRandomGenerator(new Chance());
  12. });
  13. describe('if `sourceMap` option is `false`', () => {
  14. it('should returns object with obfuscated code and empty source map', () => {
  15. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  16. `var test = 1;`,
  17. {
  18. ...NO_CUSTOM_NODES_PRESET
  19. }
  20. );
  21. assert.isOk(obfuscationResult.getObfuscatedCode());
  22. assert.isNotOk(obfuscationResult.getSourceMap());
  23. });
  24. });
  25. describe('if `sourceMap` option is `true`', () => {
  26. it('should returns object with obfuscated code and source map', () => {
  27. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  28. `var test = 1;`,
  29. {
  30. ...NO_CUSTOM_NODES_PRESET,
  31. sourceMap: true
  32. }
  33. );
  34. assert.isOk(obfuscationResult.getObfuscatedCode());
  35. assert.isOk(JSON.parse(obfuscationResult.getSourceMap()).mappings);
  36. });
  37. it('should returns object with obfuscated code with inline source map as Base64 string', () => {
  38. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  39. `var test = 1;`,
  40. {
  41. ...NO_CUSTOM_NODES_PRESET,
  42. sourceMap: true,
  43. sourceMapMode: 'inline'
  44. }
  45. );
  46. assert.isOk(obfuscationResult.getObfuscatedCode());
  47. assert.match(
  48. obfuscationResult.getObfuscatedCode(),
  49. /sourceMappingURL=data:application\/json;base64/
  50. );
  51. assert.isOk(obfuscationResult.getSourceMap());
  52. });
  53. it('should returns object with empty obfuscated code and source map with empty data if source code is empty', () => {
  54. let obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  55. '',
  56. {
  57. sourceMap: true
  58. }
  59. );
  60. assert.isNotOk(obfuscationResult.getObfuscatedCode());
  61. assert.deepEqual(JSON.parse(obfuscationResult.getSourceMap()).names, []);
  62. assert.deepEqual(JSON.parse(obfuscationResult.getSourceMap()).sources, []);
  63. assert.isNotOk(JSON.parse(obfuscationResult.getSourceMap()).mappings);
  64. });
  65. });
  66. it('should returns an empty string if source code is empty', () => {
  67. assert.isNotOk(
  68. JavaScriptObfuscator.obfuscate(
  69. ''
  70. ).getObfuscatedCode()
  71. );
  72. });
  73. it('should returns an empty string if source code contains only comments', () => {
  74. assert.isNotOk(
  75. JavaScriptObfuscator.obfuscate(
  76. '// comment'
  77. ).getObfuscatedCode()
  78. );
  79. });
  80. it('should obfuscate simple code with variable inside global scope', () => {
  81. assert.match(
  82. JavaScriptObfuscator.obfuscate(
  83. `var test = 1;`,
  84. {
  85. ...NO_CUSTOM_NODES_PRESET
  86. }
  87. ).getObfuscatedCode(),
  88. /^var *test *= *0x\d+;$/
  89. );
  90. });
  91. it('should obfuscate simple code with variable inside block-scope', () => {
  92. assert.match(
  93. JavaScriptObfuscator.obfuscate(
  94. `(function () {var test = 1;})()`,
  95. {
  96. ...NO_CUSTOM_NODES_PRESET
  97. }
  98. ).getObfuscatedCode(),
  99. /^\(function *\(\) *\{ *var *_0x[\w]+ *= *0x\d+; *\}(\(\)\)|\)\(\));?$/
  100. );
  101. });
  102. it('should obfuscate simple code with literal variable value', () => {
  103. let pattern1: RegExp = /^var _0x(\w){4} *= *\['(\\[x|u]\d+)+'\];/,
  104. pattern2: RegExp = /var *test *= *_0x(\w){4}\('0x0'\);$/,
  105. obfuscatedCode1: string = JavaScriptObfuscator.obfuscate(
  106. `var test = 'abc';`,
  107. {
  108. ...NO_CUSTOM_NODES_PRESET,
  109. stringArray: true,
  110. stringArrayThreshold: 1
  111. }
  112. ).getObfuscatedCode(),
  113. obfuscatedCode2: string = JavaScriptObfuscator.obfuscate(
  114. `var test = 'абц';`,
  115. {
  116. ...NO_CUSTOM_NODES_PRESET,
  117. stringArray: true,
  118. stringArrayThreshold: 1
  119. }
  120. ).getObfuscatedCode();
  121. assert.match(obfuscatedCode1, pattern1);
  122. assert.match(obfuscatedCode1, pattern2);
  123. assert.match(obfuscatedCode2, pattern1);
  124. assert.match(obfuscatedCode2, pattern2);
  125. });
  126. it('should returns same code every time with same `seed`', () => {
  127. const code: string = readFileAsString('./test/fixtures/sample.js');
  128. const seed: number = 12345;
  129. const obfuscationResult1: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  130. code, { seed: seed }
  131. );
  132. const obfuscationResult2: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  133. code, { seed: seed }
  134. );
  135. assert.equal(obfuscationResult1.getObfuscatedCode(), obfuscationResult2.getObfuscatedCode());
  136. });
  137. it('should returns different code with different `seed` option value', () => {
  138. const code: string = readFileAsString('./test/fixtures/sample.js');
  139. const obfuscationResult1: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  140. code, { seed: 12345 }
  141. );
  142. const obfuscationResult2: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  143. code, { seed: 12346 }
  144. );
  145. const obfuscationResult3: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  146. code, { seed: 0 }
  147. );
  148. const obfuscationResult4: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  149. code, { seed: 0 }
  150. );
  151. assert.notEqual(obfuscationResult1.getObfuscatedCode(), obfuscationResult2.getObfuscatedCode());
  152. assert.notEqual(obfuscationResult3.getObfuscatedCode(), obfuscationResult4.getObfuscatedCode());
  153. });
  154. afterEach(() => {
  155. RandomGeneratorUtils.setRandomGenerator(new Chance());
  156. });
  157. });
  158. });