MethodDefinitionObfuscator.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import * as estraverse from 'estraverse';
  2. import * as ESTree from 'estree';
  3. import { AbstractNodeObfuscator } from './AbstractNodeObfuscator';
  4. import { Node } from '../node/Node';
  5. import { Utils } from '../Utils';
  6. import { StringLiteralReplacer } from './replacers/StringLiteralReplacer';
  7. /**
  8. * replaces:
  9. * foo () { //... };
  10. *
  11. * on:
  12. * [_0x9a4e('0x0')] { //... };
  13. */
  14. export class MethodDefinitionObfuscator extends AbstractNodeObfuscator {
  15. /**
  16. * @type {string[]}
  17. */
  18. private static ignoredNames: string[] = ['constructor'];
  19. /**
  20. * @param methodDefinitionNode
  21. * @param parentNode
  22. */
  23. public obfuscateNode (methodDefinitionNode: ESTree.MethodDefinition, parentNode: ESTree.Node): void {
  24. this.replaceMethodName(methodDefinitionNode);
  25. }
  26. /**
  27. * @param methodDefinitionNode
  28. */
  29. private replaceMethodName (methodDefinitionNode: ESTree.MethodDefinition): void {
  30. estraverse.replace(methodDefinitionNode.key, {
  31. enter: (node: ESTree.Node): any => {
  32. if (
  33. Node.isIdentifierNode(node) &&
  34. !Utils.arrayContains(MethodDefinitionObfuscator.ignoredNames, node.name) &&
  35. methodDefinitionNode.computed === false
  36. ) {
  37. methodDefinitionNode.computed = true;
  38. node.name = new StringLiteralReplacer(this.nodes, this.options)
  39. .replace(node.name);
  40. return;
  41. }
  42. return estraverse.VisitorOption.Skip;
  43. }
  44. });
  45. }
  46. }