SelfDefendingNoEvalTemplate.spec.ts 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import { assert } from 'chai';
  2. import { ObfuscationTarget } from '../../../../../src/enums/ObfuscationTarget';
  3. import { NO_ADDITIONAL_NODES_PRESET } from '../../../../../src/options/presets/NoCustomNodes';
  4. import { IdentifierNamesGenerator } from '../../../../../src/enums/generators/identifier-names-generators/IdentifierNamesGenerator';
  5. import { evaluateInWorker } from '../../../../helpers/evaluateInWorker';
  6. import { beautifyCode } from '../../../../helpers/beautifyCode';
  7. import { readFileAsString } from '../../../../helpers/readFileAsString';
  8. import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
  9. describe('SelfDefendingNoEvalTemplate', function () {
  10. const correctEvaluationTimeout: number = 100;
  11. const redosEvaluationTimeout: number = 10000;
  12. this.timeout(30000);
  13. describe('Variant #1: correctly obfuscate code with `HexadecimalIdentifierNamesGenerator``', () => {
  14. const expectedEvaluationResult: number = 1;
  15. let obfuscatedCode: string,
  16. evaluationResult: number = 0;
  17. before(() => {
  18. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  19. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  20. code,
  21. {
  22. ...NO_ADDITIONAL_NODES_PRESET,
  23. selfDefending: true,
  24. identifierNamesGenerator: IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator,
  25. target: ObfuscationTarget.BrowserNoEval
  26. }
  27. ).getObfuscatedCode();
  28. return evaluateInWorker(obfuscatedCode, correctEvaluationTimeout)
  29. .then((result: string | null) => {
  30. if (!result) {
  31. return;
  32. }
  33. evaluationResult = parseInt(result, 10);
  34. });
  35. });
  36. it('should correctly evaluate code with enabled self defending', () => {
  37. assert.equal(evaluationResult, expectedEvaluationResult);
  38. });
  39. });
  40. describe('Variant #2: correctly obfuscate code with `MangledIdentifierNamesGenerator` option', () => {
  41. const expectedEvaluationResult: number = 1;
  42. let obfuscatedCode: string,
  43. evaluationResult: number = 0;
  44. before(() => {
  45. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  46. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  47. code,
  48. {
  49. ...NO_ADDITIONAL_NODES_PRESET,
  50. selfDefending: true,
  51. identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
  52. target: ObfuscationTarget.BrowserNoEval
  53. }
  54. ).getObfuscatedCode();
  55. return evaluateInWorker(obfuscatedCode, correctEvaluationTimeout)
  56. .then((result: string | null) => {
  57. if (!result) {
  58. return;
  59. }
  60. evaluationResult = parseInt(result, 10);
  61. });
  62. });
  63. it('should correctly evaluate code with enabled self defending', () => {
  64. assert.equal(evaluationResult, expectedEvaluationResult);
  65. });
  66. });
  67. describe('Variant #3: correctly obfuscate code with `DictionaryIdentifierNamesGenerator` option', () => {
  68. const expectedEvaluationResult: number = 1;
  69. let obfuscatedCode: string,
  70. evaluationResult: number = 0;
  71. before(() => {
  72. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  73. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  74. code,
  75. {
  76. ...NO_ADDITIONAL_NODES_PRESET,
  77. selfDefending: true,
  78. identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator,
  79. identifiersDictionary: ['foo', 'bar', 'baz', 'bark', 'hawk', 'eagle'],
  80. target: ObfuscationTarget.BrowserNoEval
  81. }
  82. ).getObfuscatedCode();
  83. return evaluateInWorker(obfuscatedCode, correctEvaluationTimeout)
  84. .then((result: string | null) => {
  85. if (!result) {
  86. return;
  87. }
  88. evaluationResult = parseInt(result, 10);
  89. });
  90. });
  91. it('should correctly evaluate code with enabled self defending', () => {
  92. assert.equal(evaluationResult, expectedEvaluationResult);
  93. });
  94. });
  95. describe('Variant #4: obfuscated code with beautified self defending code', () => {
  96. describe('Variant #1: beautify with spaces', () => {
  97. const expectedEvaluationResult: number = 0;
  98. let obfuscatedCode: string,
  99. evaluationResult: number = 0;
  100. before(() => {
  101. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  102. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  103. code,
  104. {
  105. ...NO_ADDITIONAL_NODES_PRESET,
  106. selfDefending: true,
  107. target: ObfuscationTarget.BrowserNoEval
  108. }
  109. ).getObfuscatedCode();
  110. obfuscatedCode = beautifyCode(obfuscatedCode, 'space');
  111. return evaluateInWorker(obfuscatedCode, redosEvaluationTimeout)
  112. .then((result: string | null) => {
  113. if (!result) {
  114. return;
  115. }
  116. evaluationResult = parseInt(result, 10);
  117. });
  118. });
  119. it('should enter code in infinity loop', () => {
  120. assert.equal(evaluationResult, expectedEvaluationResult);
  121. });
  122. });
  123. describe('Variant #2: beautify with tabs', () => {
  124. const expectedEvaluationResult: number = 0;
  125. let obfuscatedCode: string,
  126. evaluationResult: number = 0;
  127. before(() => {
  128. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  129. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  130. code,
  131. {
  132. ...NO_ADDITIONAL_NODES_PRESET,
  133. selfDefending: true,
  134. target: ObfuscationTarget.BrowserNoEval
  135. }
  136. ).getObfuscatedCode();
  137. obfuscatedCode = beautifyCode(obfuscatedCode, 'tab');
  138. return evaluateInWorker(obfuscatedCode, redosEvaluationTimeout)
  139. .then((result: string | null) => {
  140. if (!result) {
  141. return;
  142. }
  143. evaluationResult = parseInt(result, 10);
  144. });
  145. });
  146. it('should enter code in infinity loop', () => {
  147. assert.equal(evaluationResult, expectedEvaluationResult);
  148. });
  149. });
  150. });
  151. describe('Variant #5: JavaScript obfuscator code', () => {
  152. describe('Variant #1: correct evaluation', () => {
  153. const evaluationTimeout: number = 5000;
  154. const expectedEvaluationResult: string = 'var foo=0x1;';
  155. let obfuscatedCode: string,
  156. evaluationResult: string = '';
  157. before(() => {
  158. const code: string = readFileAsString(process.cwd() + '/dist/index.js');
  159. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  160. `
  161. ${code}
  162. module.exports.obfuscate('var foo = 1;').getObfuscatedCode();
  163. `,
  164. {
  165. disableConsoleOutput: true,
  166. selfDefending: true,
  167. identifierNamesGenerator: IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator,
  168. target: ObfuscationTarget.BrowserNoEval
  169. }
  170. ).getObfuscatedCode();
  171. return evaluateInWorker(obfuscatedCode, evaluationTimeout)
  172. .then((result: string | null) => {
  173. if (!result) {
  174. return;
  175. }
  176. evaluationResult = result;
  177. });
  178. });
  179. it('should correctly evaluate code with enabled self defending', () => {
  180. assert.equal(evaluationResult, expectedEvaluationResult);
  181. });
  182. });
  183. describe('Variant #2: beautify with spaces', () => {
  184. const expectedEvaluationResult: string = '';
  185. let obfuscatedCode: string,
  186. evaluationResult: string = '';
  187. before(() => {
  188. const code: string = readFileAsString(process.cwd() + '/dist/index.js');
  189. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  190. `
  191. ${code}
  192. module.exports.obfuscate('var foo = 1;').getObfuscatedCode();
  193. `,
  194. {
  195. disableConsoleOutput: true,
  196. selfDefending: true,
  197. identifierNamesGenerator: IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator,
  198. target: ObfuscationTarget.BrowserNoEval
  199. }
  200. ).getObfuscatedCode();
  201. obfuscatedCode = beautifyCode(obfuscatedCode, 'space');
  202. return evaluateInWorker(obfuscatedCode, redosEvaluationTimeout)
  203. .then((result: string | null) => {
  204. if (!result) {
  205. return;
  206. }
  207. evaluationResult = result;
  208. });
  209. });
  210. it('should enter code in infinity loop', () => {
  211. assert.equal(evaluationResult, expectedEvaluationResult);
  212. });
  213. });
  214. });
  215. });