CatchClauseTransformer.ts 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { injectable, inject } from 'inversify';
  2. import { ServiceIdentifiers } from '../../container/ServiceIdentifiers';
  3. import * as estraverse from 'estraverse';
  4. import * as ESTree from 'estree';
  5. import { IOptions } from '../../interfaces/options/IOptions';
  6. import { IObfuscationReplacer } from '../../interfaces/node-transformers/IObfuscationReplacer';
  7. import { IObfuscationReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscationReplacerWithStorage';
  8. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscationReplacers';
  9. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  10. import { Node } from '../../node/Node';
  11. /**
  12. * replaces:
  13. * try {} catch (e) { console.log(e); };
  14. *
  15. * on:
  16. * try {} catch (_0x12d45f) { console.log(_0x12d45f); };
  17. *
  18. */
  19. @injectable()
  20. export class CatchClauseTransformer extends AbstractNodeTransformer {
  21. /**
  22. * @type {IObfuscationReplacerWithStorage}
  23. */
  24. private readonly identifierReplacer: IObfuscationReplacerWithStorage;
  25. /**
  26. * @param replacersFactory
  27. * @param options
  28. */
  29. constructor (
  30. @inject(ServiceIdentifiers.Factory__IObfuscatorReplacer) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IObfuscationReplacer,
  31. @inject(ServiceIdentifiers.IOptions) options: IOptions
  32. ) {
  33. super(options);
  34. this.identifierReplacer = <IObfuscationReplacerWithStorage>replacersFactory(NodeObfuscatorsReplacers.IdentifierReplacer);
  35. }
  36. /**
  37. * @param catchClauseNode
  38. * @returns {ESTree.Node}
  39. */
  40. public transformNode (catchClauseNode: ESTree.CatchClause): ESTree.Node {
  41. const nodeIdentifier: number = this.nodeIdentifier++;
  42. this.storeCatchClauseParam(catchClauseNode, nodeIdentifier);
  43. this.replaceCatchClauseParam(catchClauseNode, nodeIdentifier);
  44. return catchClauseNode;
  45. }
  46. /**
  47. * @param catchClauseNode
  48. * @param nodeIdentifier
  49. */
  50. private storeCatchClauseParam (catchClauseNode: ESTree.CatchClause, nodeIdentifier: number): void {
  51. if (Node.isIdentifierNode(catchClauseNode.param)) {
  52. this.identifierReplacer.storeNames(catchClauseNode.param.name, nodeIdentifier);
  53. }
  54. }
  55. /**
  56. * @param catchClauseNode
  57. * @param nodeIdentifier
  58. */
  59. private replaceCatchClauseParam (catchClauseNode: ESTree.CatchClause, nodeIdentifier: number): void {
  60. estraverse.replace(catchClauseNode, {
  61. enter: (node: ESTree.Node, parentNode: ESTree.Node): any => {
  62. if (Node.isReplaceableIdentifierNode(node, parentNode)) {
  63. const newNodeName: string = this.identifierReplacer.replace(node.name, nodeIdentifier);
  64. if (node.name !== newNodeName) {
  65. node.name = newNodeName;
  66. node.obfuscated = true;
  67. }
  68. }
  69. }
  70. });
  71. }
  72. }