FunctionObfuscator.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import * as estraverse from 'estraverse';
  2. import { IBlockStatementNode } from "../interfaces/nodes/IBlockStatementNode";
  3. import { IFunctionNode } from "../interfaces/nodes/IFunctionNode";
  4. import { INode } from "../interfaces/nodes/INode";
  5. import { NodeObfuscator } from './NodeObfuscator';
  6. import { Nodes } from "../Nodes";
  7. import { Utils } from '../Utils';
  8. /**
  9. * replaces:
  10. * function foo (argument1) { return argument1; };
  11. *
  12. * on:
  13. * function foo (_0x12d45f) { return _0x12d45f; };
  14. *
  15. */
  16. export class FunctionObfuscator extends NodeObfuscator {
  17. /**
  18. * @type {Map<string, string>}
  19. */
  20. private functionParams: Map <string, string> = new Map <string, string> ();
  21. /**
  22. * @param functionNode
  23. */
  24. public obfuscateNode (functionNode: IFunctionNode): void {
  25. this.storeFunctionParams(functionNode);
  26. this.replaceFunctionParams(functionNode);
  27. }
  28. /**
  29. * @param functionNode
  30. */
  31. private storeFunctionParams (functionNode: IFunctionNode): void {
  32. functionNode.params
  33. .forEach((paramsNode: INode) => {
  34. estraverse.traverse(paramsNode, {
  35. leave: (node: INode): any => this.storeIdentifiersNames(node, this.functionParams)
  36. });
  37. });
  38. }
  39. /**
  40. * @param functionNode
  41. */
  42. private replaceFunctionParams (functionNode: IFunctionNode): void {
  43. let replaceVisitor: estraverse.Visitor = {
  44. leave: (node: INode, parentNode: INode): any => {
  45. this.replaceIdentifiersWithRandomNames(node, parentNode, this.functionParams);
  46. }
  47. };
  48. functionNode.params
  49. .forEach((paramsNode: INode) => {
  50. estraverse.replace(paramsNode, replaceVisitor);
  51. });
  52. estraverse.replace(functionNode.body, replaceVisitor);
  53. }
  54. }