MemberExpressionObfuscator.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as escodegen from 'escodegen';
  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 { NodeType } from '../../enums/NodeType';
  9. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  10. import { Node } from '../../node/Node';
  11. @injectable()
  12. export class MemberExpressionObfuscator extends AbstractNodeTransformer {
  13. /**
  14. * @type {IObfuscatorReplacer}
  15. */
  16. private readonly stringLiteralReplacer: IObfuscatorReplacer;
  17. /**
  18. * @param replacersFactory
  19. * @param options
  20. */
  21. constructor(
  22. @inject(ServiceIdentifiers.Factory__IObfuscatorReplacer) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IObfuscatorReplacer,
  23. @inject(ServiceIdentifiers.IOptions) options: IOptions
  24. ) {
  25. super(options);
  26. this.stringLiteralReplacer = replacersFactory(NodeObfuscatorsReplacers.StringLiteralReplacer);
  27. }
  28. /**
  29. * @param memberExpressionNode
  30. * @returns {ESTree.Node}
  31. */
  32. public transformNode (memberExpressionNode: ESTree.MemberExpression): ESTree.Node {
  33. if (Node.isLiteralNode(memberExpressionNode.property)) {
  34. memberExpressionNode.property = this.obfuscateLiteralProperty(memberExpressionNode.property);
  35. }
  36. if (Node.isIdentifierNode(memberExpressionNode.property)) {
  37. if (memberExpressionNode.computed) {
  38. return memberExpressionNode;
  39. }
  40. memberExpressionNode.computed = true;
  41. memberExpressionNode.property = this.obfuscateIdentifierProperty(memberExpressionNode.property);
  42. }
  43. return memberExpressionNode;
  44. }
  45. /**
  46. * replaces:
  47. * object.identifier = 1;
  48. *
  49. * on:
  50. * object[_0x23d45[25]] = 1;
  51. *
  52. * and skip:
  53. * object[identifier] = 1;
  54. *
  55. * @param node
  56. * @returns {ESTree.Literal}
  57. */
  58. private obfuscateIdentifierProperty (node: ESTree.Identifier): ESTree.Literal {
  59. return {
  60. type: NodeType.Literal,
  61. value: node.name,
  62. raw: `'${node.name}'`,
  63. 'x-verbatim-property': {
  64. content: this.stringLiteralReplacer.replace(node.name),
  65. precedence: escodegen.Precedence.Primary
  66. }
  67. };
  68. }
  69. /**
  70. * replaces:
  71. * object['literal'] = 1;
  72. *
  73. * on:
  74. * object[_0x23d45[25]] = 1;
  75. *
  76. * @param node
  77. * @returns {ESTree.Literal}
  78. */
  79. private obfuscateLiteralProperty (node: ESTree.Literal): ESTree.Literal {
  80. if (typeof node.value === 'string' && !node['x-verbatim-property']) {
  81. node['x-verbatim-property'] = {
  82. content: this.stringLiteralReplacer.replace(node.value),
  83. precedence: escodegen.Precedence.Primary
  84. };
  85. }
  86. return node;
  87. }
  88. }