FunctionDeclarationObfuscator.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import * as estraverse from 'estraverse';
  2. import { IFunctionDeclarationNode } from "../interfaces/nodes/IFunctionDeclarationNode";
  3. import { INode } from "../interfaces/nodes/INode";
  4. import { NodeType } from "../enums/NodeType";
  5. import { NodeObfuscator } from './NodeObfuscator';
  6. import { Nodes } from "../Nodes";
  7. import { NodeUtils } from "../NodeUtils";
  8. /**
  9. * replaces:
  10. * function foo () { //... };
  11. * foo();
  12. *
  13. * on:
  14. * function _0x12d45f () { //... };
  15. * _0x12d45f();
  16. */
  17. export class FunctionDeclarationObfuscator extends NodeObfuscator {
  18. /**
  19. * @type {Map<string, string>}
  20. */
  21. private functionName: Map <string, string> = new Map <string, string> ();
  22. /**
  23. * @param functionDeclarationNode
  24. * @param parentNode
  25. */
  26. public obfuscateNode (functionDeclarationNode: IFunctionDeclarationNode, parentNode: INode): void {
  27. if (parentNode.type === NodeType.Program) {
  28. return;
  29. }
  30. this.storeFunctionName(functionDeclarationNode);
  31. this.replaceFunctionName(functionDeclarationNode);
  32. }
  33. /**
  34. * @param functionDeclarationNode
  35. */
  36. private storeFunctionName (functionDeclarationNode: IFunctionDeclarationNode): void {
  37. estraverse.traverse(functionDeclarationNode.id, {
  38. leave: (node: INode): any => this.storeIdentifiersNames(node, this.functionName)
  39. });
  40. }
  41. /**
  42. * @param functionDeclarationNode
  43. */
  44. private replaceFunctionName (functionDeclarationNode: IFunctionDeclarationNode): void {
  45. let scopeNode: INode = NodeUtils.getBlockScopeOfNode(
  46. functionDeclarationNode
  47. );
  48. estraverse.replace(scopeNode, {
  49. enter: (node: INode, parentNode: INode): any => {
  50. if (Nodes.isIdentifierNode(node)) {
  51. node.name = this.replaceIdentifiersWithRandomNames(node, parentNode, this.functionName);
  52. }
  53. }
  54. });
  55. }
  56. }