Не работает сниффер на некоторых машинах.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Не работает сниффер на некоторых машинах. - 2010-06-04 23:22:17.566666
|
|
|
croca
Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
|
Пассивный снифер Пишу снифер для одной игрушки, который по средствам слушанья трафика строит карту мира. Кусочки картинки карты загружается по http, поэтому слушается входящий и исходящий трафик. Сокет захватывается таким способом:
listenSocket = NULL;
mapTable = NULL;
WSADATA WSA;
SystLog = SystLogP;
if (WSAStartup(MAKEWORD(2,2), &WSA)) {
Application->MessageBoxA(LANG_s28, LANG_sE, MB_OK);
return;
} // PF_INET //IPPROTO_RAW
listenSocket = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (INVALID_SOCKET==listenSocket) {
int e = WSAGetLastError();
SystLog->Lines->Add(IntToStr(e));
closesocket(listenSocket);
listenSocket = 0;
Application->MessageBoxA(LANG_s29, LANG_sE, MB_OK);
return;
}
sockaddr_in listenAddres;
ZeroMemory(&listenAddres, sizeof(listenAddres));
listenAddres.sin_family = AF_INET;
//listenAddres.sin_port = htons(80);
//listenAddres.sin_addr.s_addr = inet_addr("213.101.208.103");
listenAddres.sin_addr.S_un.S_addr = localAddress;
if ( bind(listenSocket, (SOCKADDR*)&listenAddres, sizeof(SOCKADDR))==SOCKET_ERROR) {
int e = WSAGetLastError();
SystLog->Lines->Add(IntToStr(e));
closesocket(listenSocket);
listenSocket = 0;
Application->MessageBoxA(LANG_s30, LANG_sE, MB_OK);
return;
}
u_long v = 1;
/*
//Для тех, у кого не установлен свежий Platform SDK сообщаю, что числовое значение константы SIO_RCVALL равно 0x98000001.
#define SIO_RCVALL 0x98000001
if (ioctlsocket(listenSocket, SIO_RCVALL, &v)) {
int e = WSAGetLastError();
SystLog->Lines->Add(IntToStr(e));
closesocket(listenSocket);
listenSocket = 0;
Application->MessageBoxA(LANG_s31, LANG_sE, MB_OK);
return;
} */
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
u_long cbOutBuffer;
if (WSAIoctl(listenSocket, SIO_RCVALL, &v, 4, NULL, 0, &cbOutBuffer, NULL, NULL)) {
int e = WSAGetLastError();
SystLog->Lines->Add(IntToStr(e));
closesocket(listenSocket);
listenSocket = 0;
Application->MessageBoxA(LANG_s31, LANG_sE, MB_OK);
return;
}
Читается по средству:
rc = WSARecv( listenSocket, &DataBuf, 1, &receiveLen, &Flags, &RecvOverlapped, NULL );
и читался таким методом:
receiveLen = recv( listenSocket, pktBufer, MAX_PACKET_SIZE, 0 ); в общем результат одинаковый, у меня все работает ), но у некоторых людей (не у всех), снифер не получает исходящего трафика и причину я долгое время понять не могу и выявить закономерность тоже. Из за этого картограф не может получить пакет с http заголовком запрашиваемой картинки и из за этого не может быть начат процесс сбора пакетов картинки. Нужен пример решения или направление куда смотреть что бы найти причину почему так происходит, а точнее не происходит получение исходящего трафика. Приму даже вариант создание отдельного сокета на входящий трафик и прослушка его отдельном потоке, главное что бы чтение проходило корректно. Зависимости почему оно не работает, я тоже не выяснил (.
|
|
|
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 От этого вряд ли что-то будет работать лучше, но стилистически так правильнее. Если системные дефайны, то нефиг их перегружать. Тем более, что компилятор может ещё и варнинги выдавать на такие переопределения.
|
|
|
RE: Не работает сниффер на некоторых машинах. - 2010-06-04 23:45:18.406666
|
|
|
croca
Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
|
Добавлю что делать через пикап или другой интерфейс сторонний, пока не хочу, поскольку сам не люблю ставить лишнее себе на ось … хочу что бы все было реализовано штатными средствами.
|
|
|
RE: Не работает сниффер на некоторых машинах. - 2010-06-05 00:01:08.146666
|
|
|
croca
Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
|
rgo, спасибо, советы по поводу стилистики учту, последние изменения по переопределению константы были сделаны в отчаянье перебора разных вариантов кода. Программа запускается от имени администратора, поскольку строка
WSAIoctl(listenSocket, SIO_RCVALL, &v, 4, NULL, 0, &cbOutBuffer, NULL, NULL)
вернет ошибку без данных прав. на счет антивирусов и фаерволов буду уточнять повторно. у двух человек снифер не работал на хп сп3, у одного на win7. у самого меня win7.
|
|
|
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, чтобы не мучать сетевую карту.
|
|
|
RE: Не работает сниффер на некоторых машинах. - 2010-06-05 01:01:22.540000
|
|
|
croca
Сообщений: 4
Оценки: 0
Присоединился: 2010-06-04 21:48:48.833333
|
tеstеr, в переменной localAddress передается адрес выбранного сетевого интерфейса, то есть пользователь выбирает в списке какой IP используется. на счет способа выхода в интернет, у двоих опрошенных, доступ аналогичен моему, через домашний роутер. разве вся прелесть сокетов не в том что им все равно с какой аппаратной частью я хочу работать? после вашего поста, больше склоняюсь к использованию пикапа (
|
|
|
|
|