2011-01-06 2 views
2

Недавно я начал работу над программой, которая будет отслеживать пакеты одной из моих программ с открытым исходным кодом, пытаясь узнать больше о программировании и создании сетей. Кроме того, я хочу добавить дополнительные функции в программу без редактирования источника, например, внешней панели управления.C# Поиск идентификатора сокета?

(Я использовал WPE Pro для фильтрации пакетов на случай, если вам интересно, WireShark слишком много хлопот для такой простой задачи.) Одна вещь беспокоит меня, однако, Socket ID.

Я знаю, что это такое, и я задал вопрос об этом раньше, но я не могу понять, как его использовать/назначить один/перехватить один.

Без правильного идентификатора гнезда моя программа не сможет ничего сделать, поэтому мой вопрос заключается в том, можно ли узнать, какой сокет использует сокет, как только вы захватите пакет?

Если нет, есть ли другие способы сделать? -или другие языки, такие как Visual Basic?

Спасибо за ваше время.

+0

Дубликат http://stackoverflow.com/questions/2742763/how-to-get-socket-id-handle-descriptor-for-an-already-open-connection-net-c – dzendras

+0

Ответ на ошибку , Не может получить Socket ID. Если я ошибаюсь, пожалуйста, поправьте меня в форме ответа, так как это то, что я ищу. – Nick

ответ

4

Если по идентификатору разъема вы имеете в виду возвращаемое значение успешного вызова функции socket(), я не думаю, что есть способ.

. Наиболее близким, что вы можете получить, является идентификатор процесса, поскольку, как вы уже знаете, каждый IP-пакет имеет назначение, которое описывается кортежем (IP-адрес, порт), и внутри системы может быть успешно привязан только один сокет к этому кортежу. Утилиты, такие как TCPView, могут отображать IP-кортеж в процесс, поэтому существует способ , если вам достаточно информации.

Если это не так, я не знаю о методе получения идентификатора сокета, который вам нужен , если целевое приложение не является совместным.

+0

Во-первых, спасибо за ваш ответ. При использовании WPE Pro для фильтрации пакетов каждый пакет имеет один и тот же «идентификатор сокета», чтобы однозначно идентифицировать соединение. Итак, если я правильно понимаю, есть вероятность, что этот идентификатор сокета равен идентификатору процесса программы, хотя он может меняться со временем? Я хочу, чтобы исходный код программы помог мне, но я не могу найти ничего удаленного, связанного с созданием соединения сокета. – Nick

+0

Ну, я взглянул на WPE Pro и кажется, что он (также) использует DLL-инъекцию. Он не получает идентификатор сокета из пакета. Это совсем другая история ... – Simone

+0

Я вижу .. Я нашел интересную функцию: WSADuplicateSocket(), но я не могу найти достойный пример где угодно. – Nick

0

socket() возвращает дескриптор файла, если это то, на что вы ссылаетесь как идентификатор сокета, тогда способы его получения без совместной работы процесса в Windows ограничены. FWIW в Linux открытых FDs перечислены в файловой системе proc.

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

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

Если это так, то лучше всего будет установить приложение в качестве прокси для другой службы.

Под этим я подразумеваю, что программа, открывающая прослушивающий порт и принимающая соединения при запуске соединения, должна немедленно открыть свое собственное соединение с предварительно настроенной комбинацией IP: port и начать трафик пересылки. Как только это будет написано, просто проверить транспорт перед отправкой и, возможно, изменить его.

Если ваша программа является сервером, запустите его на нестандартном порту, настройте это приложение, чтобы открыть обычный порт сервера, а затем перенаправить соединения на нестандартный порт, который вы настроили на localhost.

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

Это должно работать практически во всем. Единственное предупреждение - если шифрование трафика зашифровано, вы, очевидно, не сможете его проверить или изменить. Это фактически то же самое, что и размещение приложения за NAT.

1

Эта библиотека: SharpPcap обещает делать захват, инжекцию, анализ и сбор пакетов с использованием любого .NET-языка, такого как C# и VB.NET (more info).

Это библиотека, используемая Wireshark, и это точно, что она может захватывать и анализировать.

+0

Да, вот что сказал Кристиан. Я приветствую вашу помощь, но у SharpPcap нет такого варианта к сожалению. – Nick

Смежные вопросы