UNPKG

js-confuser

Version:

JavaScript Obfuscation Tool.

85 lines (82 loc) 4.82 kB
"use strict"; function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = exports.INTEGRITY = void 0; var _order = require("../../order"); var _randomUtils = require("../../utils/random-utils"); var _integrityTemplate = require("../../templates/integrityTemplate"); var t = _interopRequireWildcard(require("@babel/types")); var _template = _interopRequireDefault(require("../../templates/template")); var _NameGen = require("../../utils/NameGen"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; } var INTEGRITY = exports.INTEGRITY = Symbol("Integrity"); /** * Integrity has two passes: * * - First in the 'lock' plugin to select functions and prepare them for Integrity * - Secondly here to apply the integrity check * * This transformation must run last as any changes to the code will break the hash */ var _default = exports["default"] = function _default(_ref) { var Plugin = _ref.Plugin; var me = Plugin(_order.Order.Integrity, { changeData: { functions: 0 } }); var nameGen = new _NameGen.NameGen(me.options.identifierGenerator, { avoidObjectPrototype: true, avoidReserved: true }); return { visitor: { Program: { enter: function enter(path) { path.scope.crawl(); } }, FunctionDeclaration: { exit: function exit(funcDecPath) { var integrityInterface = funcDecPath.node[INTEGRITY]; if (!integrityInterface) return; var newFnPath = integrityInterface.fnPath; if (newFnPath.removed) return; var newFunctionDeclaration = newFnPath.node; if (!newFunctionDeclaration || !t.isFunctionDeclaration(newFunctionDeclaration)) return; var hashFnName = me.globalState.internals.integrityHashName; var obfuscatedHashFnName = me.obfuscator.getObfuscatedVariableName(hashFnName, funcDecPath.find(function (p) { return p.isProgram(); }).node); var newFnName = newFunctionDeclaration.id.name; var binding = newFnPath.scope.getBinding(newFnName); // Function is redefined, do not apply integrity if (!binding || binding.constantViolations.length > 0) return; var code = me.obfuscator.generateCode(newFunctionDeclaration); var codeTrimmed = code.replace(me.globalState.lock.integrity.sensitivityRegex, ""); var seed = (0, _randomUtils.getRandomInteger)(0, 10000000); var hashCode = (0, _integrityTemplate.HashFunction)(codeTrimmed, seed); var selfName = funcDecPath.node.id.name; var selfCacheProperty = nameGen.generate(); var selfCacheString = "".concat(selfName, ".").concat(selfCacheProperty); // me.log(codeTrimmed, hashCode); me.changeData.functions++; var hashName = nameGen.generate(); funcDecPath.node.body = t.blockStatement(new _template["default"]("\n var {hashName} = ".concat(selfCacheString, " || (").concat(selfCacheString, " = ").concat(obfuscatedHashFnName, "(").concat(newFunctionDeclaration.id.name, ", ").concat(seed, "));\n if({hashName} === ").concat(hashCode, ") {\n {originalBody}\n } else {\n {countermeasures} \n }\n ")).compile({ originalBody: funcDecPath.node.body.body, hashName: hashName, countermeasures: function countermeasures() { return me.globalState.lock.createCountermeasuresCode(); } }), // Preserve directives funcDecPath.node.body.directives); } } } }; };