MethodDefinitionObfuscator.ts 2.4 KB

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