Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Пиши безопасно

Крис Касперски ака мыщъх

Спецвыпуск: Хакер, номер #057, стр. 057-070-5


Вот, например, @TControl@GetText$qqrv:

Фрагмент дизассемблерного листинга библиотечной функции @TControl@GetText$qqrv

CODE:004410B8 push ebx

CODE:004410B9 push esi

CODE:004410BA push edi

...

CODE:004410E3 pop edi

CODE:004410E4 pop esi

CODE:004410E5 pop ebx

CODE:004410E6 retn

Если заменить push ebx/push esi/pop esi/pop ebx на push esi/push ebx//pop ebx/pop esi, IDA не сможет узнать эту функцию и хакеру придется основательно попыхтеть над реконструкцией защитного механизма.

Исправленные функции уже не опознаются ИДОЙ

CODE:0048D2F7 mov eax, [ebx+328h]

CODE:0048D2FD call sub_4410B8

...

CODE:0048D309 mov eax, [ebx+320h]

CODE:0048D30F call sub_4410B8

Конечно, править все функции вручную - медленный и крайне неперспективный путь, однако знатоки ассемблера за несколько вечеров напишут автоматический пермутатор или возьмут уже готовый (благо полиморфных движков в Сети предостаточно). Сделать замену достаточно всего один раз - в библиотеке, а потом просто линковать ее к защищенным программам! Кстати говоря, исходные тексты большинства стандартных библиотек открыты, а это значит, что, перекомпилировав их с другими ключами оптимизации (или другим компилятором), мы точно ослепим FLIRT.

Совет №5: программируй на Visual Basic или Forth

Как это ни смешно, но программы, написанные на Visual Basic, ломаются значительно труднее (особенно если использовать трансляцию в p-код). Еще сложнее ломается Forth. Кто сталкивался - тот поймет. Кто не сталкивался – тот еще не в психушке. Forth – это вообще-то интерпретатор, но довольно своеобразный, совсем не похожий на остальные языки. Чисто технически можно написать Forth-декомпилятор или найти уже готовый, но для этого хакеру потребуется изучить и сам Forth, а это значит, что взлом программы затянется надолго. Разумеется, никто не предлагает писать приложение на Forth'е целиком. Достаточно запрограммировать на нем несколько ключевых защитных процедур (генерация серийного номера, расшифровщик и т.д.)

Еще можно использовать Microsoft Visual Studio .NET - она тоже позволяет генерировать p-код, правда, для него уже появилось множество декомпиляторов, да и сам формат p-кода стандартизован и тщательно специфицирован. Лучше откопать какой-нибудь редкоземельный интерпретатор, например Haskel или LISP. Во-первых, знакомство с новыми языками расширяет кругозор, а во-вторых, многие начинающие хакеры своими познаниями в языках программирования обычно не вылезают за пределы C/Pascal/ASM - тот же LISP с ходу они вряд ли взломают. Скорее всего, исследуемая программа будет заброшена на полку до лучших времен (то есть навсегда).

Простейшая программа на языке Forth

: IS 0 DO I . LOOP ;

: AS 0 DO CR 1 - DUP IS LOOP ;

Совет №6: используй глобальные переменные

Существует такой миф, что глобальные переменные – это плохо. Рассказывается множество ужасных историй, к примеру, как пара придурков гоняла бага целый день (месяц, неделю), и все из-за глобальных переменных! Это верно! Обращение к ним может происходить из разных мест, и кто угодно может затереть чужое значение со всеми вытекающими отсюда последствиями. Локальные переменные в этом отношении намного нагляднее и проще. Их любят все - и программисты, и хакеры.

Назад на стр. 057-070-4  Содержание  Вперед на стр. 057-070-6