защита игр от взлома КРИС КАСПЕРСКИ АКА МЫЩЪХ Спецвыпуск: Хакер, номер #064, стр. 064-066-6 Кстати, большинство игровых миров управляются своим собственным скриптовым языком, который описывает движение облаков, поведение мячика и характер разных монстров. На чистом С не запрограммируешь никакую игру сложнее «тетриса»! Если мы уже имеем скриптовый язык, то почему бы не включить в него несколько защитных функций? И в этом случае, чтобы взломать программу, хакеру придется разобраться в работе скриптового движка. Чаще всего разработчики используют Pascal- или Basic-подобные языки — не самый лучший выбор в плане защищенности. Программа на p-коде при этом представляет собой последовательность ключевых слов (операторов языка) с аргументами и декомпилируется очень просто. На другом конце шкалы сложности находится Машина Тьюринга, Сети Петри, Стрелка Пирса и прочие примитивные виртуальные машины, которые реализуют фундаментальные логические операции, в результате чего даже такая конструкция, как «IF THEN ELSE», распадается на сотни микрокоманд! Прежде чем хакер проанализирует их, солнце успеет погаснуть, или… Может, все-таки не погаснет? Существует множество продвинутых способов наглядной визуализации таких алгоритмов, к тому же мы опять забываем о производительности... Реализовать crackme на базе Машины Тьюринга еще можно, но коммерческое приложение — едва ли. Хорошая идея — приложить к этому делу Форт. Его преимущества: простота реализации Форт-машины, компактность p-кода, довольно высокая производительность, сложность декомпиляции и ни-на-что-непохожесть. Форт стоит особняком от всех языков, совсем не стремясь соответствовать человеческим привычкам, «здравому смыслу» и «логике». Разобраться в его идеологии с нуля непросто. Хакеру придется нарыть кучу литературы и запастись терпением. Даже если ему не наскучит, разработчик защиты получит хорошую фору по времени... Листинг дизассемблерный листинг Форт-машины (из программы see.exe, поставляемой вместе с Interrupt List'ом) seg000:1F29 loc_1F29: ; CODE XREF: start+39B9vj seg000:1F29 call sub_1F04 seg000:1F2C mov word_A5C, bx seg000:1F30 mov si, dx seg000:1F32 mov bp, [bx+38h] seg000:1F35 mov sp, [bx+36h] seg000:1F38 lodsw seg000:1F39 mov bx, ax seg000:1F3B jmp word ptr [bx] Другая хорошая идея — использовать готовые интерпретаторы малораспространенных языков (Пролог, Хаскель, Оберон), под которые еще не написаны декомпиляторы. Многие из них разработаны в недрах исследовательских институтов и поставляются в исходных текстах, что упрощает модификацию ядра интерпретатора и позволяет легко адаптировать чужой язык к своим целям. |