Приемы профессиональной работы в UNIX


ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ - часть 7


1 char id[] = "@(#) inuse v1.0 Disable terminal Author: Russ Sage";   3 #include 4 #include 5 #include   7 #define SSIZ 7 8 #define BSIZ 512 9 #define BELL "\07" 10 #define LF "\n"   12 main() 13 { 14 register int fd, sig, n; 15 char secret[SSIZ]; 16 char buf1[BSIZ], buf2[BSIZ]; 17 struct sgttyb sav_tty, chg_tty;   19 secret[0] = 's'; 20 secret[1] = 'e'; 21 secret[2] = 'c'; 22 secret[3] = 'r'; 23 secret[4] = 'e'; 24 secret[5] = 't'; 25 secret[6] = '\n';   27 buf1[0] = buf2[0] = '\0'; 28 if ((fd = open("/dev/tty",O_RDONLY)) == -1) 29 exit(1);   31 for (sig = 2; sig <= 15; sig++) 32 signal(sig, SIG_IGN);   34 if (gtty(0, &sav_tty)) 35 exit(2); 36 chg_tty = sav_tty; 37 chg_tty.sg_flags &= ~ECHO; 38 if (stty(0, &chg_tty)) 39 exit(3);   41 write(1,"Lock string: ",13); 42 read(fd, buf1, BSIZ); 43 write(1, LF, 1);   45 for (;;) { 46 n = read(fd, buf2, BSIZ); 47 buf2[n] = '\0';   49 if (strcmp(buf2, buf1) == 0) 50 break; 51 if (strcmp(buf2, secret) == 0) 52 break; 53 write(1, BELL, 1); 54 } 55 stty(0, &sav_tty); 56 close(fd); 57 }

ОПИСАНИЕ

Зачем нам нужна программа inuse (си)?

Версия inuse на языке Си работает почти так же, как и версия на языке shell. Основное отличие заключается в том, что командные файлы на языке shell пользуются командами раздела (1), в то время как программы на Си используют команды разделов (2) и (3).

Что делает программа inuse (си)?

Теоретические основы функционирования такие же, как и в shell-версии. Инициализируется секретный пароль (в данном случае применяется такой синтаксис, чтобы команда strings(1) не смогла посмотреть его в исполняемом модуле), перехватываются сигналы, читается пароль пользователя и начинается бесконечный цикл, который читает символы с клавиатуры. Как только на клавиатуре что-то набрано и нажата клавиша возврата каретки, входные данные сравниваются с двумя известными паролями. Если они соответствуют одному из паролей, программа переустанавливает терминал и завершается. Если совпадения не произошло, терминал выдает звуковой сигнал и снова читает клавиатуру.

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

ПОЯСНЕНИЯ




Начало  Назад  Вперед