logo
PASOIB

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) на вход данных функций передается имя (либо дескритор) файла и информация о нем. Злоумышленник отловив данные функции может вычислить информацию о файлах, где хранится ключевая информация.