Как закрыть сокетное соединение (ipv4 и ipv6) в Windows от какого-либо процесса?

1
задан jjxtra 11 April 2019 в 21:50
поделиться

2 ответа

Одним из способов может быть перечисление всех открытых дескрипторов в системе или, по крайней мере, открытых дескрипторов заданного целевого процесса, пока вы не найдете интересующий дескриптор SOCKET (см. HOWTO: Перечислить дескрипторы [ 118], Дескрипторы сокетов и C ++ Получить дескриптор открытых сокетов программы - хотя я не уверен, как вы сможете получить пары IP / порт для [ 111], чтобы сравнить с интересующим вас активным соединением, не вводя удаленные вызовы getsockname() / getpeername() в процесс владения SOCKET).

Как только вы нашли нужный дескриптор SOCKET, вы можете закрыть его, используя DuplicateHandle() с флагом DUPLICATE_CLOSE_SOURCE 1 .

1: так работает функция «Закрыть дескриптор» в Process Explorer.

0
ответ дан Remy Lebeau 11 April 2019 в 21:50
поделиться

Так как я использую C#, я не могу PInvoke SetTcpEntry, как раз когда администратор с app.manifest файлом, он всегда отправляет 317 ошибок. Таким образом, я создал C++ .exe для закрытия списка разделенных запятой значений адресов ipv4 на использовании командной строки SetTcpEntry, хорошо работает даже без app.manifest файла. Это решает удар ipv4 соединения.

я пытался использовать получить подход дескрипторов с NtQuerySystemInformation, но никогда не мог получать его работающий совершенно верно, и это - частный главным образом недокументированный API и кажется небезопасным использовать.

Так, для ipv6, я использую windivert и ввожу флаг RST к ipv6 пакетам с определенными IP-адресами. Это столь же просто как установка флага RST входящего пакета перед пересылкой его через с windivert.

, Возможно, когда-нибудь Microsoft добавит функцию SetTcpEntry6, но до тех пор это, кажется, единственный реалистический путь.

0
ответ дан jjxtra 16 April 2019 в 07:25
поделиться
Другие вопросы по тегам:

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