Введение
Техники изменения операционной системы В компьютерном программировании термин "привязка" охватывает ряд методов, используемых для изменения или расширения поведения операционной системы, приложений или других программных компонентов путем перехвата вызовов функций или сообщений или событий, передаваемых между компонентами программного обеспечения. Код, который обрабатывает такие перехваченные вызовы функций, события или сообщения, называется крюком. Методы крюка имеют особое значение в шаблоне методов шаблона, где общий код в абстрактном классе может быть дополнен пользовательским кодом в подклассе. В этом случае каждый метод крюка определяется в абстрактном классе с пустой реализацией, которая затем позволяет предоставлять другую реализацию в каждом конкретном подклассе. Крепление используется для многих целей, включая отладку и расширение функциональности. Примеры могут включать перехват сообщений событий клавиатуры или мыши до того, как они достигнут приложения, или перехват вызовов операционной системы для мониторинга поведения или изменения функции приложения или другого компонента. Он также широко используется в программах сравнительного анализа, например, для измерения частоты кадров в 3D-играх, где выход и вход выполняются через подключение. Крепление также может использоваться вредоносным кодом. Например, руткиты, части программного обеспечения, которые пытаются сделать себя невидимыми, подделывая выход вызовов API, которые в противном случае раскрыли бы их существование, часто используют методы подключения.
In computer programming, the term hooking covers a range of techniques used to alter or augment the behaviour of an operating system, of applications, or of other software components by intercepting function calls or messages or events passed between software components. Code that handles such intercepted function calls, events or messages is called a hook. Hook methods are of particular importance in the Template Method Pattern where common code in an abstract class can be augmented by custom code in a subclass. In this case each hook method is defined in the abstract class with an empty implementation which then allows a different implementation to be supplied in each concrete subclass. Hooking is used for many purposes, including debugging and extending functionality. Examples might include intercepting keyboard or mouse event messages before they reach an application, or intercepting operating system calls in order to monitor behavior or modify the function of an application or other component. It is also widely used in benchmarking programs, for example frame rate measuring in 3D games, where the output and input is done through hooking. Hooking can also be used by malicious code. For example, rootkits, pieces of software that try to make themselves invisible by faking the output of API calls that would otherwise reveal their existence, often use hooking techniques.
Методы
Как правило, крюки вставляются, когда программное обеспечение уже работает, но крюки - это тактика, которая также может быть использована до запуска приложения. Оба метода более подробно описаны ниже.
Изменение источника
Подключение может быть достигнуто путем модификации источника исполняемого файла или библиотеки до запуска приложения с помощью методов обратной инженерии. Это обычно используется для перехвата вызовов функций для мониторинга или их полной замены. Например, с помощью дезасмантажера можно найти точку входа функции в модуле. Затем его можно изменить, чтобы вместо этого динамически загрузить какой-либо другой модуль библиотеки, а затем заставить его выполнять желаемые методы в этой загруженной библиотеке. Если применимо, другой связанный подход, с помощью которого можно достичь подключения, заключается в изменении таблицы импорта исполняемого файла. Эта таблица может быть изменена для загрузки любых дополнительных модулей библиотеки, а также для изменения внешнего кода, который вызывается при вызове функции приложением. Альтернативный метод для достижения подключения функций заключается в перехвате вызовов функций через библиотеку оберток. Обложка - это версия библиотеки, которую загружает приложение, со всеми функциями оригинальной библиотеки, которую она заменит. То есть все доступные функции по существу одинаковы между оригиналом и заменой. Эта библиотека может быть разработана для вызова любой функциональности из оригинальной библиотеки или замены ее совершенно новым набором логики.
Изменение времени выполнения
Операционные системы и программное обеспечение могут обеспечить средства для легкого вставки крюков событий во время выполнения. Она доступна при условии, что процесс вставки крюка имеет достаточное разрешение на это. Например, Microsoft Windows позволяет пользователям вставлять крючки, которые могут использоваться для обработки или модификации системных событий и событий приложений для диалоговых панелей, полос прокрутки и меню, а также других элементов. Он также позволяет крюку вставлять, удалять, обрабатывать или изменять события клавиатуры и мыши. Linux предоставляет другой пример, где крюки могут использоваться аналогичным образом для обработки сетевых событий в ядре через NetFilter. Когда такая функциональность не предусмотрена, специальная форма подключения использует перехват вызовов библиотечных функций, сделанных процессом. Привязка функций осуществляется путем изменения первых нескольких кодовых инструкций целевой функции для перехода к встроенному коду. В качестве альтернативы в системах, использующих концепцию общей библиотеки, таблица векторов прерывания или таблица дескрипторов импорта могут быть изменены в памяти. По сути, эти тактики используют те же идеи, что и модификация источника, но вместо этого изменяют инструкции и структуры, расположенные в памяти процесса, когда он уже работает.
Линукс
Студенческий исследовательский проект, который использует привязку. Функциональность, позволяющая программному обеспечению наблюдать и контролировать выполнение другого процесса. Использование LD PRELOAD для подключения общих вызовов в библиотеку.
Эмаки
Emacs Hooks Крюки - важный механизм для настройки Emacs. Крюк - это переменная Lisp, которая содержит список функций, которые должны быть вызваны в определенном случае. (Это называется "зацепиться за крючок").
OS X и iOS
Cydia Substrate - это фреймворк для устройств iOS с джейлбрейком, позволяющий разработчикам подключаться к любым другим фреймворкам или приложениям. harpoon - это библиотека OS X для подключения функций во время выполнения.
Глубокое подключение API
x86 API Hooking Demystified Статья о различных методах подключения API для архитектуры x86.