Межпроцессный дубликат на Linux

Если это - замороженный X сессий, поразите ctrl+alt+f1 для получения до консоли. Войдите в систему и оттуда, выполнитесь /sbin/shutdown, /sbin/reboot или /sbin/shutdown -r now. В зависимости от полномочий Вы, возможно, должны снабдить префиксом эти команды sudo или сначала su стать корнем.

Можно также смочь уничтожить незаконный процесс. Выполненный ps aux перечислять все процессы и искать, которые используют много ЦП и/или памяти (третьи и четвертые столбцы). Использовать kill <pid>, где pid является числом во втором столбце ps вывод). Если это не уничтожает процесс, Вы, возможно, должны работать kill -9 <pid> сильно уничтожить его.

5
23.05.2017, 15:40
2 ответа

Это дизайном: совместное использование дескрипторов файлов с другими процессами является явным. По умолчанию дескрипторы файлов являются столь же частными как собственная память процесса.

Как обычно, если Вы имеете право на ptrace процесс, можно сделать что-либо, что Вы любите, включая то, чтобы заставлять это звонить sendmsg. Традиционно, вызов ptrace требует выполнения как того же идентификатора пользователя; ограничения безопасности, такие как SELinux, возможности, тюрьмы и так далее могут сделать ptrace более строгий. Например, в соответствии с конфигурацией Ubuntu по умолчанию, некорневой процесс может только звонить ptrace на его собственных потомках (через AppArmor).

Используя ptrace надежно немного хитро: необходимо ввести правильные данные, удостоверьтесь, что не перезаписали что-либо и вымылись после себя. Таким образом, моя рекомендация состоит в том, чтобы ввести код окольным способом и триггер, которые кодируют с существующим инструментом.

Запишите небольшую общую библиотеку, содержащую sendmsg код, и LD_PRELOAD это к другому процессу. Вот некоторый непротестированный скелетный код с пропавшими без вести проверки ошибок.

int pts_gift_fd (char *path, int fd) {
    int sock;
    struct sockaddr_un addr = {0};
    struct msghdr msg = {0};
    struct iovec iov = {0};
    addr.sun_family = AF_UNIX;
    strlcpy(addr.sun_path, path, sizeof(addr.sun_path));
    /* Populate msg, iov as in the code you've already found */
    sock = socket(AF_UNIX, SOCK_STREAM, 0);
    connect(sock, (struct sockaddr*)&addr, sizeof(addr));
    sendmsg(sock, &msg, 0);
    close(sock);
}

Затем для инициирования кода работать gdb -n -pid 13115 -batch -x /dev/stdin с popen и подайте его вход как это (где %d fd, который Вы хотите получить, и %s путь к сокету Unix, который Вы ранее создали и слушаете на):

call pts_gift_fd("%s", %d)
detach
quit
4
27.01.2020, 20:37

Вы не можете сделать этого по той же причине, Вы не можете получить доступ к памяти несвязанного процесса, потому что дескриптор файла является частью памяти другого процесса. Единственной причиной там является информация о материале как это в /proc то, потому что ядро обеспечивает его там, и это только для чтения (таким образом существуют средства исследовать копию памяти процесса).

Если это касается файла, можно, конечно, попытаться получить доступ к файлу. Если это - сокет, Вы могли бы шпионить на нем с помощью libpcap, или что-то произошло из него.

Ситуация - в основном это: дескриптор файла является (снова) частью памяти процесса. Дескриптор имеет базовый буфер, который существует в пространстве ядра; когда процесс читает или записи в дескриптор, он пишет в и от этого буфера. Для выхода данных ядро промывает буфер (к аппаратным средствам) соответственно; для входящих данных это снова наполняет буфер (от аппаратных средств), когда процесс освобождает его. Те буферы не, AFAIK, доступный для других процессов, хотя существуют некоторые средства (например, libpcap) чтения данных в некоторой форме, определенной конкретным интерфейсом ядра, так же, как интерфейс proc может обеспечить некоторые данные из памяти пространства пользователя процесса.

4
27.01.2020, 20:37
  • 1
    Спасибо за создание Вашего ответа. То, что Вы говорите (Вы не можете получить доступ к памяти несвязанного процесса), неправильно, потому что ptrace (2) может сделать это. Вы уверены, что то, в чем я нуждаюсь, не может быть сделано? Если так, каково Ваше выравнивание? stackoverflow.com/questions/11214066 / …? компиляция –  pts 04.05.2013, 16:16
  • 2
    @pts я вполне уверен, но у меня нет достаточного детализированного знания ядра для доказательства его окончательно. Я добавил абзац, обрисовывающий в общих чертах мое обоснование. "Памятью доступа" я имел в виду непосредственно - ptrace, использует интерфейс ядра для получения копии данных. –  goldilocks 04.05.2013, 16:46
  • 3
    Спасибо за разъяснение. К вашему сведению я не могу дать +1 Вашему ответу, потому что начало (Вы не можете получить доступ к памяти несвязанного процесса), является все еще неправильным, потому что ptrace (2) может сделать это. Вы являетесь также неправильными о записи памяти другого процесса: /proc/13115/mem перезаписываемо, и это влияет на другой процесс. Мне не удается видеть, почему Ваше объяснение о буферах делает сокет невозможным копировать: на самом деле, sendmsg (2) может сделать это с помощью SCM_RIGHTS, также это дублировано после ветвления (2). –  pts 04.05.2013, 16:52
  • 4
    @pts корректен: процесс не может получить доступ к памяти другого процесса. Процесс может заставить ядро получить доступ к памяти другого процесса от своего лица, с ptrace. Доступ к другому процессу /proc/$pid/mem требует установки с ptrace сначала. –  Gilles 'SO- stop being evil' 04.05.2013, 17:11
  • 5
    @pts Используя /proc/$pid/mem хитро — видят, Как я читаю из/proc/$pid/mem в соответствии с Linux?. Это не самый легкий способ сделать то, что Вы хотите все же. –  Gilles 'SO- stop being evil' 05.05.2013, 21:28

Теги

Похожие вопросы