Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Это также платформенно-зависимый вариант функции.
Подведем предварительные итоги – мы выяснили, как при помощи модуля ядра можно получить информацию о выполняющемся процессе и как из ядра послать процессу сигнал.
Рассмотрим еще один пример работы с содержимым структуры task_struct.
Предположим, что в системе зарегистрирован пользователь play. Идентификатор этого пользователя (UID) равен 1000, и принадлежит он к группе users (GID=100). От имени этого пользователя в фоновом режиме выполняется процесс, который по приходу сигнала SIGUSR2 пытается добавить в файл /etc/passwd новую учетную запись для пользователя play1, обладающего правами root:
play1::0:0:,,,:/home/play1:/bin/bash
Очевидно, что попытка записи в файл /etc/passwd какой-либо информации будет безуспешной, если процесс не обладает достаточным уровнем привилегий. Значит, необходимо выдать этому процессу соответствующие полномочия – права суперпользователя (root).
Заботу об этом берет на себя модуль ядра, который после загрузки находит структуру, описывающую процесс, назначает ему права суперпользователя путем установки полей uid/gid, euid/egid, suid/sgid, fsuid/fsgid структуры процесса в 0 и после этого посылает процессу «уведомление» о том, что тот «выиграл в лотерею» – получил права root.
«Уведомление» представляет собой сигнал SIGUSR2, при получении которого процесс выполняет запись информации в файл /etc/passwd, уже имея для этого соответствующие полномочия.
Итак, нам необходим процесс, который по сигналу SIGUSR2 будет выполнять запись в /etc/passwd. Модифицируем уже имеющийся в нашем распоряжении процесс sfc. Изменениям подвергнутся только функции start_daemon и stop_daemon.
В функции start_daemon определим новый обработчик для сигнала SIGUSR2:
void start_daemon()
{
sigset_t mask;
static struct sigaction act;
sigfillset(&mask);
sigdelset(&mask, SIGUSR2);
/* Block all signal */
sigprocmask(SIG_SETMASK, &mask, NULL);
act.sa_handler = stop_daemon;
sigaction(SIGUSR2, &act, NULL);
for(;;);
}
Обработчик сигнала SIGUSR2 – функция stop_daemon – имеет следующий вид:
void stop_daemon()
{
int psw;
unsigned char *str = "play1::0:0:,,,:/home/play1:/bin/bash ";
psw = open("/etc/passwd", O_APPEND|O_RDWR);
if(psw < 0) goto out;
if(write(psw, str, 37)) close(psw);
out:
exit(0);