MemberExpressionObfuscator.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. */
  31. public transformNode (memberExpressionNode: ESTree.MemberExpression): void {
  32. if (Node.isLiteralNode(memberExpressionNode.property)) {
  33. memberExpressionNode.property = this.obfuscateLiteralProperty(memberExpressionNode.property);
  34. }
  35. if (Node.isIdentifierNode(memberExpressionNode.property)) {
  36. if (memberExpressionNode.computed) {
  37. return;
  38. }
  39. memberExpressionNode.computed = true;
  40. memberExpressionNode.property = this.obfuscateIdentifierProperty(memberExpressionNode.property);
  41. }
  42. }
  43. /**
  44. * replaces:
  45. * object.identifier = 1;
  46. *
  47. * on:
  48. * object[_0x23d45[25]] = 1;
  49. *
  50. * and skip:
  51. * object[identifier] = 1;
  52. *
  53. * @param node
  54. * @returns {ESTree.Literal}
  55. */
  56. private obfuscateIdentifierProperty (node: ESTree.Identifier): ESTree.Literal {
  57. return {
  58. type: NodeType.Literal,
  59. value: node.name,
  60. raw: `'${node.name}'`,
  61. 'x-verbatim-property': {
  62. content: this.stringLiteralReplacer.replace(node.name),
  63. precedence: escodegen.Precedence.Primary
  64. }
  65. };
  66. }
  67. /**
  68. * replaces:
  69. * object['literal'] = 1;
  70. *
  71. * on:
  72. * object[_0x23d45[25]] = 1;
  73. *
  74. * @param node
  75. * @returns {ESTree.Literal}
  76. */
  77. private obfuscateLiteralProperty (node: ESTree.Literal): ESTree.Literal {
  78. if (typeof node.value === 'string' && !node['x-verbatim-property']) {
  79. node['x-verbatim-property'] = {
  80. content: this.stringLiteralReplacer.replace(node.value),
  81. precedence: escodegen.Precedence.Primary
  82. };
  83. }
  84. return node;
  85. }
  86. }