Телефон: 8-800-350-22-65
WhatsApp: 8-800-350-22-65
Telegram: sibac
Прием заявок круглосуточно
График работы офиса: с 9.00 до 18.00 Нск (5.00 - 14.00 Мск)

Статья опубликована в рамках: Научного журнала «Студенческий» № 20(106)

Рубрика журнала: Информационные технологии

Скачать книгу(-и): скачать журнал часть 1, скачать журнал часть 2, скачать журнал часть 3, скачать журнал часть 4, скачать журнал часть 5, скачать журнал часть 6

Библиографическое описание:
Правдивцев А.В. МЕТОДЫ И СРЕДСТВА ПЕРЕХВАТА API-ФУНКЦИЙ WIN32/64 // Студенческий: электрон. научн. журн. 2020. № 20(106). URL: https://sibac.info/journal/student/106/180601 (дата обращения: 29.03.2024).

МЕТОДЫ И СРЕДСТВА ПЕРЕХВАТА API-ФУНКЦИЙ WIN32/64

Правдивцев Артур Владиславович

студент, кафедра программного обеспечения и администрирования информационных систем, Курский государственный университет,

РФ, г. Курск

METHODS AND TOOLS FOR INTERCEPTING WIN32/64 API FUNCTIONS

 

Artur Pravdivtsev

student, Department of Software and Administration of Information Systems, Kursk State University,

Russia, Kursk

 

АННОТАЦИЯ

В данной статье рассматриваются методы реализации перехвата системных API-функций в 32-разрядных операционных системах Windows. Рассматриваются особенности реализации перехвата в Win9X (Windows 95/98/98SE/ME) и WinNT (Windows NT/2000/XP/2003).

ABSTRACT

This article discusses methods for implementing interception of system API functions in 32-bit Windows operating systems. Features of interception implementation in Win9X (Windows 95/98/98SE/ME) and WinNT (Windows NT/2000/XP/2003) are considered.

 

Ключевые слова: функции; методы; перехват; системы; гигабайты; процессоры; приложения.

Keywords: functions; methods; interception; systems; gigabytes; processors; applications.

 

Перехват системных функций операционной системы — это метод, известный уже давно. Обычно какая-то системная функция перехватывается для того, чтобы отслеживать или изменять ее поведение. В операционных системах Windows никогда не было встроенных инструментов, специально предназначенных для перехвата системных функций. И понятно почему – в конце концов, это своего рода хакерский трюк. Поэтому перехват обычно осуществляется "подручными средствами", и для его осуществления необходимо четко понимать многие глубинные аспекты устройства и работы операционной системы.

Адресное пространство любого процесса в Win9Х можно разделить на три раздела: [2]

Два нижних гигабайта (00400000-7FFFFFFF) — это код пользовательского режима и данные (в диапазоне 00000000-003FFFFF есть разделы для обнаружения нулевых указателей и для совместимости с программами DOS и Win16); третий Гигабайт - для общих файлов, проецируемых в память (MMF) и системные библиотеки DLL. Четвертый гигабайт предназначен для кода режима ядра и данных (именно здесь находится ядро операционной системы и драйверы).

В WinNT процессы не имеют общих разделов, хотя системные библиотеки по-прежнему загружаются по одним и тем же адресам во всех процессах (но теперь в области кода и данных пользовательского режима). Запись в эту область разрешена, но образы системных библиотек имеют атрибут "копировать при записи" в памяти. По этой причине предпринимается попытка записи, например, в образ kernel32.dll это приведет к тому, что процесс будет иметь свою собственную копию измененной страницы kernel32.dll, а остальные процессы никак не будут затронуты [3, c. 512].

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

Перехваты можно разделить на два типа: локальные (перехват в пределах одного процесса) и глобальные (в масштабах всей системы).

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

Были изучены и проанализированы два метода перехвата. Шприц работает путем модификации функции импорта записей (thunking table). С другой стороны, библиотека обходов непосредственно изменяет целевую функцию (в пространстве целевого процесса), чтобы сделать безусловный переход к функции замены. Опционально, он предоставляет функцию trampoline, которая может вызвать исходную функцию.

Метод объездов следует этому последнему методу, так как во многих случаях возникает проблема поиска глухарей, и он не обеспечивает возможности вызова исходной функции. Инъекция библиотеки DLL работает одинаково в обоих случаях. Модификация целевой функции — это самоизменяющийся код, который хорошо документирован на MSDN*, хотя есть несколько подводных камней при введении jmp в память процесса. Этот раздел показывает почти полный пример кода, чтобы избежать путаницы.

Два аспекта модификации целевой функции — это замена и функции батута. Следующий фрагмент кода является примером библиотеки DLL для перехвата GETSYSTEMPOWERSTATUS API.

Первое, что делает этот код после присоединения, — это вызов InterceptAPI. Для этого требуется имя модуля, содержащего целевую функцию, имя целевой функции и адрес функции замены. GetSystemPowerStatus находится в kernel32.dll. Другие основные API Win32*, такие как MessageBox и PeekMessage, доступны в user32.файл DLL. MSDN определяет модуль, к которому принадлежит каждый API; дальнейшее усовершенствование может автоматически найти правильный модуль для данного API. InterceptAPI перезаписывает первые пять байтов целевой функции в безусловный прыжок (код операции 0xE9), с последующим перемещением в функцию замещения в виде целого числа со знаком (четыре байта). Смещение начинается со следующей инструкции; следовательно, pbtargetcode - (pbTargetCode +4) является обязательным [4, c. 490].

Теперь, когда вызывается функция GetSystemPowerStatus, все, что она делает, это переходит к нашей функции замены, и она возвращается непосредственно к вызывающему объекту, успешно перехватывая вызов. Во многих случаях функция замены должна вызывать исходную целевую функцию в дополнение к своему собственному коду, чтобы расширить возможности API, а не заменять все это. Функция trampoline обеспечивает эту функциональность.

Еще одно осложнение заключается в том, что шестой байт исходного кода может быть частью предыдущей инструкции. В этом случае функция перезаписывает часть предыдущей инструкции, а затем аварийно завершает работу. В случае GetSystemPowerStatus, начало новой инструкции после первых пяти байтов является седьмым байтом. Таким образом, чтобы эта схема работала, шесть байтов должны быть скопированы на батут, и код должен соответствующим образом отрегулировать это смещение [1, c. 130].

Количество байтов, которое код должен скопировать, зависит от API. Необходимо посмотреть исходный целевой код (используя отладчик или дизассемблер) и cou nt количество байт для копирования. Будущее повышение может автоматически обнаружить правильное смещение. Предполагая, что мы знаем правильное смещение, следующий код показывает расширенную функцию InterceptAPI, которая также устанавливает функцию trampoline.

Итак, перехват API-вызовов – вещь, хотя и достаточно сложная, но все-таки реализуемая (причём различными способами). Методы перехвата различны и часто не переносимы из одной версии Windows в другую.

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

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

 

Список литературы:

  1. Бессмертный, И. А. Системы искусственного интеллекта: учеб. пособие для СПО / И. А. Бессмертный. — 2-е изд., испр. и доп. — М. : Издательство Юрайт, 2018. — 130 с.
  2. Методы перехвата API-вызовов в Win32 [электронный ресурс] URL: https://www.rsdn.org/article/baseserv/apicallsintercepting.xml (дата обращения 30.04.2020)
  3. Рихтер Программирование на платформе Microsoft. NET Framework / Рихтер, Джеффри. - М.: Русская Редакция, 2014. - 512 c.
  4. Скотт, Т. Основы программирования. Курс программированного обучения / Т. Скотт. - М.: Советское радио, 2016. - 490 c.

Оставить комментарий

Форма обратной связи о взаимодействии с сайтом
CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.