FunctionObfuscator.ts 1.8 KB

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