Блокировка SIGINT от завершения программы - PullRequest
0 голосов
/ 24 января 2019

Мне нужна помощь по программе на C - это обратная оболочка (https://github.com/arturgontijo/remoteShell/blob/master/reverseShell.c) Я внес несколько изменений, например, поместил все в цикл и некоторую схему ожидания + поставил аргумент для прямой передачи IP и PORT сейчасэта штука работает очень хорошо, она стабильна (проблема, которая не может выполнить автозаполнение с помощью TAB, мне все равно) НО, что меня действительно волнует, так это то, что эта штука сломается, если на целевой машине я нажму CTRL + C программупросто завершается сам. Теперь я использовал этот пример, чтобы заблокировать CTRL + C вызовы:

/* Signal Handler for SIGINT */
void sigintHandler(int sig_num) 
{ 
    /* Reset handler to catch SIGINT next time. 
       Refer http://en.cppreference.com/w/c/program/signal */
    signal(SIGINT, sigintHandler); 
    printf("\n Cannot be terminated using Ctrl+C \n"); 
    fflush(stdout); 
} 

signal(SIGINT, sigintHandler); 

Я получил этот пример онлайн и также включил его в свой цикл, но все еще от нажатия клиента ctrl + C ломает программу. Интересно, dup2() отвечает за это или что-то еще, потому что на простой программе на Си это на самом деле работало нормально.

1 Ответ

0 голосов
/ 24 января 2019

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

Так что для вашего примера вы можете использовать:

#include <signal.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    sigset_t block_set;

    sigemptyset(&block_set);

    sigaddset(&block_set, SIGINT);

    sigprocmask(SIG_BLOCK, &block_set, NULL);

    while(1) {
        sleep(1);
    }
}

ВыполнениеПример: https://repl.it/repls/RelevantImaginarySearchservice

Вы можете разблокировать сигнал позже, позвонив по номеру

sigprocmask(SIG_UNBLOCK, &block_set, NULL);
...