MemberExpressionObfuscator.ts 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import * as escodegen from 'escodegen';
  2. import * as estraverse from 'estraverse';
  3. import { NodeObfuscator } from './NodeObfuscator'
  4. export class MemberExpressionObfuscator extends NodeObfuscator {
  5. /**
  6. * @param memberExpressionNode
  7. */
  8. public obfuscateNode (memberExpressionNode: any): void {
  9. estraverse.replace(memberExpressionNode.property, {
  10. leave: (node, parentNode) => {
  11. switch (node.type) {
  12. case 'Literal':
  13. this.literalNodeController(node);
  14. break;
  15. case 'Identifier':
  16. if (memberExpressionNode.computed) {
  17. break;
  18. }
  19. memberExpressionNode.computed = true;
  20. this.identifierNodeController(node);
  21. break;
  22. }
  23. }
  24. });
  25. }
  26. /**
  27. * replaces:
  28. * object.identifier = 1;
  29. *
  30. * by:
  31. * object[_0x23d45[25]] = 1;
  32. *
  33. * and skip:
  34. * object[identifier] = 1;
  35. *
  36. * @param node
  37. */
  38. private identifierNodeController (node: any): void {
  39. let nodeValue: string = node['name'];
  40. node['type'] = 'Literal';
  41. node['value'] = nodeValue;
  42. node['raw'] = `'${nodeValue}'`;
  43. node['x-verbatim-property'] = {
  44. content : this.replaceLiteralStringByArrayElement(nodeValue),
  45. precedence: escodegen.Precedence.Primary
  46. };
  47. delete node['name'];
  48. }
  49. /**
  50. * replaces:
  51. * object['literal'] = 1;
  52. *
  53. * by:
  54. * object[_0x23d45[25]] = 1;
  55. *
  56. * @param node
  57. */
  58. private literalNodeController (node: any): void {
  59. switch (typeof node.value) {
  60. case 'string':
  61. if (node['x-verbatim-property']) {
  62. break;
  63. }
  64. node['x-verbatim-property'] = {
  65. content : this.replaceLiteralStringByArrayElement(node.value),
  66. precedence: escodegen.Precedence.Primary
  67. };
  68. break;
  69. }
  70. }
  71. }