В колонках играет - DJ Zen - I BelieveНастроение сейчас - ЗадумчивостьЯ вернулся. Но не надолго. Хотел было рассказать о ключевых событиях в своей жизни за этот период и даже практически это сделал, но при отправке инет заглючил, а восстанавливать текст мне как-то лень. Поэтому я расскажу о том, на что я набрел во время своих астральных путешествий при очередной попытке достичь 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. Уверен, что моя идея далеко не новая и уже была придумана кем-то из умных людей до меня. Благо таких людей много. Я просто до этого дошел сам и мне захотелось поделиться этой мыслью с остальными.