Пару слов о деобфускации/распаковке скриптов JavaScript

Опубликовано: 19-12-2012 15:14

Одним из способов защиты скриптов от чтения и модификаций является обфускация и упаковка. Давайте посмотрим, что нам говорит Википедия об этом термине.

Обфускация (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать неочевидным, запутанным, сбивать с толку) или запутывание кода — приведение исходного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.
В отличии от разного вида шифрований и упаковок, восстановить обфусцированный исходный код до первоначального вида невозможно. Но можно привести его в более презентабельный и понятный вид.

Но для начала - рассмотрим пример упакованных скриптов. И для примера возьмем довольно известный скрипт подсветки синтаксиса разных языков программирования SyntaxHighlighter. На самом деле в комплекте со скриптами идут исходники данного JS-кода, но нам же надо разобраться :) Итак файл shCore.js имеет следующий вид:

eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('K M;I(M)1S 2U("2a\'t 4k M 4K 2g 3l 4G 4H");(6(){6 r(f,e){I(!M.1R(f))1S 3m("3s 15 4R");
... и далее в таком же духе

Признаком упакованного/обфусцированного скрипта (в данном случае скрипт обработан JavaScript Compressor'ом) является либо характерный набор символов (p,a,c,k,e,d), либо то, что скрипт начинается с инструкции eval. Самый простой способ получить текст скрипта - подменить eval на alert, но размер печатаемого скрипта может быть слишком большим и его неудобно будет копировать для последующего редактирования. Как вариант, можно вывести его в html, либо, что еще лучше, в элемент textarea. Напишем функцию обработки:

function decode(string) {
	document.getElementById('decoded').value += string + '\n';
}

Далее следует добавить на страницу элемент textarea с id="decoded". А следом за ним вставим зашифрованный js-скрипт поменяв предварительно все вызовы eval() на decode() не забыв его обрамить тегами

Далее, копируем полученый код из элемента textarea и вставляем в текстовый редактор или любимую IDE. Как отформатировать исходник - в IDE или сторонними средствами - решать уже Вам. Могу посоветовать неплохой online-инструмент для этого - Online JavaScript beautifier.

Имейте ввиду, что в полученном исходнике в основном всегда именна переменных сильно урезаны, вплоть до единичных букв, что затрудняет понимание и восприятие кода, но минимизирует размер исходника.