MethodDefinitionObfuscator.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. import * as estraverse from 'estraverse';
  2. import { IMethodDefinitionNode } from "../interfaces/nodes/IMethodDefinitionNode";
  3. import { ITreeNode } from "../interfaces/nodes/ITreeNode";
  4. import { NodeObfuscator } from './NodeObfuscator';
  5. import { NodeUtils } from "../NodeUtils";
  6. /**
  7. * replaces:
  8. * function foo () { //... };
  9. * foo();
  10. *
  11. * on:
  12. * function _0x12d45f () { //... };
  13. * _0x12d45f();
  14. */
  15. export class MethodDefinitionObfuscator extends NodeObfuscator {
  16. /**
  17. * @type {string[]}
  18. */
  19. private ignoredNames: string[] = ['constructor'];
  20. /**
  21. * @param methodDefinitionNode
  22. * @param parentNode
  23. */
  24. public obfuscateNode (methodDefinitionNode: IMethodDefinitionNode, parentNode: ITreeNode): void {
  25. this.replaceMethodName(methodDefinitionNode);
  26. }
  27. /**
  28. * @param methodDefinitionNode
  29. */
  30. private replaceMethodName (methodDefinitionNode: IMethodDefinitionNode): void {
  31. estraverse.replace(methodDefinitionNode.key, {
  32. leave: (node: ITreeNode) => {
  33. if (
  34. NodeUtils.isIdentifierNode(node) &&
  35. this.ignoredNames.indexOf(node.name) < 0 &&
  36. methodDefinitionNode.computed === false
  37. ) {
  38. methodDefinitionNode.computed = true;
  39. node.name = this.replaceLiteralStringByArrayElement(node.name);
  40. }
  41. return estraverse.VisitorOption.Skip;
  42. }
  43. });
  44. }
  45. }