Слайд 1Защита и возможности…
…несанкционированного доступа
Ползет по улице в дымину пьяный хакер.
Еле руки и ноги передвигает. А навстречу
ему другой, трезвый:
- Слушай, Вась, ты чего? Ведь ты же неделю
назад закодировался?
- Ага! - Ик! - А я - Ик! - в-вчера к-к-код подобрал...
Слайд 2Предположим, что программа защищена некоторым кодом (серийным номером, паролем), который сообщается
пользователю после соблюдения им определенных условий. До регистрации в этой программе заблокирован ряд каких либо полезных функций, используется надоедливая реклама или ограничен строк работы. После ввода этого кода производится его проверка и при положительном исходе проверки программа начинает нормально работать.
Слайд 3По неизвестной причине в большинстве современных программ данная защита сделана однообразно
и для ее снятия необходимо 10-15 минут.
Надо заранее оговориться - хорошему хакеру противостоять практически бесполезно, да и не нужно - при желании любая защита может быть взломана, это всего лишь вопрос времени.
Слайд 4Инструментарий хакера
Современный хакер имеет в своем арсенале набор разнообразных утилит
для взлома. Их можно подразделить на несколько категорий:
Отладчики.
Дизассемблеры.
Средства мониторинга.
Средства пассивного анализа программы.
Прочие утилиты.
Слайд 5Отладчики
Позволяют прерывать выполнение программы при достижении заранее заданных условий, производить пошаговое
выполнение программы, изменять содержимое памяти и регистров и т.п. .
Наиболее популярным, удобным и мощным является отладчик SoftICE, который при достаточно примитивном интерфейсе обладает приличными возможностями и весьма стабильно работает.
Слайд 6Дизассемблеры
Производят дизассемблирование программы для дальнейшего изучения полученного кода. Один из наиболее
популярных - IDA. Он находится www.datarescue.com/ida.htm и далеко не бесплатный
www.csee.uq.edu.au/csm/decompilation/disasm.html собраны разные программы этого же класса
www.eccentrica.org/Mammon/disasm.html есть еще ссылки на утилиты редактирования бинарных файлов
Слайд 7Средства мониторинга
Это набор утилит, отслеживающих операции с файлами, реестром, портами и
сетью.
Средства пассивного анализа программы.
Показывают разную информацию о программе - извлекают ресурсы, показывают связи, используемые библиотеки.
Классический пример - утилита DEPENDS.EXE из комплекта Visual Studio. Она показывает, какие библиотеки используются программой и какие функции импортируются
Слайд 8Прочие утилиты
Их великое множество (можно найти на диске типа "Все для
хакера", причем в изобилии). Это разнообразные редакторы, анализаторы ...
Слайд 9Средства мониторинга
FileMon
- утилита, позволяющая вести мониторинг всех операций с файлами. Имеет
удобный фильтр, может сохранять отчет в файле. Поэтому нет смысла делать "секретные" файлы где-нибудь в Windows/System - их элементарно найти.
Утилиты типа FileMon могут резко упростить взлом программы - легко определить место, в котором программа обращается к указанному файлу или ключу реестра.
показывает детальную информацию обо всех обращениях к файловой системе; имеется возможность устанавливать различные фильтры и даже отслеживать работу со swap-файлом
Слайд 10Средства мониторинга
RegMon
- аналог FileMon, только ведется мониторинг всех операций с
реестром. Аналогично файлам, бессмысленно создавать в реестре "секретные" ключи - они сразу бросаются в глаза.
PortMon
- мониторинг работы с портами ввода/вывода
TCP_VIEW
- монитор соединений по TCP-IP
RegUtils
- набор утилит для контроля за реестром - делает копии реестра, позволяет сравнивать копии и просматривать изменения.
Слайд 11Основы построения защиты –
- шаг за шагом
Набор этих действий стандартен.
Они описаны в подробных руководствах типа "Взлом Windows программ - шаг за шагом", ориентированных, однако, на продвинутого пользователя.
Слайд 12Ввести регистрационный код.
Ввод пароля или регистрационного номера является ответственным делом
– здесь просто «отловить» адрес памяти, в который будет записан пароль.
Затем на обращение по этому адресу ставится точка останова (команда BPM в SoftICE), что позволяет поймать начало процедуры проверки регистрационного кода.
Слайд 13Если для ввода используются стандартные элементы ввода Windows, то алгоритм действий
хакера можно формализовать и тогда он выглядит примерно так:
Устанавливается точка останова на считывание текста из стандартного элемента ввода (функции GetWindowText, GetGlgItemText модуля KERNEL32)
При вызове этой функции анализируются ее параметры и таким образом определяются, по какому адресу будет размещено считываемое значение
После этого надо поставить в обращении к этой области памяти точку останова (в достоверности определенного адреса легко убедиться - после выполнения функции там появится введенная строка)
При срабатывании этой точки останова
либо попадаем в анализатор введенного значения
либо делаем генератор регистрационных ключей,
либо ломаем процедуру проверки.
Все эти действия доступны при знании ассемблер и API
Слайд 14Как можно меньше применять стандартные функции (особенно API-шные) и компоненты VCL.
Так что Assembler, Assembler и еще раз Assembler ...
Сущность этого совета очевидна
современные дизассемблеры умеют распознавать стандартные процедуры высокоуровневых языков,
API - вообще отдельный разговор
- SoftICE обладает изумительной возможностью - загружать символьные имена для любых указанных библиотек (особенно для KERNEL32.DLL) - отладка резко упрощается, т.к. имена вызываемых функций видны и можно просто ставить точки останова на вызов функций по их имени.
Несколько простых решений
Слайд 15Несколько простых решений
Применять нестандартный способ ввода пароля.
Наипростейший путь - написать
свой визуальный компонент для ввода регистрационного кода. Он конечно должен будет обрабатывать события от клавиатуры, но момент считывания кода нельзя поймать избитыми методами.
Однако, следует помнить, что есть второй способ взлома, основанный на поиске введенного кода в памяти. Для этого в SoftICE есть удобная команда "S стартовый адрес L длина 'образец'" , которая позволяет найти введенное значение в памяти.
Слайд 16Несколько простых решений
Не храните введенный код в одном месте !
Не
храните введенный код открытым текстом !
Слайд 17Несколько простых решений
Введение кода
Для начала необходимо завести в программе 5-10 переменных
типа STRING и после ввода кода переписать введенное значение в них.
Делать это лучше всего не в одном месте, а распределить по программе. Таким образом поиск даст кучу адресов, по которым будет находиться введенный код.
Одно из возможных решений - по таймеру создать в динамической памяти новую строковую переменную, записать в нее код. Затем на следующем срабатывании таймера создать новую переменную, переписать в нее код, а старую уничтожить.
Слайд 18При определенном навыке можно заполонить память значениями введенного кода и сделать
поиск почти бесполезным. Причем такое копирование можно совместить с проверкой кода или эмуляцией этой проверки. Затем с эти строками неплохо поделать какие-либо операции - сравнить с чем-нибудь ...
Можно просто создать свой компонент, который позволит вводить код нестандартным способом с его одновременной шифровкой.
Слайд 19
Анализ регистрационного кода
Ни в коем случае нельзя анализировать код сразу после
его ввода.
Чем дальше ввод кода от его анализа, тем лучше.
Самое разумное - после ввода кода поблагодарить пользователя за сотрудничество и сообщить, что со временем будет выполнена регистрация программы.
А анализ кода произвести, например, через 1-2 минуты в совершенно другом месте программы.
Слайд 20
Не проверяйте код только в одном месте и не пишите для
проверки функцию. Достаточно найти и отключить эту проверку, и защита взломана.
Если проверок несколько, они разные и распределены по программе, то взлом затрудняется.
Слайд 21Нельзя проверять пароль одним алгоритмом. Рекомендуется разработать 2-3 алгоритма проверки, например
1-2 цифры должны делиться на 3, а 3-7 наложенные по какому-либо алгоритму на имя пользователя должны дать в сумме 4.
Все проверки надо проводить в различных местах с достаточно большим временным разносом - взломав первый метод хакер не будет догадываться о существовании еще нескольких, которые проявятся со временем.
Слайд 22Наилучший шаг - выждать день – два или хотя бы минут
15.
Все действия по проверке следует как можно дальше отнести от выдачи сообщений и прочих действий, предпринимаемых при обнаружении неправильного кода.
Слайд 23Отвлекающий маневр
Кроме реальных функций проверки кода можно сделать пару бутафорских, которые
будут вызываться после ввода кода, проводить активные манипуляции с введенным значением, выдавать сообщения о некорректности введенного кода ... - т.е. отвлекать внимание от реальной проверки.
Слайд 24Не храните результатов проверки на диске или в реестре
Нельзя хранить
результаты проверки в переменной и/или не использовать ее для явного ограничения функций незарегистрированной программы.
Классический пример нарушения этого правила
if not(LegalCopy) then
ShowMessage ('Сохранение работает только в зарегистрированной версии')
else
SaveFile;
Слайд 25взлом в данном варианте сводится к тому, что функция проверки кода
урезается до двух команд ассемблера:
MOV [адрес LegalCopy], 1
RET
Слайд 26Типичная ошибка
После выяснения, что копия зарегистрирована, делается где-нибудь метка.
Отловить
это достаточно просто при помощи стандартных REGMON и FILEMON.
Наилучший способ - сохранить пароль и имя пользователя в том виде, в котором он их ввел. Затем при каждом запуске программы проверять корректность этого кода, не забывая о взломщиках!
Слайд 27Ничего не проверяйте сразу при запуске приложения или сразу после считывания
сохраненного имени или кода. П
Следует всегда помнить, что считывание кода и его ввод в окне регистрации идентичны по мерам защиты - дублирование в разных областях памяти, шифрование ...
Слайд 28Общие советы по защите программ
CRC - контрольные суммы. Любой файл,
строку или блок данных можно защитить контрольной суммой, которую затем можно рассчитать и сравнить с эталоном. При сравнении с эталоном конечно следует вести очень осторожно
Слайд 29Общие советы по защите программ
Защищайте программы и данные контрольными суммами.
Это поможет не только от взлома, но и защитит программы от вируса или внедрения троянца.
Слайд 30Общие советы по защите программ
Применяйте шифровку программ и данных.
Очень
неплохо сжать программу и данные. Можно, например, разработать свой собственный архиватор.
Пусть - RAR-у и ZIP-у он конкуренции не составит, но сжатые им данные разжать будет очень непросто, придется изрядно повозиться. Да и изменить их будет тоже проблематично - придется разжать, изменить и сжать.
А можно просто использовать давно забытые архиваторы, типа PcLithe…
Слайд 31Отлов пошаговой отладки программы
Самый простой и надежный способ - таймер.
При работе программы периодически надо фиксировать системное время, чтобы потом рассчитать время работы фрагментов кода между ними. И если, например, 200-400 команд процессора работают 2-3 минуты, то тут есть над чем задуматься.
Никогда нельзя определять дату и время стандартными способом !! Надо обязательно придумать что-нибудь оригинальное.
Слайд 32Советы по созданию меток для организации ограничения по времени
Слайд 33Защита "ограничение времени работы" состоит в том, что программа каким образом
фиксирует момент своего первого запуска и работает установленное время (обычно 20-30 дней). После истечения этого срока программа отказывается запускаться.
Дату в программу следует проверять нестандартным способом, например по дате на файлах реестра или свежесозданном своем файле.
Вопрос более сложный: как зафиксировать на компьютере дату первого запуска (естественно так, чтобы изничтожение программы и ее повторная установка не давали эффекта).
Слайд 34Использование "секретных" файлов в системных папках или изменения в существующих файлах
легко отловить при помощи FILEMON.
Реестр то же отпадает из-за REGMON.
Прочие методы (типа записи в ВООТ сектор ...) тоже неприемлемы
Слайд 35Можно, например, просто «прошить дату» в саму программу и постоянно обновлять
ее на своем сайте (естественно, автоматически). Таким образом отсчет неявно будет идти от момента скачивания программы с сайта.
Есть тут правда и минус - после завершения срока можно повторно скачать эту программу и получить еще 15-20 дней ... .
С другой стороны стоит помнить, что программу можно скачать несколько раз и сравнить варианты, выявив, где лежит дата.
Поэтому стоит позаботиться о том, чтобы изменился почти весь файл (например, изменить пару опций компилятора)
Слайд 36Советы по формированию регистрационных кодов
Формирование кодов может вестись по следующим
основным направлениям:
Жестко фиксированные коды, прошитые в программу. Их обычно немного, но их огласка сводит защиту к нулю.
Некий алгоритм проверки кода. Немного лучше первого, но лишь немного. Возьмите за пример код Windows - его знает любой пользователь
Алгоритм проверки кода, использующий имя пользователя. Очевидно, что для каждого имени будет уникальный номер (или номера - их может быть несколько, в зависимости от алгоритма). Это уже лучше, но нелегальное распространение держится на эгоизме зарегистрированных пользователей - ничто не мешает им предать имя/пароль огласке, но тогда хотя бы можно вычислить виновника и заблокировать его код
Слайд 37Советы по формированию регистрационных кодов
Алгоритм проверки кода, использующий имя пользователя
и некоторые уникальные или динамически изменяющиеся параметры, например информацию о компьютере.
Это надежно, дает привязку к компьютеру, но в наш век постоянных апгрейдов очень неудобен.
On-Line регистрация. Состоит в том, что программа в On-Line связывается с сайтом разработчиков (или компании, осуществляющей продужу софта) и передает туда ревизиты пользователя. В ответ программе передается регистрационная информация.
Этот метод может и хорош для ряда программ, но, однако, он не выдерживает никакой критики по двум соображениям:
Никто не может гарантировать, что конкретно передаст программа в Инет. А передать она может все, что угодно - параметры компьютера, пароли, любые данные и т.п.
Конкретный пользователь может не иметь доступа к Инет. Это особенно важно для программ, работа которых не связана напрямую с Сетью. И зарегистрировать такую программу его практически никто к себе на компьютер не пустит