Найти в Дзене
Fisk 365

Системные ловушки (HOOK)

Оглавление

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

  • Ловушка (hook) - это механизм Windows, позволяющий перехватывать события, предназначенные некоторому приложению, до того как эти события до этого приложения дойдут.
  • Функции-фильтры - это функции, получающие уведомления о произошедшем событии от ловушки.

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

Если надо отслеживать сообщения всех потоков, а не только текущего, то ловушка должна быть глобальной. В этом случае функция ловушки должна находиться в DLL.

Таким образом, задача разбивается на две части:

  1. Написание DLL c функциями ловушки (их будет две: одна для клавиатуры, другая для мыши).
  2. Написание приложения, которое установит ловушку.

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

В чем разница между ловушкой и прерыванием?

Это важная часть статьи потому, потому что большинство не понимают в чем разница.

Ловушка - представляет собой исключение в пользовательском процессе. Это вызвано делением на ноль или недопустимым доступом к памяти. Это также обычный способ вызвать подпрограмму ядра ( системный вызов ), потому что она выполняется с более высоким приоритетом, чем код пользователя. Обработка выполняется синхронно, поэтому код пользователя приостанавливается и продолжается после этого. В некотором смысле они «активны» - большую часть времени код ожидает, что ловушка произойдет, и полагается на этот факт.

Прерывания - являются генерируемыми аппаратными средствами (устройства , такие как жесткий диск, видеокарта, порты ввода / вывода, и т.д.). Они бывают асинхронными (т.е. они не происходят в предсказуемых местах пользовательского кода) или «пассивными», поскольку обработчик прерывания должен ждать, пока они в конечном итоге произойдут.

Вы также можете рассматривать ловушку как своего рода внутреннее прерывание ЦП, поскольку обработчик для обработчика прерывания выглядит как обработчик прерывания .

Ловушки, скорее всего, вызваны выполнением текущих инструкций, и поэтому ловушки также известны как синхронные события.

Системные вызовы-это еще один пример ловушки, когда программа просит операционную систему запросить определенную службу, а затем операционная система генерирует прерывание для доступа к службам для программы.

Где это может реально пригодиться?

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

• Контроль входящего http-траффика и подмена «взрослого» контента на более безобидный.
• Логирование информации в случае копирования каких-либо файлов с подконтрольной сетевой папки.
• Незначительная модификация кода в проекте, от которого были утеряны исходники (да, и такое тоже случается)

Вывод

Ловушка - это особый вид прерывания, который обычно называют программным прерыванием. Прерывание-это более общий термин, который охватывает как аппаратные прерывания, так и прерывания от программного обеспечения, такие как ловушки. В конце статьи стоит отметить важность затронутой темы, а также, надеюсь после прочтения у вас появилось представление и желание самим попробовать разработать свою системную ловушку и испытать её в деле. Наши статьи только поясняют тему в терминологическом виде, для дальнейшей вашей самостоятельности.