SelfDefendingNoEvalTemplate.spec.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 { readFileAsString } from '../../../../helpers/readFileAsString';
  7. import { beautifyCode } from '../../../../helpers/beautifyCode';
  8. import { JavaScriptObfuscator } from '../../../../../src/JavaScriptObfuscatorFacade';
  9. describe('SelfDefendingNoEvalTemplate', function () {
  10. const evaluationTimeout: number = 3500;
  11. this.timeout(10000);
  12. describe('Variant #1: correctly obfuscate code with `HexadecimalIdentifierNamesGenerator``', () => {
  13. const expectedEvaluationResult: number = 1;
  14. let obfuscatedCode: string,
  15. evaluationResult: number = 0;
  16. before(() => {
  17. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  18. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  19. code,
  20. {
  21. ...NO_ADDITIONAL_NODES_PRESET,
  22. selfDefending: true,
  23. identifierNamesGenerator: IdentifierNamesGenerator.HexadecimalIdentifierNamesGenerator,
  24. target: ObfuscationTarget.BrowserNoEval
  25. }
  26. ).getObfuscatedCode();
  27. return evaluateInWorker(obfuscatedCode, evaluationTimeout)
  28. .then((result: string | null) => {
  29. if (!result) {
  30. return;
  31. }
  32. evaluationResult = parseInt(result, 10);
  33. });
  34. });
  35. it('should correctly evaluate code with enabled self defending', () => {
  36. assert.equal(evaluationResult, expectedEvaluationResult);
  37. });
  38. });
  39. describe('Variant #2: correctly obfuscate code with `MangledIdentifierNamesGenerator` option', () => {
  40. const expectedEvaluationResult: number = 1;
  41. let obfuscatedCode: string,
  42. evaluationResult: number = 0;
  43. before(() => {
  44. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  45. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  46. code,
  47. {
  48. ...NO_ADDITIONAL_NODES_PRESET,
  49. selfDefending: true,
  50. identifierNamesGenerator: IdentifierNamesGenerator.MangledIdentifierNamesGenerator,
  51. target: ObfuscationTarget.BrowserNoEval
  52. }
  53. ).getObfuscatedCode();
  54. return evaluateInWorker(obfuscatedCode, evaluationTimeout)
  55. .then((result: string | null) => {
  56. if (!result) {
  57. return;
  58. }
  59. evaluationResult = parseInt(result, 10);
  60. });
  61. });
  62. it('should correctly evaluate code with enabled self defending', () => {
  63. assert.equal(evaluationResult, expectedEvaluationResult);
  64. });
  65. });
  66. describe('Variant #3: correctly obfuscate code with `DictionaryIdentifierNamesGenerator` option', () => {
  67. const expectedEvaluationResult: number = 1;
  68. let obfuscatedCode: string,
  69. evaluationResult: number = 0;
  70. before(() => {
  71. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  72. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  73. code,
  74. {
  75. ...NO_ADDITIONAL_NODES_PRESET,
  76. selfDefending: true,
  77. identifierNamesGenerator: IdentifierNamesGenerator.DictionaryIdentifierNamesGenerator,
  78. identifiersDictionary: ['foo', 'bar', 'baz', 'bark', 'hawk', 'eagle'],
  79. target: ObfuscationTarget.BrowserNoEval
  80. }
  81. ).getObfuscatedCode();
  82. return evaluateInWorker(obfuscatedCode, evaluationTimeout)
  83. .then((result: string | null) => {
  84. if (!result) {
  85. return;
  86. }
  87. evaluationResult = parseInt(result, 10);
  88. });
  89. });
  90. it('should correctly evaluate code with enabled self defending', () => {
  91. assert.equal(evaluationResult, expectedEvaluationResult);
  92. });
  93. });
  94. describe('Variant #4: obfuscated code with beautified self defending code', () => {
  95. const expectedEvaluationResult: number = 0;
  96. let obfuscatedCode: string,
  97. evaluationResult: number = 0;
  98. before(() => {
  99. const code: string = readFileAsString(__dirname + '/fixtures/input.js');
  100. obfuscatedCode = JavaScriptObfuscator.obfuscate(
  101. code,
  102. {
  103. ...NO_ADDITIONAL_NODES_PRESET,
  104. selfDefending: true,
  105. target: ObfuscationTarget.BrowserNoEval
  106. }
  107. ).getObfuscatedCode();
  108. obfuscatedCode = beautifyCode(obfuscatedCode);
  109. return evaluateInWorker(obfuscatedCode, evaluationTimeout)
  110. .then((result: string | null) => {
  111. if (!result) {
  112. return;
  113. }
  114. evaluationResult = parseInt(result, 10);
  115. });
  116. });
  117. it('should enter code in infinity loop', () => {
  118. assert.equal(evaluationResult, expectedEvaluationResult);
  119. });
  120. });
  121. });