• Авторизация


Дисциплина изменчивость, или тзимитцу отдыхают 13-12-2008 03:30 к комментариям - к полной версии - понравилось!


Настроение сейчас - Задумчивость

Я вернулся. Но не надолго. Хотел было рассказать о ключевых событиях в своей жизни за этот период и даже практически это сделал, но при отправке инет заглючил, а восстанавливать текст мне как-то лень. Поэтому я расскажу о том, на что я набрел во время своих астральных путешествий при очередной попытке достичь DZена. Штука эта называется полиморфизм. Вообще говоря вещь эта на мой взгляд имеет очень малый спектр применения: VX-сцена и защита кода. Вот о втором я и хотел рассказать. Для начала правда необходимо упомянуть, что никто кроме знаменитых Z0mbie и Vecna (и LordASD'а, работы которого к сожалению я не смог разыскать) из не менее знаменитой группы 29А, не смог развить и предложить новый подход этого замечательного механизма. Более того, лично я не претендую на то, что я мега-кул-хацкер. Это далеко не так (к сожалению), поэтому все высказанные здесь мною мысли (свои и чужие) будут на уровне болтологии без конкретного кода.
Если сильно примитизировать, то полиморфизм можно разделить на 6 условных уровней:
Уровень 1. Код, имеющий некоторый набор шифровальщиков с постоянным кодом. Сами представители VX-сцены и их заклятые друзья-враги AV-еры не считают это полноценным полиморфизмом, т.к. при заражении программы таким кодом, встраивается один из шифровальщиков. Часто такой код называют "олигоморфиком" или "полу-полиморфиком"
Уровень 2. Расшифровщик содержит одну или несколько постоянных инструкций. Вся остальная часть кода постоянно изменяется
Уровень 3. Расшифровщик содержит неиспользуемые инструкции, так называемый "мусор" - NOP; MOV AX,AX; XCHG BX,BX и т.д., и т.п. Также это может быть связка нескольких инструкций. Например PUSH DX \ POP DX ;NASM-style code
Уровень 4. Расшифровщик содержит взаимозаменяемые инструкции и их перемешивание. При этом алгоритм расшифровки постоянен
Уровень 5. Этот уровень подразумевает под собой комбинацию техник всех уровней с 1-го по 4-й, плюс алгоритм шифрования непостоянен, возможно повторное шифрование кода и даже частичное шифрование самого кода расшифровщика
Уровень 6. Это знаменитые permutate-вирусы. Отцом-основателем данной техники является Z0mbie.29A. Прочитайте его статьи о пермутационных движках и вы не пожалеете. Даже если ничего не будет понятно, достаточно даже просто восхититься его гению. Этот человек мыслит абсолютно не так как это делает большинство. Его мышление не сковано рамками аналитических абстракций, навязываемых HLL. Хотя возможно это и есть то, что называют низкоуровневым мышлением. Однако про саму технику. Смысл ее заключается в изменении кода через его декомпозицию на конечные автоматы, которые потом пермешиваются произвольным образом в тексте кода, но функциональные связи сохраняются. Чисто теоретически, если код удастся разбить на достаточно большое число маленьких по объему конечных автоматов, то такой код не будет нуждаться в шифровании.

Ну-с а теперь собственно идея, которая меня посетила и долгое время не отпускала мой неокрепший в удивительном мире DZена разум. Идея проста - взлом программ происходит по принципу дизассемблирования кода, изучения принципа его работы аналитически и во время отладки. Безусловно любая защита может быть взломана при должном наличии упорства и времени. Однако наша задача увеличить необходимое для взлома время на как можно более длительный срок. А это значит, что нам в идеале надо как-то предотвратить все три возможных действия. Очевидно, что дизассемблирование полностью предотвратить невозможно, но в наших силах показать только шифровщик, либо его часть. Это значит, что нам необходим алгоритм шифрования кода. В то время как шифрование может остановить полных профанов или новичков, это не остановит рядовых хакеров. А это значит, что применяя отладчик можно заставить дизассемблер распознать битовые поля как код (например та же IDA Pro это легко делает). Для этого необходимо применить антиотладочные средства. Давно известно, что инструкции меняющие EIP очищают кэш, а следовательно программу, состоящую сплошь и рядом из JMP'ов и/или Jcc будет чрезвычайно понять, т.к. отладчик не будет срабатывать. Однако, если хакер отличается упорством, то он пройдет и этот этап. Вот тут-то и наступает фаза изучения кода. На данном этапе единственное, что мы можем сделать это рассчитывать на человеческий фактор и пытаться сломить хакера морально. Безусловно есть такие стойкие оловянные солдатики, которые смогут пройти даже это, но большинство должно отсеяться в виду практической безысходности ситуации (особенно после попытки анализа кода без нормальной отладки). На мой взгляд достичь этого можно, если использовать захламление кода "мусорными" инструкциями. Причем желательно использовать не только мусор в одну мнемонику, но и в 2-3 мнемоники.
А теперь после вышеизложенного опять внимательно присмотримся к уровням полиморфизма. Очевидно, что всем выдвинутым требованиям наиболее подходит пермутационный движок с шифрованием дешифровщика и генератором мусора. Для доставления особого полового удовольствия можно изменять алгоритм шифрования. Причем не после каждого запуска программы, а с некоторой вероятностью.
P.S. Уверен, что моя идея далеко не новая и уже была придумана кем-то из умных людей до меня. Благо таких людей много. Я просто до этого дошел сам и мне захотелось поделиться этой мыслью с остальными.

[380x238]
вверх^ к полной версии понравилось! в evernote
Комментарии (5):
Ronamis 15-12-2008-00:35 удалить
Позор на мою волосатую голову, но полное незнание приведенных выше аббревиатур сводит на нет моё осознание вопроса.
Шифровка кода происходит по некому алгоритму, ведь так? И если обойти ( или обратить (это возможно?)) шифровку можно получить исходный код? Или я не прав?
-null- 15-12-2008-09:51 удалить
Ronamis, ничего позорного в этом нет. Аббревиатуры, которые я использовал в тексте - это мнемоники и название регистров (ну кроме аббревиатур VX - Virus eXecutioner , AV - Anti-Virus и HLL - High Level Language).

EIP (Extended Instruction Pointer) - указатель инструкции. Содержит число, являющееся адресом следующей исполняемой инструкции в сегменте кода.
NOP (No OPeration) - пустая инструкция, которая заставляет процессор бездействовать 1 такт
MOV AX,AX - пересылка данных в формате "приемник, источник". Т.е. данная команда аналогична команде в C: a=a;
XCHG BX,BX - мнемоника перестановки содержимого операндов. То что было в приемнике оказывается в источнике, а то что было в источнике оказывается в приемнике. Очевидно, что в такой форме записи это просто бессмысленная инструкция.
PUSH DX \ POP DX - пара команд работающих со стеком. В данном случае мы запихнули в стек регистр значение DX и вытащили его обратно в DX.
JMP - это мнемоника безусловного перехода по указанному адресу. Эта команда меняет EIP на значение своего операнда
Jcc - это общий вид мнемоники условного перехода. Вместо 2-х последних символов стоят условия перехода. Аналогична JMP, только для совершения перехода нужно выполнение условия.

Теперь по поводу шифровки. Да ты прав, шифровка происходит по некоторому алгоритму, но соль в том, что дизассемблер шифрованный код воспринимает как просто поля данных. Т.е. он покажет код расшифровщика, разбавленного мусорным кодом и какой-то массив данных. Обойти шифрование можно, если знаешь алгоритм шифрования и непосредственно места, содержащие шифрованный код. Если ошибаешься с хотя бы дним компонентом (сам алгоритм, кусочки шифрованного кода, разбросанные по всему файлу), то получаешь искаженный код. А это уже чревато ошибками при его исполнении и понимании принципа работы.
Но в целом и общем ты абсолютно правильно понял - шифрование процесс обратимый. Тут задача стоит создать относительно трудоемкий процесс расшифровки.
Ronamis 15-12-2008-16:22 удалить
-null-, Энди, это так жестоко!))))) Тебя в эти выходные ждать на 40к?
-null- 15-12-2008-21:26 удалить
Ronamis, такова нежизнь Тони. 8))) На сей раз я приду точно. Только назови место и время.
Ronamis 15-12-2008-23:58 удалить
-null-, Пятница, вечер - территория Василия


Комментарии (5): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Дисциплина изменчивость, или тзимитцу отдыхают | -null- - Дневник -null- | Лента друзей -null- / Полная версия Добавить в друзья Страницы: раньше»