Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #69, СЕНТЯБРЬ 2004 г.

Против лома нет приема

Анализирующий

Xakep, номер #069, стр. 069-086-2


var wk14=4538;

CjeYod='ZiubbTEbCPOLOOTocOYmjJbD';

По-видимому, это какие-то ключи, используемые при шифровании. Продолжаю исследование в надежде вернуться к ним. Обращаю внимание на переменную и присваиваемое ей значение: ed='несколько килобайт кода'. Похоже, что переменная хранит закодированный текст! Ниже встречаю еще одну служебную переменную:

WLOF='aHigSGOSIXcPPBBO';

Она пока что интереса для меня не представляет. Задуматься же заставляет другой участок кода:

SWfF='%6b\075%75ne%73\143a%70e\050%22%25%30D%25%30A%22\051\073\143%31\075%20%69%71e\050ed\051\073do\143%75%...';

Где-то я это уже видел :). Очень похоже на кусок какого-то хитрого шелл-кода. Но в тоже время ясно, что это не бинарные данные. Скорее всего, это какой-то текст, закодированный стандартными средствами JavaScript. Ладно, дальше будет виднее. Вращаю скроллер мыши. Оба-на! Происходит еще одно приращение переменной ed: ed+='еще несколько килобайт кода'. С нетерпением прокручиваю окно текстового редактора. Опять знакомая комбинация:

vOrOuQOQ='NHOXqOkqmyTUlmxYEduOgDMycOOObRKR';

SWfF+='2c%6b\051\073\162et%75\162n%20%4a%7d\073f%75n\143t%69on%20%5f%73\050\051%7b%5fA%20\075%20ne%...';

Знаешь, как в старом анекдоте.

- Все-таки не пойму: как Шерлок Холмс мог обходиться без женщин?

- Элементарно…

- Ватсон?!!

Что сказать, все встало на свои места. Суди сам: опять происходит приращение переменной ed, вводится еще одна служебная переменная, а в самом конце скрипта стоит оператор с вложенной функцией: eval(unescape(SWfF)).

Идем в обход

Функция eval() знакома мне по другому языку программирования. Какому – не скажу :). Она выполняет переданный ей программный код. Эдакий компилятор в компиляторе. Но что же делает процедура unescape()? Совершенно ясно – приводит содержимое переменной SWfF к нормальному виду, к исполняемому JS-коду. Таким образом оказывается, что в этой переменной хранится закодированная программа, которая расшифровывает ed – текст документа. Почитав документы по этой функции, я понял, что код программы-дешифратора был изначально закодирован стандартной функцией escape(). Это для того, чтобы отпугнуть неопытных взломщиков, – ведь в документе в этом случае не будет почти ни одного осмысленного оператора.

Замечательно, теперь все понятно. Настало время получить код, расшифровывающий контент документа. Но как же это лучше сделать? На помощь приходит Windows Script Host (WSH) – любимец ленивых админов. Быстро создаю в Блокноте сценарий unescape.js, код которого имеет следующий вид:

Программа для получения кода расшифровки

/* Для нарядности объединил все приращения переменной SWfF в одно */

SWfF='килобайт кодов’;

/* Декодированный код помещается в переменную shlcode */

shlcode=unescape(SWfF)

/* Создается файл shlcode.txt */

var fso=WScript.CreateObject("Scripting.FileSystemObject");

var txtstreamout=fso.OpenTextFile("shlcode.txt",2,true);

/* Сохраняется полученный результат */

txtstreamout.WriteLine(shlcode)

После выполнения этого сценария переношу полученный результат в исходный текст, предварительно сделав его резервную копию. От переменной SWfF и функций unescape() и eval() я решительно избавляюсь. Сам результат после нескольких клацаний клавишей ввода выглядит так:

Назад на стр. 069-086-1  Содержание  Вперед на стр. 069-086-3