MethodDefinitionObfuscator.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as estraverse from 'estraverse';
  4. import * as ESTree from 'estree';
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { IObfuscatorReplacer } from '../../interfaces/node-transformers/IObfuscatorReplacer';
  7. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
  8. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  9. import { Node } from '../../node/Node';
  10. /**
  11. * replaces:
  12. * foo () { //... };
  13. *
  14. * on:
  15. * [_0x9a4e('0x0')] { //... };
  16. */
  17. @injectable()
  18. export class MethodDefinitionObfuscator extends AbstractNodeTransformer {
  19. /**
  20. * @type {IObfuscatorReplacer}
  21. */
  22. private readonly stringLiteralReplacer: IObfuscatorReplacer;
  23. /**
  24. * @type {string[]}
  25. */
  26. private static readonly ignoredNames: string[] = ['constructor'];
  27. /**
  28. * @param replacersFactory
  29. * @param options
  30. */
  31. constructor(
  32. @inject(ServiceIdentifiers['Factory<IObfuscatorReplacer>']) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IObfuscatorReplacer,
  33. @inject(ServiceIdentifiers.IOptions) options: IOptions
  34. ) {
  35. super(options);
  36. this.stringLiteralReplacer = replacersFactory(NodeObfuscatorsReplacers.StringLiteralReplacer);
  37. }
  38. /**
  39. * @param methodDefinitionNode
  40. * @param parentNode
  41. */
  42. public transformNode (methodDefinitionNode: ESTree.MethodDefinition, parentNode: ESTree.Node): void {
  43. this.replaceMethodName(methodDefinitionNode);
  44. }
  45. /**
  46. * @param methodDefinitionNode
  47. */
  48. private replaceMethodName (methodDefinitionNode: ESTree.MethodDefinition): void {
  49. estraverse.replace(methodDefinitionNode.key, {
  50. enter: (node: ESTree.Node): any => {
  51. if (
  52. Node.isIdentifierNode(node) &&
  53. !MethodDefinitionObfuscator.ignoredNames.includes(node.name) &&
  54. methodDefinitionNode.computed === false
  55. ) {
  56. methodDefinitionNode.computed = true;
  57. node.name = this.stringLiteralReplacer.replace(node.name);
  58. return;
  59. }
  60. return estraverse.VisitorOption.Skip;
  61. }
  62. });
  63. }
  64. }