Защита Программного Обеспечения: Основные Ошибки При Программировании Модуля Журнала Программы (Или Один Бит Может Изменить Мир)

Для того, чтобы написать хорошую программу, как правило, от программиста требуется много времени и усилий.

Большинство программистов даже не осознают, насколько легко можно взломать их программы.

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

Для этого я написал небольшую программу, в которой попытаюсь показать, как легко обойти участок кода, отвечающий за проверку легальности копии ПО.

Если данная тема заинтересует читателей, она будет продолжена в последующих публикациях.

Для начала нам понадобится: • Дизассемблер (я использовал дизассемблер IDA Free www.hex-rays.com/idapro/idadownfreeware.htm ) • Шестнадцатеричный редактор (я брал редактор со встроенным дизассемблером BIEW biew.sourceforge.net/ru/biew.html ) • Немного мозгов :) Первым шагом является определение компилятора, использованного для создания загружаемого модуля.

Для этого воспользуемся небольшой утилитой PEiD ( http://www.peid.info/ ).

Шаг второй – запуск программы.

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

Окно интерфейса программы выглядит следующим образом:

Защита программного обеспечения: основные ошибки при программировании модуля журнала программы (или один бит может изменить мир)

Первое, что мы видим, это надпись в строке заголовка: «Регистрационные данные неверны!» Это означает, что программа при загрузке проверяет регистрационный номер и код. Это упрощает задачу, т.к.

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

Теперь попробуем ввести некоторые данные в поля ввода.



Защита программного обеспечения: основные ошибки при программировании модуля журнала программы (или один бит может изменить мир)

Естественно, мы получим сообщение о том, что введенный код не соответствует имени пользователя.

С помощью утилиты PEiD выясняем, что программа была написана и скомпилирована в интегрированной среде Delphi. Судя по внешнему виду окна сообщения, можно сделать вывод, что для создания диалогового сообщения была использована процедура из внутренней библиотеки компонентов.

Определить компилятор можно также путем визуального осмотра исполняемого модуля, обращая внимание на особенности записей разделов программы и дополнительные авторские строки.

Чтобы изучить исходный код программы, дизассемблируем ее с помощью IDA. Для начала попробуем найти ShowMessage в окне функции, которая, вероятно, использовалась для отображения окна сообщений.

Как видите, в листинге программы есть две перекрестные ссылки на эту процедуру.



Защита программного обеспечения: основные ошибки при программировании модуля журнала программы (или один бит может изменить мир)

Логично предположить, что в одном из этих окон отображается сообщение об успешной регистрации программы, в другом – о неудачной регистрации.

Наше внимание следует обратить на функцию по виртуальному адресу .

0047120E. Дальнейшее ветвление алгоритма зависит от результатов его работы.

Как правило, логический результат функции передается в регистр al. Таким образом, можно сделать вывод, что за проверку правильности введенных регистрационных данных программы отвечает функция sub_470FFC. Далее все, что нам нужно, это заменить результаты функции.

Для этого отправимся по адресу.

00470ФФК.

Фальсифицировать результаты функции можно двумя способами: свести ее выполнение только к нужным строкам или найти место в программе, где регистр al сообщается как 0. В первом случае открытие исполняемого модуля в программе BIEW и перейдя по указанному выше адресу, введите следующий код: 33C0B001C3, который соответствует очистке регистрового аккумулятора (eax), сообщению ему истинного результата и возврату команды по адресу, расположенному в стеке.

Недостаток этого метода в том, что в исходный код программы вносится слишком много изменений.

Чем меньше изменений будет внесено в исходный код, тем эффектнее он будет выглядеть и тем меньше вероятность того, что программа не будет корректно работать в будущем.

Наше внимание должен привлечь следующий фрагмент кода.



Защита программного обеспечения: основные ошибки при программировании модуля журнала программы (или один бит может изменить мир)

Виртуальный адрес .

0047106E фактически присваивается результату функции.

Изменив значение кода 0x75 на 0x74 в операторе условного перехода, расположенном на одну строку выше, мы тем самым заставим программу считать допустимыми любые комбинации имени/кода, кроме правильных.

Запускаем модифицированную программу, в строке заголовка сразу видим надпись о том, что программа уже зарегистрирована.



Защита программного обеспечения: основные ошибки при программировании модуля журнала программы (или один бит может изменить мир)

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



Защита программного обеспечения: основные ошибки при программировании модуля журнала программы (или один бит может изменить мир)

Таким образом, мы обошли блок регистрации программы, а также избежали возможных программных «закладок», которые могли находиться внутри функции регистрации (при изменении программного кода первым описанным способом приложение не могло работать корректно, несмотря на сообщения об успешной регистрации).

Итак, давайте рассмотрим основные ошибки.

1. Использование одной функции для проверки легальности копии (функций должно быть много, несмотря на то, что они фактически делают одно и то же) 2. Использование стандартных диалогов уведомлений (лучше написать свои формы уведомлений для сообщений пользователю) 3. Уведомления пользователя об успешной регистрации (допустимо только уведомление о записи регистрационных данных и предложение перезапустить программу) 4. Никаких дополнительных проверок на легальность копии, никакой привязки результатов работы программы к введенным данным (сочетание логин/пароль должно предусматривать поправочные коэффициенты, влияющие на результаты применения) Это не все рекомендации, которые можно дать авторам программного обеспечения, но следование им может затруднить взлом программы.

Возможно, этого будет достаточно, чтобы остановить новичка, но для человека, достаточно долго изучающего исходный код программ, этого явно недостаточно.

В любом случае, какой бы сложной и замысловатой ни была защита, ее можно взломать.

Весь вопрос в квалификации человека и времени.

Идеальный вариант — когда взлом программы обходится дороже, чем покупка легальной копии.

Всем удачи :).

Теги: #взлом #Ассемблер #защита от взлома #реверсинг #реверс-инжиниринг #Чулан

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.