SelfDefendingTemplate.spec.ts 5.4 KB

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