Joe's CGСтатьи

Защита программ от взлома

Автор:

У тебя ничего нет, чем ты мог бы меня запугать. Со мной бесполезна вся твоя сила.

Джокер

Эта заметка не относится к компьютерной графике, но т. к. я не имею привычки вести какие-либо блоги, а больше писать некуда, то пишу сюда.

Речь идёт о защите компьютерных программ от их взлома хакерами. Противно смотреть, как на торрентах появляются взломанные версии даже самых продвинутых игрушек (Crysis, S.T.A.L.K.E.R Clear Sky и др.) чуть ли ни в день выхода релиза (а иногда и раньше). Не говоря уже о последних версиях такого дорогого ПО как Photoshop и 3D Studio Max. Широкополосный доступ в Сеть ведёт к тому, что найти и скачать с торрента взломанную версию игры или программы даже проще и дешевле, чем идти и покупать её на лотке у барыги. Т. е. беспредел полнейший, фактически ситуация на рынке PC обстоит таким образом, что реально защитить ПО от взлома и нелегального использования на практике невозможно. Все существующие способы защиты, которые применимы в случае использования ПО обычными пользователями, могут быть сломаны - вопрос времени. Если программа - "середнячок" и защита у неё её ей под стать, то ломается на раз-два. Более сложные способы защиты требуют больше времени и высокой квалификации, но знаете, есть люди, которые зарабатывают себе на жизнь этим промыслом, поэтому для них нет  понятия "защищённая программа" - неделя, а если понадобится - то и месяц, и Ваша дорогая программа уже на торрентах.

Вот я как-то задумался над тем, как бы защитить ПО (игру, например) от грязных лап "хакеров". Пока не работает Trusted Computing (а в ближайшие годы что-то и не придвидится, Intel больше интересует её гибрид-монстр Larrabee, чем protected execution), нужно искать другой метод. В процессе общения на нашем уважаемом форуме у меня родилась следующая идея.

А что, если давать юзеру для запуска не весь .exe фаил, а только его часть, скажем, 99.9%? Оставшиеся 0.1% размещаются на dedicated сервере паблишера игры и выполняются удалённо. Доступ к удалённому коду имеет только обслуживающий персонал, поэтому заполучить его для взломщика нет никакой возможности. Вместе с тем без этого 0.1% процента кода весь .exe файл представляет собой нефункциональную кучу байтов, или другими словами - не способен воспроизвести полноценный игровой процесс. Например, в удалённом коде может размещаться функция из физической подсистемы движка или какой-то логический участок AI монстров. Небольшой и несложный код, чтобы не нагружал сервер при множестве подключенных игроков и не лагал при передаче/получения данных. Тогда запуск игры выглядит так: игрок кликает на .exe файле, программа подключается к серверу и вызывает в процессе работы удалённый код (назовём этот процесс remote function execution). В процессе вызова в зашифрованном виде передаётся пароль к экземпляру игры и некие данные, и если он верный, удалённая функция принимает данные, обрабатывает их и возвращает результат. Программа принимает данные и продолжает работу. Этому процессу невозможно помешать без того, чтобы не нанести ущерб программе. Можно конечно попытаться написать заглушку, но если удалённая функция нетривиальна, сделать это вряд ли получится - кто же по куче ассемблерного кода догадается, что именно и как делает удалённый код? Если же хакер просто вырежет из тела программы вызов удалённой процедуры, игра станет нежизнеспособной и взлом потеряет смысл. Используя такой метод, можно гарантировать, что один экземпляр программы будет выполняться на одной машине. Просто регистрируем на сервере пароль экземпляра и выполняем код только тогда, когда он приходит с того IP, для которого пароль зарегистрирован первым. Если произойдёт попытка запустить копию с другой машины, то сервер должен выдать отказ. Конечно, легальному пользователю нужно предоставить способ сменить IP, например, в случае смены аппаратной конфигурации - сделать это нетрудно.

У этого способа есть один недостаток - правда, не фатальный. Нужно, чтобы пользователь обладал постоянным доступом в Сеть, желательно быстрым и без лагов. Пожалуй, для стандартного ПО это неприемлемо, а вот для игр это можно требовать. Сейчас очень многие играют по Сети, например в разные on-line MMORPG, и постоянное подключение является здесь нормой. Этот класс игр уже может быть защищён таким способом, можно сделать это требованием и для всех остальных - шутеров, гонок, спортивных симуляторов. Вообще вокруг этой идеи можно наворачивать разные фишки. Например, чтобы не было лагов, не постоянно вызывать удалённый код, а достаточно редко, например, разместить в remote function какую-то логику инициализации программы, и вызывать при старте, с привязкой к аппаратной конфигурации пользователя. Или создать в программе такой код,чтобы при вычислениях со временем намеренно накапливалась погрешность, а в remote function она устранялась. Тогда можно вызывать код, скажем, раз в 5 секунд и т. д. В общем, путей много. А обязательный доступ к сети во время игрового процесса можно записать в requirements игры, а заодно и на коробке, чтобы пользователь был ознакомлен с ними на момент покупки.

Ну а что с теми, у кого нет доступа к Сети? Без обид - они пролетают. Но где вы потеряете больше - на тех, у которых нет доступа к Сети, или на тех, у кого есть прекрасный доступ к Сети и к торрентам? И которые качают сломанную версию Вашей игры, хотя можно и нужно заставить их купить лицензию?

5 ноября 2008 (Обновление: 5 дек 2008)

Комментарии [2]