Почему я решил затронуть тему системных ловушек ? Это будет основной наш вопрос в течение всего времени этой статьи. Перед тем, как начать дискуссию по этому поводу надо пробежать по терминам.
- Ловушка (hook) - это механизм Windows, позволяющий перехватывать события, предназначенные некоторому приложению, до того как эти события до этого приложения дойдут.
- Функции-фильтры - это функции, получающие уведомления о произошедшем событии от ловушки.
После изучения терминов можно сделать вывод, что для обработки сообщений пишется специальная функция, получается что для начала срабатывания ловушки эту функцию следует специальным образом "подключить" к системе.
Если надо отслеживать сообщения всех потоков, а не только текущего, то ловушка должна быть глобальной. В этом случае функция ловушки должна находиться в DLL.
Таким образом, задача разбивается на две части:
- Написание DLL c функциями ловушки (их будет две: одна для клавиатуры, другая для мыши).
- Написание приложения, которое установит ловушку.
После все выше сказанного нам открываются заманчивые перспективы: мы можем перехватить вызов любой функции, подменить код на свой, тем самым изменив поведение любой программы на то, которое нам нужно (конечно, в рамках определенных ограничений).
В чем разница между ловушкой и прерыванием?
Это важная часть статьи потому, потому что большинство не понимают в чем разница.
Ловушка - представляет собой исключение в пользовательском процессе. Это вызвано делением на ноль или недопустимым доступом к памяти. Это также обычный способ вызвать подпрограмму ядра ( системный вызов ), потому что она выполняется с более высоким приоритетом, чем код пользователя. Обработка выполняется синхронно, поэтому код пользователя приостанавливается и продолжается после этого. В некотором смысле они «активны» - большую часть времени код ожидает, что ловушка произойдет, и полагается на этот факт.
Прерывания - являются генерируемыми аппаратными средствами (устройства , такие как жесткий диск, видеокарта, порты ввода / вывода, и т.д.). Они бывают асинхронными (т.е. они не происходят в предсказуемых местах пользовательского кода) или «пассивными», поскольку обработчик прерывания должен ждать, пока они в конечном итоге произойдут.
Вы также можете рассматривать ловушку как своего рода внутреннее прерывание ЦП, поскольку обработчик для обработчика прерывания выглядит как обработчик прерывания .
Ловушки, скорее всего, вызваны выполнением текущих инструкций, и поэтому ловушки также известны как синхронные события.
Системные вызовы-это еще один пример ловушки, когда программа просит операционную систему запросить определенную службу, а затем операционная система генерирует прерывание для доступа к службам для программы.
Где это может реально пригодиться?
Эти знания являются очень узкоспециализированными, и в повседневной практике разработки маловероятно, что они пригодятся, но знать о них, на мой взгляд, крайне желательно, даже если эти знания чисто теоретические. На моей практике же мне пригодились эти знания для решения следующих задач:
• Контроль входящего http-траффика и подмена «взрослого» контента на более безобидный.
• Логирование информации в случае копирования каких-либо файлов с подконтрольной сетевой папки.
• Незначительная модификация кода в проекте, от которого были утеряны исходники (да, и такое тоже случается)
Вывод
Ловушка - это особый вид прерывания, который обычно называют программным прерыванием. Прерывание-это более общий термин, который охватывает как аппаратные прерывания, так и прерывания от программного обеспечения, такие как ловушки. В конце статьи стоит отметить важность затронутой темы, а также, надеюсь после прочтения у вас появилось представление и желание самим попробовать разработать свою системную ловушку и испытать её в деле. Наши статьи только поясняют тему в терминологическом виде, для дальнейшей вашей самостоятельности.