FunctionDeclarationObfuscator.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 { TNodeWithBlockStatement } from '../../types/TNodeWithBlockStatement';
  6. import { ICustomNode } from '../../interfaces/custom-nodes/ICustomNode';
  7. import { IOptions } from '../../interfaces/IOptions';
  8. import { IReplacer } from '../../interfaces/IReplacer';
  9. import { IStorage } from '../../interfaces/IStorage';
  10. import { NodeObfuscatorsReplacers } from '../../enums/container/NodeObfuscatorsReplacers';
  11. import { NodeType } from '../../enums/NodeType';
  12. import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
  13. import { IdentifierReplacer } from './replacers/IdentifierReplacer';
  14. import { Node } from '../../node/Node';
  15. import { NodeUtils } from '../../node/NodeUtils';
  16. import { Utils } from '../../Utils';
  17. /**
  18. * replaces:
  19. * function foo () { //... };
  20. * foo();
  21. *
  22. * on:
  23. * function _0x12d45f () { //... };
  24. * _0x12d45f();
  25. */
  26. @injectable()
  27. export class FunctionDeclarationObfuscator extends AbstractNodeTransformer {
  28. /**
  29. * @type {IdentifierReplacer}
  30. */
  31. private readonly identifierReplacer: IdentifierReplacer;
  32. /**
  33. * @param customNodesStorage
  34. * @param nodeObfuscatorsReplacersFactory
  35. * @param options
  36. */
  37. constructor(
  38. @inject(ServiceIdentifiers['IStorage<ICustomNode>']) customNodesStorage: IStorage<ICustomNode>,
  39. @inject(ServiceIdentifiers['Factory<IReplacer>']) nodeObfuscatorsReplacersFactory: (replacer: NodeObfuscatorsReplacers) => IReplacer,
  40. @inject(ServiceIdentifiers.IOptions) options: IOptions
  41. ) {
  42. super(customNodesStorage, options);
  43. this.identifierReplacer = <IdentifierReplacer>nodeObfuscatorsReplacersFactory(NodeObfuscatorsReplacers.IdentifierReplacer);
  44. }
  45. /**
  46. * @param functionDeclarationNode
  47. * @param parentNode
  48. */
  49. public transformNode (functionDeclarationNode: ESTree.FunctionDeclaration, parentNode: ESTree.Node): void {
  50. this.identifierReplacer.setPrefix(Utils.getRandomGenerator().string({
  51. length: 5,
  52. pool: Utils.randomGeneratorPool
  53. }));
  54. const blockScopeOfFunctionDeclarationNode: TNodeWithBlockStatement = NodeUtils
  55. .getBlockScopeOfNode(functionDeclarationNode);
  56. if (blockScopeOfFunctionDeclarationNode.type === NodeType.Program) {
  57. return;
  58. }
  59. this.storeFunctionName(functionDeclarationNode);
  60. this.replaceFunctionName(blockScopeOfFunctionDeclarationNode);
  61. }
  62. /**
  63. * @param functionDeclarationNode
  64. */
  65. private storeFunctionName (functionDeclarationNode: ESTree.FunctionDeclaration): void {
  66. NodeUtils.typedTraverse(functionDeclarationNode.id, NodeType.Identifier, {
  67. enter: (node: ESTree.Identifier) => this.identifierReplacer.storeNames(node.name)
  68. });
  69. }
  70. /**
  71. * @param scopeNode
  72. */
  73. private replaceFunctionName (scopeNode: ESTree.Node): void {
  74. estraverse.replace(scopeNode, {
  75. enter: (node: ESTree.Node, parentNode: ESTree.Node): any => {
  76. if (Node.isReplaceableIdentifierNode(node, parentNode)) {
  77. node.name = this.identifierReplacer.replace(node.name);
  78. }
  79. }
  80. });
  81. }
  82. }