SelfDefendingTemplate.spec.ts 9.4 KB

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