FunctionObfuscator.spec.ts 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import * as ESTree from 'estree';
  2. import { IOptions } from '../../../../src/interfaces/IOptions';
  3. import { DEFAULT_PRESET } from '../../../../src/preset-options/DefaultPreset';
  4. import { CustomNodesStorage } from '../../../../src/storages/custom-nodes/CustomNodesStorage';
  5. import { FunctionObfuscator } from '../../../../src/node-transformers/node-obfuscators/FunctionObfuscator';
  6. import { NodeMocks } from '../../../mocks/NodeMocks';
  7. import { Options } from '../../../../src/options/Options';
  8. const assert: Chai.AssertStatic = require('chai').assert;
  9. describe('FunctionObfuscator', () => {
  10. describe('changeControlFlow (functionNode: IFunctionNode): void', () => {
  11. let blockStatementNode: ESTree.BlockStatement,
  12. expressionStatementNode1: ESTree.ExpressionStatement,
  13. expressionStatementNode2: ESTree.ExpressionStatement,
  14. functionObfuscator: FunctionObfuscator,
  15. functionDeclarationNode: ESTree.FunctionDeclaration,
  16. functionName: string = 'functionDeclaration',
  17. identifierName: string = 'identifierName',
  18. identifierNode1: ESTree.Identifier,
  19. identifierNode2: ESTree.Identifier,
  20. identifierNode3: ESTree.Identifier,
  21. paramName: string = 'param1',
  22. programNode: ESTree.Program;
  23. before(() => {
  24. identifierNode1 = NodeMocks.getIdentifierNode(paramName);
  25. identifierNode2 = NodeMocks.getIdentifierNode(paramName);
  26. identifierNode3 = NodeMocks.getIdentifierNode(identifierName);
  27. expressionStatementNode1 = NodeMocks.getExpressionStatementNode(
  28. NodeMocks.getCallExpressionNode(identifierNode2)
  29. );
  30. expressionStatementNode2 = NodeMocks.getExpressionStatementNode(
  31. NodeMocks.getCallExpressionNode(identifierNode3)
  32. );
  33. blockStatementNode = NodeMocks.getBlockStatementNode([
  34. expressionStatementNode1
  35. ]);
  36. functionDeclarationNode = NodeMocks.getFunctionDeclarationNode(
  37. functionName,
  38. blockStatementNode,
  39. [
  40. identifierNode1
  41. ]
  42. );
  43. programNode = NodeMocks.getProgramNode([
  44. functionDeclarationNode
  45. ]);
  46. programNode['parentNode'] = programNode;
  47. functionDeclarationNode['parentNode'] = programNode;
  48. blockStatementNode['parentNode'] = functionDeclarationNode;
  49. identifierNode1['parentNode'] = functionDeclarationNode;
  50. expressionStatementNode1['parentNode'] = blockStatementNode;
  51. const options: IOptions = new Options(DEFAULT_PRESET);
  52. functionObfuscator = new FunctionObfuscator(
  53. new CustomNodesStorage(options),
  54. options
  55. );
  56. functionObfuscator.transformNode(functionDeclarationNode);
  57. });
  58. it('should obfuscate function parameter', () => {
  59. assert.match(identifierNode1.name, /^_0x\w+$/);
  60. });
  61. it('should obfuscate function parameter in function body', () => {
  62. assert.match(identifierNode2.name, /^_0x\w+$/);
  63. assert.equal(identifierNode2.name, identifierNode1.name);
  64. });
  65. it('shouldn\'t obfuscate other identifiers in function body', () => {
  66. assert.equal(identifierNode3.name, identifierName);
  67. });
  68. });
  69. });