Как стать автором
Обновить

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

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



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

Первый шаг – определить компилятор, использованный для создания загружаемого модуля. Для этого воспользуемся небольшой утилитой PEiD (http://www.peid.info/). Шаг второй – запуск программы. Это очень важные этапы, которые позволят нам собрать важную информацию для выбора стратегии поиска в дизассемблированном листинге блока проверки правильности регистрационных данных. Интерфейсное окно программы выглядит следующим образом:

image

Первое, что мы видим – надпись в строке заголовка: «регистрационные данные не верны!». Это означает, что программа при загрузке проверяет наличие регистрационного номера и кода. Это упрощает задачу т.к. изменив логику алгоритма в самом начале запуска программы, мы получим в дальнейшем полнофункциональную копию. Теперь попробуем ввести какие-нибудь данные в поля ввода.

image

Естественно, мы получим сообщение о том, что введенный код не соответствует имени пользователя. Воспользовавшись утилитой PEiD, узнаем что программа была написана и скомпилирована в интегрированной среде Delphi. По внешнему виду окна сообщений можно заключить, что для создания диалогового сообщения была использована процедура из внутренней библиотеки компонент. Определить компилятор можно также визуально осмотрев исполняемый модуль, обратив внимание на особенности записей секций программы, дополнительных строчек copyright. Для того чтобы изучить исходный код программы, дизассемблируем ее при помощи IDA.
Для начала, попытаемся найти в окне функций ShowMessage, которая вероятно была использована для вывода окна сообщений. Как видим, на эту процедуру в листинге программы есть две перекрестные ссылки.

image

Логично предположить, что одно из этих окон выдает сообщение об успешной регистрации программы, другое – о неудачной регистрации. Наше внимание должна привлечь функция по виртуальному адресу .0047120E. Именно от результатов ее работы зависит дальнейшее ветвление алгоритма. Как правило, логический результат работы функции передается в регистр al. Таким образом, можно сделать вывод о том, что функция sub_470FFC отвечает за проверку корректности введенных данных о регистрации программы. Далее, все что нам нужно – это подменить результаты работы функции. Для этого перейдем по адресу. 00470FFC. Есть два способа фальсифицировать результаты работы функции: сократить ее выполнение лишь необходимыми строками либо найти место в программе, где регистру al сообщается 0. В первом случае, открыв исполняемый модуль в программе BIEW и перейдя по вышеуказанному адресу вводим следующий код: 33C0B001C3 что соответствует очистке регистра аккумулятора (eax), сообщению ему истинного результата и команда возврата на адрес, находящийся в стеке. Недостатком этого метода является слишком большие изменения исходного кода программы. Чем меньше модификаций исходного кода будет сделано, тем более эффектно это будет смотреться и менее вероятна неправильная работа программы в дальнейшем. Наше внимание должен привлечь следующий фрагмент кода

image

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

image

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

image

Таким образом, мы обошли блок регистрации программы, причем избежали возможных программных «закладок», которые могли находиться внутри регистрационной функции (при модификации кода программы первым описанным способом, приложение могло работать неправильно несмотря на сообщения об успешной регистрации).
Итак рассмотрим основные ошибки.
1. Использование одной функции проверки легальности копии (функций должно быть много, несмотря на то, что делают они фактически одно и то же)
2. Использование стандартных диалогов уведомления (лучше написать свои формы-уведомления для сообщений пользователю)
3. Уведомления пользователя об успешной регистрации (допустимо только уведомление о записи регистрационных данных и предложение перезапустить программу)
4. Отсутствие дополнительных проверок легальности копии, отсутствие привязки результатов работы программы от введенных данных (сочетание имени/пароля должно выдавать корректирующие коэффициенты, влияющие на результат работы приложения)
Это далеко не все рекомендации, которые можно дать авторам программного обеспечения, но их выполнение может затруднить взлом программы. Быть может, этого будет достаточно для того, чтобы остановить начинающего, но явно недостаточно для человека, который занимается изучением исходного кода программ достаточно давно. В любом случае, какая бы ни была сложная и запутанная защита – ее можно взломать. Весь вопрос в квалификации человека и времени. Идеальный вариант – это когда взлом программы стоит дороже, чем покупка легальной копии. Всем удачи :).
Теги:взломзащита от взломареверс-инженерингреверс инженерингреверсингассемблер
Хабы: Чулан
Всего голосов 39: ↑27 и ↓12 +15
Просмотры2.9K

Похожие публикации

Программист Android
19 июня 202184 000 ₽GeekBrains
WEB-разработчик
19 июня 202196 000 ₽GeekBrains
Программист iOS
19 июня 202172 000 ₽GeekBrains
PHP программист
19 июня 202148 000 ₽GeekBrains

Лучшие публикации за сутки