Unminify JS - конвертируйте ужатый JavaScript обратно в читаемый формат
Unminify JS, также известный как деобфускация JS кода, является процессом преобразования сжатого и обфусцированного JavaScript кода в его исходное состояние. Обычно JavaScript код, который был оптимизирован и сжат с целью уменьшить размер файла и повысить производительность загрузки веб-страницы, становится нечитаемым и трудно понять его структуру и логику.
Для деобфускации JS кода существует несколько подходов и инструментов.
1. Восстановление использую пробельное форматирование:
В этом случае вы можете использовать онлайн-сервисы, такие как Prettifier (https://prettier.io/playground/), чтобы сделать код более читабельным. Пробелы между операторами, отступы и отступы улучшат структуру кода, но не смогут восстановить переменные и функции со смысловыми именами.
Пример:
var n=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];(function(e,t){"object"==typeof export&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof export?export.dayjs=t():e.dayjs=t()})(window,function(){"use strict";function e(e){return null!=e&&"object"==typeof e&&e.constructor===Date}function t(r){if(e(r))return new Date(r);if("number"!=typeof r)return NaN;if(Number.isFinite(r))return new Date(r);throw new Error("Unable to cast ["+r+"] to date object")}return function(e){var n={};function i(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return e[e].call(t.exports, t, t.exports, i),t.l=!0,t.exports}return i.m=e,i.c=n,i.d=function(e,t,r){i.o(e, t)||Object.defineProperty(e, t,{ enumerable:!0,get:r})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e, Symbol.toStringTag,{ value:"Module"})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r, "default",{ enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)i.d(r, n,function(t){return e[t]}.bind(null, n));return r};i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t, "a",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e, t)},i.p="",i(i.s=70)}([// код продолжается...
Преобразуется в:
var weekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
(function(global, factory) {
if (typeof exports === "object" && typeof module !== "undefined") {
module.exports = factory();
} else if (typeof define === "function" && define.amd) {
define([], factory);
} else {
global.dayjs = factory();
}
})(window, function() {
"use strict";
function isDate(input) {
return null != input && typeof input === "object" && input.constructor === Date;
}
function toDate(date) {
if (isDate(date)) return new Date(date);
if (typeof date !== "number") return NaN;
if (Number.isFinite(date)) return new Date(date);
throw new Error("Unable to cast [" + date + "] to date object");
}
return function(Core) {
// и так далее...
};
});
2. Использование JS деобфускаторов:
Если вы хотите более полностью восстановить код, включая переменные и функции с осмысленными именами, можно использовать JS деобфускаторы. Некоторые популярные инструменты для деобфускации кода включают UglifyJS (https://www.npmjs.com/package/uglify-js), JS Beautifier (https://beautifier.io/), или даже инструменты разработчика веб-браузера, такие как Chrome DevTools или Firefox Developer Tools.
Пример использования UglifyJS:
javascript
var code = "var n=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];(function(e,t){'object'==typeof export&&'object'==typeof module?module.exports=t():'function'==typeof define&&define.amd?define([],t):'object'==typeof export?export.dayjs=t():e.dayjs=t()})(window,function(){" +
"'use strict';" +
"function e(e){return null!=e&&'object'==typeof e&&e.constructor===Date}" +
"function t(r){if(e(r))return new Date(r);if('number'!=typeof r)return NaN;if(Number.isFinite(r))return new Date(r);throw new Error('Unable to cast ['+r+'] to date object')}" +
"return function(e){var n={};function i(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return e[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){" +
"'undefined'!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:'Module'})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&'object'==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,'default',{enumerable:!0,value:e}),2&t&&'string'!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r};i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,'a',t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p='',i(i.s=70)}([ // код продолжается...
javascript
var UglifyJS = require("uglify-js");
var code = "var n=['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];(function(e,t){'object'==typeof export&&'object'==typeof module?module.exports=t():'function'==typeof define&&define.amd?define([],t):'object'==typeof export?export.dayjs=t():e.dayjs=t()})(window,function(){" +
"'use strict';" +
"function e(e){return null!=e&&'object'==typeof e&&e.constructor===Date}" +
"function t(r){if(e(r))return new Date(r);if('number'!=typeof r)return NaN;if(Number.isFinite(r))return new Date(r);throw new Error('Unable to cast ['+r+'] to date object')}" +
"return function(e){var n={};function i(e){if(n[e])return n[e].exports;var t=n[e]={i:e,l:!1,exports:{}};return e[e].call(t.exports,t,t.exports,i),t.l=!0,t.exports}return i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){" +
"'undefined'!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:'Module'})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&'object'==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,'default',{enumerable:!0,value:e}),2&t&&'string'!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r};i.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(t,'a',t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p='',i(i.s=70)}([ // код продолжается...
Обратите внимание, что деобфускация кода может быть полезной для понимания функциональности или обнаружения потенциальных уязвимостей в сжатом JS коде. Однако, недостаточно только деобфусцировать код, чтобы правильно разбираться в изначальном намерении автора и можно потерять некоторые оптимизации, встроенные в сжатый код.