WSPRecv hook
От: Аноним  
Дата: 31.07.12 08:15
Оценка:
Всем доброго дня,

Пишу анализатор трафа для одного приложения, ничего менять не надо, просто дампить пакеты и писать их в лог. С WSPSend конечно же все отлично.

С WSPRecv проблема начинается на overlapped сокетах, при асинхронном использовании. Все время получаю SOCKET_ERROR, lpErrno = WSA_IO_PENDING.

Пробовал различные варианты, описаные на форуме, но ничего путного не выходит. Пробовал подсовывать свой lpCompletionRoutine (что вполне бы меня устроило), но он вообще не вызывается или я получаю 10022 (WSAEINVAL). lpOverlapped->hEvent похоже не используется вообще (пробовал создавать и подсовывать в эту структуру) и конструкции типо не выходят:

    if (result == SOCKET_ERROR && *lpErrno == WSA_IO_PENDING)
    {                    
        result = fOldWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno);        
        
        WaitForSingleObject(lpOverlapped->hEvent, INFINITE);

        result = WSAGetOverlappedResult(s, lpOverlapped, &retBytes, FALSE, lpFlags);        

        OutputString("retBytes = %d\n", retBytes); //иногда вразумительный ответ

        result = fOldWSPRecv(s, lpBuffers, dwBufferCount, lpNumberOfBytesRecvd, lpFlags, lpOverlapped, lpCompletionRoutine, lpThreadId, lpErrno); //тут всегда WSA_IO_PENDING    
    }


Вообщем уже кучу всего перепробовал, но нормального варианта так и не нашел. Киданите ссылкой, кто сталкивался. Полюбому тут я такой уже сотый или тысячный с подобным вопросом =)

Примного благодарствую.
Re: WSPRecv hook
От: okman Беларусь https://searchinform.ru/
Дата: 31.07.12 11:33
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Пишу анализатор трафа для одного приложения, ничего менять не надо, просто дампить пакеты и писать их в лог. С WSPSend конечно же все отлично.


А>С WSPRecv проблема начинается на overlapped сокетах, при асинхронном использовании. Все время получаю SOCKET_ERROR, lpErrno = WSA_IO_PENDING.


А>Пробовал различные варианты, описаные на форуме, но ничего путного не выходит. Пробовал подсовывать свой lpCompletionRoutine (что вполне бы меня устроило), но он вообще не вызывается или я получаю 10022 (WSAEINVAL). lpOverlapped->hEvent похоже не используется вообще (пробовал создавать и подсовывать в эту структуру) и конструкции типо не выходят:


А>...


А>Вообщем уже кучу всего перепробовал, но нормального варианта так и не нашел. Киданите ссылкой, кто сталкивался. Полюбому тут я такой уже сотый или тысячный с подобным вопросом =)


Мой Вам добрый совет — завязывайте с этим. Я про хуки на WinSock-функции.
Из всех способов мониторинга или фильтрации трафика этот является наихудшим.
Клиент может ждать на сокете, ждать на событии, установить процедуру завершения,
либо вызвать GetOverlappedResult со значением bWait = TRUE, либо связать сокет с
портом завершения ввода-вывода, либо использовать ReadFile/WriteFile, либо
что-то еще — если используется асинхронный режим, то Вы не сможете корректно
обработать все эти ситуации, или же нагородите такие грабли, которые потом будет
невозможно разгрести.

"Человеческие" способы сниффинга подразумевают TDI- или LSP-фильтр (на Vista и
выше — WFP), либо, — если нужно работать на уровне сетевых пакетов, — NDIS.
Другого в Винде не дано.
Re[2]: WSPRecv hook
От: razor2025  
Дата: 31.07.12 11:50
Оценка:
O>Клиент может ждать на сокете, ждать на событии, установить процедуру завершения,

Клиент точно не использует процедуру завершения, а если ее пытаюсь использовать я, то вылазит ошибка 10022.

Просто у меня все написано и работает кроме этого куска и переписывать все не очень хочется.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.