MemberExpressionObfuscator.ts 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import * as escodegen from 'escodegen';
  2. import * as estraverse from 'estraverse';
  3. import { IIdentifierNode } from "../interfaces/nodes/IIdentifierNode";
  4. import { ILiteralNode } from "../interfaces/nodes/ILiteralNode";
  5. import { IMemberExpressionNode } from "../interfaces/nodes/IMemberExpressionNode";
  6. import { INode } from "../interfaces/nodes/INode";
  7. import { NodeType } from "../enums/NodeType";
  8. import { NodeObfuscator } from './NodeObfuscator';
  9. import { Nodes } from "../Nodes";
  10. export class MemberExpressionObfuscator extends NodeObfuscator {
  11. /**
  12. * @param memberExpressionNode
  13. */
  14. public obfuscateNode (memberExpressionNode: IMemberExpressionNode): void {
  15. estraverse.replace(memberExpressionNode.property, {
  16. leave: (node: INode, parentNode: INode): any => {
  17. if (Nodes.isLiteralNode(node)) {
  18. this.obfuscateLiteralProperty(node);
  19. return;
  20. }
  21. if (Nodes.isIdentifierNode(node)) {
  22. if (memberExpressionNode.computed) {
  23. return;
  24. }
  25. memberExpressionNode.computed = true;
  26. this.obfuscateIdentifierProperty(node);
  27. }
  28. }
  29. });
  30. }
  31. /**
  32. * replaces:
  33. * object.identifier = 1;
  34. *
  35. * on:
  36. * object[_0x23d45[25]] = 1;
  37. *
  38. * and skip:
  39. * object[identifier] = 1;
  40. *
  41. * @param node
  42. */
  43. private obfuscateIdentifierProperty (node: IIdentifierNode): void {
  44. let nodeValue: string = node.name,
  45. literalNode: ILiteralNode = {
  46. raw: `'${nodeValue}'`,
  47. 'x-verbatim-property': {
  48. content : this.replaceLiteralValueWithUnicodeValue(nodeValue),
  49. precedence: escodegen.Precedence.Primary
  50. },
  51. type: NodeType.Literal,
  52. value: nodeValue
  53. };
  54. delete node.name;
  55. Object.assign(node, literalNode);
  56. }
  57. /**
  58. * replaces:
  59. * object['literal'] = 1;
  60. *
  61. * on:
  62. * object[_0x23d45[25]] = 1;
  63. *
  64. * @param node
  65. */
  66. private obfuscateLiteralProperty (node: ILiteralNode): void {
  67. if (typeof node.value === 'string' && !node['x-verbatim-property']) {
  68. node['x-verbatim-property'] = {
  69. content : this.replaceLiteralValueWithUnicodeValue(node.value),
  70. precedence: escodegen.Precedence.Primary
  71. };
  72. }
  73. }
  74. }