Ошибка WSAIoctl

Тема в разделе "WASM.WIN32", создана пользователем ilovw, 24 апр 2005.

  1. ilovw

    ilovw New Member

    Публикаций:
    0
    Регистрация:
    4 апр 2005
    Сообщения:
    5
    Адрес:
    Russia
    Подскажите, пожалуйста!

    Хочу послушать трафик (dial-up). При вызове функции

    WSAIoctl(socket,98000001h,offset option,sizeof option,

    0,0,offset nbts,0,0) (option dd 1) возвращается ошибка

    WSAEINVAL (10022). Если же младший байт option обнулить

    (option dd 100h), то вызов проходит успешно, но в дальнейшем функция recv ничего не ловит! В чем дело?

    Перерыл кучу материала - ничего! Кто-нибудь знает, в чем дело? Система: профессиональные окна хп, SP2.

    Может быть у меня проблемы с ws2_32.dll?
     
  2. FreeBSD

    FreeBSD New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2005
    Сообщения:
    5
    вот рабочий пример сниффера с комментами,

    правда на Си, а не асме



    [​IMG] 227518541__sniffer.zip
     
  3. BuLdOzEr

    BuLdOzEr New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    5
    0x98000001 это ведь SIO_RCVALL?



    Первое на что хочу обратить внимание: если вы "привязали" (bind) сокет на MS TCP Loopback interface (127.0.0.1, по другому localhost) то SIO_RCVALL работать НЕ будет! (Т.е. "сырой" (RAW) сокет привязать то можно будет, но вот вызов WSAIoctl с SIO_RCVALL с RCVALL_ON (1) в таком случае будет возвращать ошибку 10022, сам на это наткнулся). Если вы привязали сокет не на "реальный" интерфейс, то дело именно в этом! В случае если вы обнулили младший байт то это равносильно отключению (RCVALL_OFF (0)) этой опции, и такой вызов будет проходить успешно (без ошибки). Естественно, в таком случае функция recv ничего ловить не будет, ведь вы же сами отключили прослушку пакетов! Видимо, функции WSAIoctl и ioctlsocket смотрят в данном случае только младший байт option (dd, DWORD и т.п.), раз прошел option 100h (или же 100h возможно соответствует какой то другой опции?), хотя я не проверял. Кстати, вроде можно сделать чуть проще, обойтись без вызова WSAIoctl, а просто ioctlsocket(hSocket, SIO_RCVALL, &option), где option имеет тип long (dd?, не силен я в ассемблере).



    Второе: исходящий трафик в случае PPP Dialup ловится не будет, только входящий! Дело в том, что сырые сокеты реализуются драйвером tcpip.sys через устройство \Device\RawIp, а в случае Dialup исходящий трафик идет, как я понял, "мимо" этого устройства, т.к. в WinNT такие типы подключений реализуются через свою серию драйверов (и если пишется, допустим, firewall определенного типа, то в случае PPP приходится прибегать к дополнительным "извращениям"). Про это можно узнать, например, на http://www.hardline.ru/selfteachers/Info/Programming/Book.PogrammingSi stemSecurity/Glava%203/Index27.htm

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



    P.S.: Сам проверял работу SIO_RCVALL на WinXP Pro Oem Rus SP1 с Dialup (обычный модем на 56k), поначалу все пытался включить SIO_RCVALL на 127.0.0.1 (хотел проверить работу на "локальном" трафике) и ничего не вышло, но как только привязал сокет к реальному адресу, то все сразу заработало.

    P.P.S.: Приаттачил пример rcvall из Platform SDK XPSP2, правда там, естественно, C, а не ассемблер.



    [​IMG] _829740134__rcvall.zip
     
  4. BuLdOzEr

    BuLdOzEr New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    5