VariableDeclarationObfuscator.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. "use strict";
  2. const estraverse = require('estraverse');
  3. const NodeObfuscator_1 = require('./NodeObfuscator');
  4. const NodeUtils_1 = require("../NodeUtils");
  5. const Utils_1 = require('../Utils');
  6. class VariableDeclarationObfuscator extends NodeObfuscator_1.NodeObfuscator {
  7. constructor(...args) {
  8. super(...args);
  9. this.variableNames = new Map();
  10. }
  11. obfuscateNode(variableDeclarationNode, parentNode) {
  12. if (parentNode.type === 'Program') {
  13. return;
  14. }
  15. this.replaceVariableName(variableDeclarationNode);
  16. this.replaceVariableCalls(variableDeclarationNode, parentNode);
  17. }
  18. replaceVariableName(variableDeclarationNode) {
  19. variableDeclarationNode.declarations.forEach((declarationNode) => {
  20. estraverse.replace(declarationNode, {
  21. enter: (node) => {
  22. if (NodeUtils_1.NodeUtils.isVariableDeclaratorNode(node)) {
  23. estraverse.replace(node.id, {
  24. enter: (node) => {
  25. this.variableNames.set(node.name, Utils_1.Utils.getRandomVariableName());
  26. node.name = this.variableNames.get(node.name);
  27. }
  28. });
  29. return;
  30. }
  31. return estraverse.VisitorOption.Skip;
  32. }
  33. });
  34. });
  35. }
  36. replaceVariableCalls(variableDeclarationNode, variableParentNode) {
  37. let scopeNode;
  38. scopeNode = variableDeclarationNode.kind === 'var' ? NodeUtils_1.NodeUtils.getNodeScope(variableDeclarationNode) : variableParentNode;
  39. let isNodeAfterVariableDeclaratorFlag = false;
  40. estraverse.replace(scopeNode, {
  41. enter: (node, parentNode) => {
  42. if (node.type === 'FunctionDeclaration' ||
  43. node.type === 'FunctionExpression' ||
  44. node.type === 'ArrowFunctionExpression') {
  45. estraverse.replace(node, {
  46. enter: (node, parentNode) => {
  47. this.replaceNodeIdentifierByNewValue(node, parentNode, this.variableNames);
  48. }
  49. });
  50. }
  51. if (node === variableDeclarationNode) {
  52. isNodeAfterVariableDeclaratorFlag = true;
  53. }
  54. if (isNodeAfterVariableDeclaratorFlag) {
  55. this.replaceNodeIdentifierByNewValue(node, parentNode, this.variableNames);
  56. }
  57. }
  58. });
  59. }
  60. }
  61. exports.VariableDeclarationObfuscator = VariableDeclarationObfuscator;