Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Не работает сниффер на некоторых машинах.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Не работает сниффер на некоторых машинах.
Имя
Сообщение << Старые топики   Новые топики >>
Не работает сниффер на некоторых машинах. - 2010-06-04 23:22:17.566666   
croca

Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
Пассивный снифер

Пишу снифер для одной игрушки, который по средствам слушанья трафика строит карту мира. Кусочки картинки карты загружается по http, поэтому слушается входящий и исходящий трафик.
Сокет захватывается таким способом:
listenSocket = NULL; &nbsp;&nbsp; &nbsp;mapTable = NULL; &nbsp;&nbsp; &nbsp;WSADATA WSA; &nbsp;&nbsp; &nbsp;SystLog = SystLogP; &nbsp;&nbsp; &nbsp;if (WSAStartup(MAKEWORD(2,2), &amp;WSA)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Application-&gt;MessageBoxA(LANG_s28, LANG_sE, MB_OK); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return; &nbsp;&nbsp; &nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // PF_INET&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //IPPROTO_RAW &nbsp;&nbsp; &nbsp;listenSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP); &nbsp;&nbsp; &nbsp;if (INVALID_SOCKET==listenSocket) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int e = WSAGetLastError(); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SystLog-&gt;Lines-&gt;Add(IntToStr(e)); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;closesocket(listenSocket); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;listenSocket = 0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Application-&gt;MessageBoxA(LANG_s29, LANG_sE, MB_OK); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return; &nbsp;&nbsp; &nbsp;} &nbsp;&nbsp; &nbsp;sockaddr_in listenAddres; &nbsp;&nbsp; &nbsp;ZeroMemory(&amp;listenAddres, sizeof(listenAddres)); &nbsp;&nbsp; &nbsp;listenAddres.sin_family = AF_INET; &nbsp;&nbsp; &nbsp;//listenAddres.sin_port = htons(80); &nbsp;&nbsp; &nbsp;//listenAddres.sin_addr.s_addr = inet_addr("213.101.208.103"); &nbsp;&nbsp; &nbsp;listenAddres.sin_addr.S_un.S_addr = localAddress; &nbsp;&nbsp; &nbsp;if ( bind(listenSocket, (SOCKADDR*)&amp;listenAddres, sizeof(SOCKADDR))==SOCKET_ERROR) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int e = WSAGetLastError(); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SystLog-&gt;Lines-&gt;Add(IntToStr(e)); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;closesocket(listenSocket); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;listenSocket = 0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Application-&gt;MessageBoxA(LANG_s30, LANG_sE, MB_OK); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return; &nbsp;&nbsp; &nbsp;} &nbsp;&nbsp; &nbsp;u_long v = 1; &nbsp;&nbsp; &nbsp;/* &nbsp;&nbsp; &nbsp;//Для тех, у кого не установлен свежий Platform SDK сообщаю, что числовое значение константы SIO_RCVALL равно 0x98000001. &nbsp;&nbsp; &nbsp;#define SIO_RCVALL 0x98000001 &nbsp;&nbsp; &nbsp;if (ioctlsocket(listenSocket, SIO_RCVALL, &amp;v)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int e = WSAGetLastError(); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SystLog-&gt;Lines-&gt;Add(IntToStr(e)); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;closesocket(listenSocket); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;listenSocket = 0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Application-&gt;MessageBoxA(LANG_s31, LANG_sE, MB_OK); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return; &nbsp;&nbsp; &nbsp;}&nbsp; */ &nbsp;&nbsp; &nbsp;#define SIO_RCVALL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _WSAIOW(IOC_VENDOR,1) &nbsp;&nbsp; &nbsp;u_long cbOutBuffer; &nbsp;&nbsp; &nbsp;if (WSAIoctl(listenSocket, SIO_RCVALL, &amp;v, 4, NULL, 0, &amp;cbOutBuffer, NULL, NULL)) { &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int e = WSAGetLastError(); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SystLog-&gt;Lines-&gt;Add(IntToStr(e)); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;closesocket(listenSocket); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;listenSocket = 0; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Application-&gt;MessageBoxA(LANG_s31, LANG_sE, MB_OK); &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return; &nbsp;&nbsp; &nbsp;} Читается по средству: rc = WSARecv( listenSocket, &amp;DataBuf, 1, &amp;receiveLen, &amp;Flags, &amp;RecvOverlapped, NULL ); и читался таким методом: receiveLen = recv( listenSocket, pktBufer, MAX_PACKET_SIZE, 0 );
в общем результат одинаковый, у меня все работает ), но у некоторых людей (не у всех), снифер не получает исходящего трафика и причину я долгое время понять не могу и выявить закономерность тоже. Из за этого картограф не может получить пакет с http заголовком запрашиваемой картинки и из за этого не может быть начат процесс сбора пакетов картинки.
Нужен пример решения или направление куда смотреть что бы найти причину почему так происходит, а точнее не происходит получение исходящего трафика. Приму даже вариант создание отдельного сокета на входящий трафик и прослушка его отдельном потоке, главное что бы чтение проходило корректно. Зависимости почему оно не работает, я тоже не выяснил (.

Post #: 1
RE: Не работает сниффер на некоторых машинах. - 2010-06-04 23:43:22.950000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: croca
Нужен пример решения или направление куда смотреть что бы найти причину почему так происходит, а точнее не происходит получение исходящего трафика.

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

ps. И кстати, вместо: //Для тех, у кого не установлен свежий Platform SDK сообщаю, что числовое значение константы SIO_RCVALL равно 0x98000001. #define SIO_RCVALL 0x98000001 Или #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1) Напиши просто:#ifndef SIO_RCVALL # define SIO_RCVALL то-что-надо-тебе #endifОт этого вряд ли что-то будет работать лучше, но стилистически так правильнее. Если системные дефайны, то нефиг их перегружать. Тем более, что компилятор может ещё и варнинги выдавать на такие переопределения.
Post #: 2
RE: Не работает сниффер на некоторых машинах. - 2010-06-04 23:45:18.406666   
croca

Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
Добавлю что делать через пикап или другой интерфейс сторонний, пока не хочу, поскольку сам не люблю ставить лишнее себе на ось … хочу что бы все было реализовано штатными средствами.
Post #: 3
RE: Не работает сниффер на некоторых машинах. - 2010-06-05 00:01:08.146666   
croca

Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
rgo, спасибо, советы по поводу стилистики учту, последние изменения по переопределению константы были сделаны в отчаянье перебора разных вариантов кода.
Программа запускается от имени администратора, поскольку строка

WSAIoctl(listenSocket, SIO_RCVALL, &amp;v, 4, NULL, 0, &amp;cbOutBuffer, NULL, NULL) вернет ошибку без данных прав. на счет антивирусов и фаерволов буду уточнять повторно. у двух человек снифер не работал  на хп сп3, у одного на win7. у самого меня win7.
Post #: 4
RE: Не работает сниффер на некоторых машинах. - 2010-06-05 00:27:49.616666   
tеstеr

Сообщений: 377
Оценки: -46
Присоединился: 2008-02-08 17:56:40.563333
Всё может быть глубже (т.е. зависеть не ОС и наличия Platform SDK, а от аппаратуры).
Например, пользователь сидит через WiFi, другой через локалку, третий через синий зуб, четвертый через dial-up, … и при этом входящий трафик проходит через один драйвер (который перехватывается везде универсально), а исходящий может быть реализован как угодно и для его перехвата нужно использовать отдельный SDK для того устройства, которое связь осуществляет.

Также видна строчка
//listenAddres.sin_port = htons(80);
//listenAddres.sin_addr.s_addr = inet_addr("213.101.208.103");
listenAddres.sin_addr.S_un.S_addr = localAddress;
А какой может быть исходящий трафик на 127.0.0.1, он наверно тоже ни через что не проходит, а обрабатывается отдельно, и поэтому не ловится. Наверняка используется супер оптимизированный метод для работы с 127.0.0.1, чтобы не мучать сетевую карту.
Post #: 5
RE: Не работает сниффер на некоторых машинах. - 2010-06-05 01:01:22.540000   
croca

Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
tеstеr, в переменной localAddress передается адрес выбранного сетевого интерфейса, то есть пользователь выбирает в списке какой IP используется.
на счет способа выхода в интернет, у двоих опрошенных, доступ аналогичен моему, через домашний роутер.
разве вся прелесть сокетов не в том что им все равно с какой аппаратной частью я хочу работать? после вашего поста, больше склоняюсь к использованию пикапа (
Post #: 6
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Не работает сниффер на некоторых машинах.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.