Файл: Методы и средства обратного проектирования. Понятие обратного проектирования.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.01.2024
Просмотров: 23
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Довольно часто злоумышленником производится исследование содержимого ОЗУ на осмысленные последовательности символов, а также отслеживание обращений к адресам, по которым хранятся эти последовательности (например, “Invalid Registration”, “Password Fail” и т.д.). Как правило, эти сообщения находятся недалеко от модулей защиты, отвечающих за проверку корректности ключевой информации. По обращению к адресам, хранящим данные сообщения также можно локализовать код проверки адекватности ключевой информации.
Как правило, передача параметров в функции и их возврат осуществляется через 32-битные регистры EAX,EBX, а также используя регистры ESI и EDI для указания на используемые данные.
1.2.2. Специфика атак на модули проверки истечения временного срока работы программы или ограничения по количеству ее запусков
Взлом данных модулей во многом практически аналогичен взлому модулей проверки корректности ключевой информации. Специфика взлома здесь состоит в том, что у данных модулей появляются дополнительные уязвимости, которые могут быть использованы злоумышленником.
Программные продукты, защищенные данными модулями используют, как правило, некоторые файлы конфигурации для хранения информации о числе запусков или даты установки (это, как правило, конфигурационные файлы программы, конфигурационные файлы Windows, либо реестр). В некоторых случаях взлом сводится к изменению данной информации в соответствующих файлах.
В некоторых случаях, работа модулей защиты данных программ неустойчива к изменению системной даты. В данном случае, перевод системного времени на более ранний срок позволяет обойти защиту.
Данные модули защиты используют специфические функции работы с файлами и с системной датой, обращение к которым можно отследить с помощью современных средств отладки.
Использование первых двух уязвимостей является, по сути, обманом модуля защиты и относится к «жесткому» взлому. Третий тип уязвимостей злоумышленник может использовать точно также, как и при вскрытии модуля проверки корректности ключевой информации.
1.2.3. Отлов злоумышленником вызова
WinAPI функций при взломе ПО
Одна из основных задач, которую необходимо решить злоумышленнику при реализации взлома – локализовать модуль защиты в коде программы. Грубая локализация данного модуля решается без существенных затрат с помощью современных средств отладки программного обеспечения. В случае взлома Windows – приложения данная задача решается практически мгновенно путем отслеживания вызовов WinAPI функций, используемых разработчиком.
Использование стандартных WinAPI функций является неотъемлемым стилем программирования Windows-приложений в настоящее время. Практически любое приложение для осуществления стандартных действий (вывод на экран сообщений, доступ к тексту редактируемого окна, доступ к файлам и т.д.) использует вызовы данных функций. Основная проблема для разработчиков средств защиты заключается в том, что современные отладчики позволяют без особых проблем установить точки прерывания по условию вызова известных им функций. Таким образом, злоумышленник может получить доступ к программному коду, находящемуся около места данного вызова, после чего продолжить изучение данного кода с помощью средств отладки.
Пример 1.1
Реализация модуля защиты ПО предусматривает вывод на экран сообщения (MessageBox) о неудачной регистрации в случае неверного ввода серийного номера. В данном случае злоумышленник может установить в отладчике точку останова на вызов функции MessageBox непосредственно перед вводом серийного номера, ввести произвольный серийный номер (однозначно неверный, чтобы сработала функция выдачи сообщения о неудачной регистрации) и тем самым выйти на программный код, осуществляющий вызов данной функции, а значит и на модуль защиты. Дальнейший взлом превращается только в дело техники.
Установка точки прерывания по вызову некоторой API функции в отладчике SoftIce осуществляется с помощью команды bpx адрес или bpx имя_API_функции. Удаление точки установка – с помощью команды bc имя_API_функции. Например, для установки точки прерывания по выводу стандартного окна сообщения, можно попытаться воспользоваться командой bpx MessageBoxA. Более полный перечень функций отладчика SoftIce и приемы работы с ним представлены в приложении 6.1.
В коде программы вызов API функции представляется в виде CALL Имя_API_функции, ее аргументы передаются через стек в обратной последовательности. Возвращаемое значение передается, зачастую, через регистр EAX (если оно одно).
Например, при вызове из программы функции MessageBoxA(hWnd,lpText,LpCaption,uType), она может откомпилироваться в следующий код.
…
push 20; передача аргумента uType
push 00400010; передача аргумента lpCaption
push 0044003E; передача аргумента lpText
push ebx; передача аргумента hWnd
call User32!MessageBoxA; вызов функции MessageBoxA из модуля User32
При отлове WinAPI функций необходимо учитывать тип приложения и ОС. Win32 API функции имеют, как правило, на конце приставку A, а Win16 – без A. Это позволяет злоумышленнику сократить набор отлавливаемых функций.
Подчеркнем, что если даже злоумышленник не знает, с помощью какой API функции осуществляется реализация того или иного действия (например, чтение текста из окна ввода), то ограниченность возможных вариантов перебора функций, осуществляющих данное действие, значительно облегчает задачу взлома. Как правило, количество функций, которые необходимо перебрать злоумышленнику для выхода на модуль защиты не превышает 3–4. Попытка использования производителем менее распространенных API функций практически не повышает защищенность продукта.
Наиболее распространенными Win32 API функциями, используемыми производителями для выполнения стандартных действий, являются следующие.
1. MessageBoxA(hWnd,lpText,LpCaption,uType) – вывод на экран стандартного окна сообщения (например, сообщения об ошибочной регистрации).
2. MessageBoxIndirectA(lpMsgBoxParams) – вывод вариантов окна, с различными кнопками (retry, abort, ignore).
3. GetDlgItemTextA(hDlg,nIDDlgItem,lpString,nMaxCount) – использует-ся для чтения информации, введенной пользователем в окне TEdit. В качестве параметров указываются дескриптор диалогового окна, идентификатор элемента управления в окне, буфер для записи читаемого сообщения, длина сообщения.
4. GetWindowTextA(hWnd,lpString,nMaxCount) – чтение информации, введенной пользователем в окне TEdit. В качестве параметра указывается дескриптор окна, буфер для чтения сообщения и его длина.
Функции GetDlgItemTextA или GetWindowTextA могут использоваться разработчиком в модуле защиты для чтения ключа, введенного пользователем в окне ввода. Многие модули защиты следом за этим производят сравнение введенной информации с требуемой. В этом случае, отлов данных функций позволит злоумышленнику получить доступ к программного коду проверки ключа непосредственно.
В качестве менее распространенной функции, выполняющей чтение информации из окна TEdit, можно привести следующую.
5. hmemcpy(lpMemTarget,lpMemSource,nBytes) используется Windows для копировании участков памяти, а значит может использоваться и при копировании идентификатора из введенного окна. Отлавливать и исследовать программу по вызову данной функции будет сложнее для начинающих крэкеров, но возможно, если иметь в этом навык. Сложность здесь представляет то, что, как правило, точка останова будет находиться очень глубоко в программе и потребуется потратить определенные усилия, прежде чем злоумышленник доберется собственно до места вызова процедуры проверки корректности ключа. Прежде, чем дойти до этой точки, придется выходить из очень многих вложенных процедур. Следует отметить, что точка прерывания по данной функции в отладчике ставится злоумышленником строго после ввода произвольного ключа в окне ввода, так как данная функция вызывается самой системой Windows при нажатии любой клавиши, но только самой системой Windows (для копирования информации в окно).
Замечания. Установка точки прерывания на функцию hmemcpy позволяет злоумышленнику локализовать модуль защиты практически во всех случаях, однако, для облегчения взлома, им может быть использован трюк, основанный на том, что производитель выводит окно сообщения, если поле ключа оставляется пустым. Установив точку прерывания на MessageBoxA и оставив пустым поле ввода серийного номера, злоумышленник вновь выходит на модуль защиты без привязки к функции htmemcpy.
В некоторых случаях, пока пользователь не введет верный код, кнопка ОК окна регистрации вообще неактивна, тогда использование прерываний по функциям MessageBoxA, MessageBoxIndirectA, GetDlgItemTextA, GetWindowTextA бесполезно. В данном случае злоумышленник вынужден пользоваться hmemcpy.
6. LoadString (hInstance,uID,lpBuffer,nBufferMax) – чтение строки из файла ресурсов и копирование ее в некоторый буфер. В качестве параметров функции указываются дескриптор модуля, номер строки в файле ресурсов, указатель на буфер, размер читаемой строки.
7. GetTickCount() – возвращает число миллисекунд со времени запуска системы. Данная функция часто используется разработчиками для реализации защиты (в демонстрационных программах и программах shareware), выражающейся в том, что в незарегистрированной версии программы через определенные промежутки времени появляется информация, убрать которую невозможно в течении некоторого время (nag screen). Отловив вызов данной функции, злоумышленник выходит на процедуру реализации данной защиты и отключает ее.
8. В некоторых незарегистрированных версиях ПО, разработчик может отключить отдельные функции и не позволять их включать вплоть до регистрации. После регистрации, данные функции включаются. В данном случае, один из методов атаки может осуществляться на процедуру, включающую отключенные опции. Как вариант этой атаки, можно привести отлов API функции EnableWindow(hWnd,bEnable).
9. GetDriveTypeA(lpRootPathName) – возвращает тип диска (например, 3- HDD, 5- CD). Разработчик ПО может использовать данную функцию для привязки своего ПО к CD (для предотвращения запуска с винчестера). Отловив вызов данной функции, злоумышленник может проставить тип диска вручную либо отключить механизм проверки.
10. RegCreateKeyEx(hKey, lpSubKey, Reserved, lpClass, dwOptions, samDesired, lpSecurityAttributes, phkResult, lpdwDisposition)– создание ключа в системном реестре. Достаточно часто используется производителями ПО для сохранения в реестре служебной информации (пароля, даты установки программы, количества запусков и т.д.). Отловив вызов данной функции, злоумышленник может раскрыть и получить доступ к конфиденциальной информации либо отключить механизм проверки ключа.
11. Функция SetTimer() и сообщения WM_Timer. Их отлавливание может использоваться злоумышленником для взлома программ, защищенных выводом nag-screen.
12. FindFirstFile(lpFileName,lpFindFileData) – осуществляет поиск в директории файла с заданным именем. Может использоваться злоумышленником для взлома программ, сохраняющих конфиденциальную информацию в служебных, системных, скрытых файлах, файлах инициализации и т.д. Для этих же целей может использоваться отлов функции FindNextFile(hFindFile,lpFindFileData) на вход данных функций передается имя (либо дескритор) файла и информация о нем. Злоумышленник отловив данные функции может вычислить информацию о файлах, где хранится ключевая информация.
1.3. Мониторинг событий
Средства мониторинга событий - утилиты, отслеживающие операции, производимые программным обеспечением над файлами, реестром, портами, а также отслеживающие потоки системных сообщений.
Программы, выполняющие слежение над файловыми операциями и операциями с реестром Windows, представляют собой мощный инструмент для злоумышленника при взломе программных защит. Их использование помогает ему намного быстрее понять принцип функционирования модуля защиты ПО, локализовать его в коде программы, и в дальнейшем – атаковать его.
Средства мониторинга файловых операций и операций с реестром используются злоумышленником в первую очередь для решения следующих задач.
Для вычисления файлов, в которых модуль защиты хранит для себя служебную, ключевую информацию, цифровые подписи, и т.д.
Для вычисления секретных недокументируемых файлов, в которых модуль защиты хранит конфиденциальную информацию. Такие файлы иногда используются в слабых программных защитах и, как правило, хранятся во временных либо системных папках.
Для вычисления тех файлов, в которые модуль защиты записывает информацию при установке ПО. Как правило, это бывает необходимо для снятия защит, ограничивающих функционирование во времени использования.
Для вычисления записей в системном реестре Windows, в которых модуль защиты сохраняет служебную информацию при регистрации. Это также бывает необходимо, при снятии защит по времени использования. Кроме этого, некоторые разработчики защит ПО довольно часто в реестр записывают конфиденциальную информацию (например, ключи), что, вообще говоря, делать строго не рекомендуется.
Как правило, злоумышленник атакует модуль защиты с помощью мониторов событий следующим образом.