UnicodeArrayDecodeNode.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. "use strict";
  2. const esprima = require('esprima');
  3. const JavaScriptObfuscator_1 = require('../../JavaScriptObfuscator');
  4. const AppendState_1 = require("../../enums/AppendState");
  5. const NoCustomNodesPreset_1 = require("../../preset-options/NoCustomNodesPreset");
  6. const Node_1 = require('../Node');
  7. const NodeUtils_1 = require("../../NodeUtils");
  8. const Utils_1 = require("../../Utils");
  9. class UnicodeArrayDecodeNode extends Node_1.Node {
  10. constructor(unicodeArrayName, unicodeArray) {
  11. super();
  12. this.appendState = AppendState_1.AppendState.AfterObfuscation;
  13. this.unicodeArrayName = unicodeArrayName;
  14. this.unicodeArray = unicodeArray;
  15. this.node = this.getNodeStructure();
  16. }
  17. appendNode(blockScopeNode) {
  18. NodeUtils_1.NodeUtils.insertNodeAtIndex(blockScopeNode.body, this.getNode(), 1);
  19. }
  20. getNode() {
  21. if (!this.unicodeArray.length) {
  22. return;
  23. }
  24. return super.getNode();
  25. }
  26. getNodeStructure() {
  27. const atobPolyfill = JavaScriptObfuscator_1.JavaScriptObfuscator.obfuscate(`
  28. var object = []['filter']['constructor']('return this')();
  29. var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  30. object.atob || (
  31. object.atob = function(input) {
  32. var str = String(input).replace(/=+$/, '');
  33. for (
  34. var bc = 0, bs, buffer, idx = 0, output = '';
  35. buffer = str.charAt(idx++);
  36. ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
  37. bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
  38. ) {
  39. buffer = chars.indexOf(buffer);
  40. }
  41. return output;
  42. });
  43. `, NoCustomNodesPreset_1.NO_CUSTOM_NODES_PRESET), indexVariableName = Utils_1.Utils.getRandomVariableName(), tempArrayName = Utils_1.Utils.getRandomVariableName();
  44. let node = esprima.parse(`
  45. (function () {
  46. ${atobPolyfill}
  47. var ${tempArrayName} = [];
  48. for (var ${indexVariableName} in ${this.unicodeArrayName}) {
  49. ${tempArrayName}[${Utils_1.Utils.stringToUnicode('push')}](decodeURI(atob(${this.unicodeArrayName}[${indexVariableName}])));
  50. }
  51. ${this.unicodeArrayName} = ${tempArrayName};
  52. })();
  53. `);
  54. NodeUtils_1.NodeUtils.addXVerbatimPropertyToLiterals(node);
  55. return NodeUtils_1.NodeUtils.getBlockScopeNodeByIndex(node);
  56. }
  57. }
  58. exports.UnicodeArrayDecodeNode = UnicodeArrayDecodeNode;