BlockStatementControlFlowTransformer.spec.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { assert } from 'chai';
  2. import { IObfuscationResult } from '../../../../src/interfaces/IObfuscationResult';
  3. import { NO_CUSTOM_NODES_PRESET } from '../../../../src/options/presets/NoCustomNodes';
  4. import { readFileAsString } from '../../../helpers/readFileAsString';
  5. import { JavaScriptObfuscator } from '../../../../src/JavaScriptObfuscator';
  6. describe('BlockStatementControlFlowTransformer', () => {
  7. describe('transformNode (blockStatementNode: ESTree.BlockStatement): ESTree.Node', () => {
  8. describe('variant #1: 5 simple statements', () => {
  9. const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
  10. readFileAsString(
  11. './test/fixtures/node-transformers/node-control-flow-transformers/block-statement-control-flow-transformer-1.js'
  12. ),
  13. {
  14. ...NO_CUSTOM_NODES_PRESET,
  15. controlFlowFlattening: true,
  16. controlFlowFlatteningThreshold: 1,
  17. unicodeEscapeSequence: false
  18. }
  19. );
  20. const obfuscatedCode: string = obfuscationResult.getObfuscatedCode();
  21. const statementRegExp1: RegExp = /console\['log'\]\(0x1\);/;
  22. const statementRegExp2: RegExp = /console\['log'\]\(0x2\);/;
  23. const statementRegExp3: RegExp = /console\['log'\]\(0x3\);/;
  24. const statementRegExp4: RegExp = /console\['log'\]\(0x4\);/;
  25. const statementRegExp5: RegExp = /console\['log'\]\(0x5\);/;
  26. const switchCaseRegExp: RegExp = /switch *\(_0x([a-z0-9]){4,6}\[_0x([a-z0-9]){4,6}\+\+\]\) *\{/;
  27. const switchCaseLengthRegExp: RegExp = /case *'[0-5]': *console\['log'\]\(0x[0-6]\);/g;
  28. const switchCaseLength: number = obfuscatedCode.match(switchCaseLengthRegExp)!.length;
  29. const switchCaseMapRegExp: RegExp = /var *_0x(?:[a-z0-9]){4,6} *= *'(.*?)'/;
  30. const switchCaseMapMatches: RegExpMatchArray = <RegExpMatchArray>obfuscatedCode.match(switchCaseMapRegExp);
  31. const switchCaseMapMatch: string = switchCaseMapMatches[1];
  32. const switchCaseMap: string[] = switchCaseMapMatch.replace(/\\x7c/g, '|').split('|').sort();
  33. it('should save all statements', () => {
  34. assert.match(obfuscatedCode, statementRegExp1);
  35. assert.match(obfuscatedCode, statementRegExp2);
  36. assert.match(obfuscatedCode, statementRegExp3);
  37. assert.match(obfuscatedCode, statementRegExp4);
  38. assert.match(obfuscatedCode, statementRegExp5);
  39. });
  40. it('should wrap block statement statements in switch case structure', () => {
  41. assert.match(obfuscatedCode, switchCaseRegExp);
  42. assert.equal(switchCaseLength, 5);
  43. });
  44. it('should create variable with order of switch cases sequence', () => {
  45. assert.deepEqual(switchCaseMap, ['0', '1', '2', '3', '4']);
  46. });
  47. });
  48. });
  49. });