Libera uma porta de propriedade de um aplicativo de terceiros?

1

Fui consultado sobre qualquer maneira de liberar uma porta de propriedade de um aplicativo de terceiros que esteja ouvindo. Digamos que o aplicativo use soquetes e esteja atendendo a uma porta específica que a raiz agora deseja reivindicar sem fechar o aplicativo. Eu fui incapaz de dar uma resposta.

Existe alguma maneira de fechar o identificador para a porta do terminal ou com uma API específica (digamos que o root pode gravar e executar o C ++) que pode realizar isso?

    
por Theraot 08.01.2011 / 10:55

1 resposta

5

Não há uma maneira limpa de fechar um arquivo aberto (porta de rede ou outro) em um aplicativo que não o espera.

Existe uma maneira de fechar o arquivo sob seu nariz, mas o aplicativo pode não reagir bem. Há uma boa chance de que isso colida, o que derrotaria o propósito. Você pode executar uma chamada do sistema em um processo remoto com a ptrace chamada do sistema. Use lsof ou netstat para encontrar o descritor de arquivo no qual você está interessado. Em seguida, anexe seu depurador favorito ao processo em questão e execute uma chamada de sistema close (ou shutdown ).

#!/bin/sh
# Usage: shutdown-in-process PID FD
gdb -n -pid "$1" -batch -x /dev/stdin <<EOF
call close($2)
detach
quit
EOF

Como isso tem uma boa chance de travar o aplicativo, porque sua interface com o ambiente não corresponderá mais à sua estrutura de dados interna, considere outras abordagens. Em particular, se o propósito é ter uma aplicação diferente ouvindo em uma porta UDP ou TCP, você poderia redirecionar o tráfego para uma porta diferente no nível da camada de rede ( iptables no Linux, pfctl no BSD,…) .

    
por 08.01.2011 / 13:59