CatchClauseObfuscator.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 { IObfuscatorReplacer } from '../../interfaces/node-transformers/IObfuscatorReplacer';
  7. import { IObfuscatorReplacerWithStorage } from '../../interfaces/node-transformers/IObfuscatorReplacerWithStorage';
  8. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
  9. import { NodeType } from '../../enums/NodeType';
  10. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  11. import { Node } from '../../node/Node';
  12. import { NodeUtils } from '../../node/NodeUtils';
  13. /**
  14. * replaces:
  15. * try {} catch (e) { console.log(e); };
  16. *
  17. * on:
  18. * try {} catch (_0x12d45f) { console.log(_0x12d45f); };
  19. *
  20. */
  21. @injectable()
  22. export class CatchClauseObfuscator extends AbstractNodeTransformer {
  23. /**
  24. * @type {IObfuscatorReplacerWithStorage}
  25. */
  26. private readonly identifierReplacer: IObfuscatorReplacerWithStorage;
  27. /**
  28. * @param replacersFactory
  29. * @param options
  30. */
  31. constructor(
  32. @inject(ServiceIdentifiers.Factory__IObfuscatorReplacer) replacersFactory: (replacer: NodeObfuscatorsReplacers) => IObfuscatorReplacer,
  33. @inject(ServiceIdentifiers.IOptions) options: IOptions
  34. ) {
  35. super(options);
  36. this.identifierReplacer = <IObfuscatorReplacerWithStorage>replacersFactory(NodeObfuscatorsReplacers.IdentifierReplacer);
  37. }
  38. /**
  39. * @param catchClauseNode
  40. */
  41. public transformNode (catchClauseNode: ESTree.CatchClause): void {
  42. const nodeIdentifier: number = this.nodeIdentifier++;
  43. this.storeCatchClauseParam(catchClauseNode, nodeIdentifier);
  44. this.replaceCatchClauseParam(catchClauseNode, nodeIdentifier);
  45. }
  46. /**
  47. * @param catchClauseNode
  48. * @param nodeIdentifier
  49. */
  50. private storeCatchClauseParam (catchClauseNode: ESTree.CatchClause, nodeIdentifier: number): void {
  51. NodeUtils.typedTraverse(catchClauseNode.param, NodeType.Identifier, {
  52. enter: (node: ESTree.Identifier) => this.identifierReplacer.storeNames(node.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. node.name = this.identifierReplacer.replace(node.name, nodeIdentifier);
  64. }
  65. }
  66. });
  67. }
  68. }