MemberExpressionObfuscator.ts 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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.literalNodeController(node);
  19. return;
  20. }
  21. if (Nodes.isIdentifierNode(node)) {
  22. if (memberExpressionNode.computed) {
  23. return;
  24. }
  25. memberExpressionNode.computed = true;
  26. this.identifierNodeController(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 identifierNodeController (node: IIdentifierNode): void {
  44. let nodeValue: string = node.name,
  45. literalNode: ILiteralNode = {
  46. raw: `'${nodeValue}'`,
  47. 'x-verbatim-property': {
  48. content : this.replaceLiteralValueByUnicodeValue(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 literalNodeController (node: ILiteralNode): void {
  67. switch (typeof node.value) {
  68. case 'string':
  69. if (node['x-verbatim-property']) {
  70. break;
  71. }
  72. node['x-verbatim-property'] = {
  73. content : this.replaceLiteralValueByUnicodeValue(<string>node.value),
  74. precedence: escodegen.Precedence.Primary
  75. };
  76. break;
  77. default:
  78. break;
  79. }
  80. }
  81. }