ObjectExpressionObfuscator.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import * as escodegen from 'escodegen';
  2. import * as estraverse from 'estraverse';
  3. import * as ESTree from 'estree';
  4. import { NodeType } from '../enums/NodeType';
  5. import { AbstractNodeObfuscator } from './AbstractNodeObfuscator';
  6. import { Node } from '../node/Node';
  7. import { Utils } from '../Utils';
  8. /**
  9. * replaces:
  10. * var object = { 'PSEUDO': 1 };
  11. *
  12. * or:
  13. * var object = { PSEUDO: 1 };
  14. *
  15. * on:
  16. * var object = { '\u0050\u0053\u0045\u0055\u0044\u004f': 1 };
  17. */
  18. export class ObjectExpressionObfuscator extends AbstractNodeObfuscator {
  19. /**
  20. * @param objectExpressionNode
  21. */
  22. public obfuscateNode (objectExpressionNode: ESTree.ObjectExpression): void {
  23. objectExpressionNode.properties
  24. .forEach((property: ESTree.Property) => {
  25. if (property.shorthand) {
  26. property.shorthand = false;
  27. }
  28. estraverse.replace(property.key, {
  29. enter: (node: ESTree.Node, parentNode: ESTree.Node): any => {
  30. if (Node.isLiteralNode(node)) {
  31. this.obfuscateLiteralPropertyKey(node);
  32. return;
  33. }
  34. if (Node.isIdentifierNode(node)) {
  35. this.obfuscateIdentifierPropertyKey(node);
  36. }
  37. }
  38. });
  39. });
  40. }
  41. /**
  42. * @param node
  43. */
  44. private obfuscateLiteralPropertyKey (node: ESTree.Literal): void {
  45. if (typeof node.value === 'string' && !node['x-verbatim-property']) {
  46. node['x-verbatim-property'] = {
  47. content : Utils.stringToUnicode(node.value),
  48. precedence: escodegen.Precedence.Primary
  49. };
  50. }
  51. }
  52. /**
  53. * @param node
  54. */
  55. private obfuscateIdentifierPropertyKey (node: ESTree.Identifier): void {
  56. let nodeValue: string = node.name,
  57. literalNode: ESTree.Literal = {
  58. raw: `'${nodeValue}'`,
  59. 'x-verbatim-property': {
  60. content : Utils.stringToUnicode(nodeValue),
  61. precedence: escodegen.Precedence.Primary
  62. },
  63. type: NodeType.Literal,
  64. value: nodeValue
  65. };
  66. delete node.name;
  67. Object.assign(node, literalNode);
  68. }
  69. }