Проблема с RAW сокетами

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by kurz, 14 Mar 2010.

  1. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    Проблема с следующем: пишу программу, которая работает с сырыми сокетами, т.е. формирую заголовки TCP, IP сам, через обьявление соответствующих структур. Но при отсылке, к моему пакету все равно приписывается заголовок IP системой (это видно по тому, что отсылаю я 40 байт, принимаю сам от себя уже 60), а мое содержимое смещается, как я понимаю, в область "данных". В коде одна проблема, режим "я-сам-буду-формировать-заголовки" не включается:
    PHP:
    s_sock socket(AF_INETSOCK_RAWIPPROTO_RAW);
    BOOL raw_opt TRUE;
    setsockopt(s_sockIPPROTO_IPIP_HDRINCL, (char *)&raw_optsizeof(raw_opt))
    возвращает ошибку 10049 - Cannot assign requested address. И с этого момента все идет плохо ))
    Может где ошибаюсь, прошу поправить. Как мне вручную отправить сформированный пакет? С моим заголовком.
     
  2. maestro-ant

    maestro-ant New Member

    Joined:
    7 Jan 2007
    Messages:
    26
    Likes Received:
    4
    Reputations:
    6
    если не ошибаюсь этой возможности уже нет
    в WinXP sp1 еще можно было собирать и отправлять самодельные пакеты
     
  3. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    WinPcap тебе в помощь
     
    _________________________
  4. d_x

    d_x Banned

    Joined:
    25 Mar 2008
    Messages:
    558
    Likes Received:
    650
    Reputations:
    210
    С user-level можно было собирать пакеты с нуля в win 2000, во всех последующих версиях возможности работы с rawsocket порезаны в разной степени. В *nix можно.
     
  5. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    никто не подскажет простых примеров работы с винпкапом?
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    вообще как я понял существуют тока 4 пути решения этой проблемы:
    1) поставить win 2000 или никсы
    2) патчить драйвер tcpip.sys (можно даже в памяти) чтобы он не фильтровал это. Но как выяснилось - это довольно сложно без исходников драйвера. А разбираться в коде хексрея - это мутарно сильно
    3) юзать сторонение либы типа winpcap
    4) написать свой дров как прослойку между ndis и прогой. На деле это выглядит не сильно сложно и дает возможность даже подмены ip делать. Но опять же получается свой вариант winpcap'a
     
  7. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Да на их же сайте нормальные доки есть с примерами, описанием и т.д.
     
  8. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    если нужно не троян, а определенная тулза, лучше конечно под никсом, там можно даже на php работать с сырыми сокетами
     
  9. kurz

    kurz New Member

    Joined:
    5 Feb 2010
    Messages:
    32
    Likes Received:
    0
    Reputations:
    0
    я видимо в тупике) мне нужно это делать из под винды, причем стандартными средствами, без сторонних фишек типа winpcap. такая специфика задачи.
    с отправкой пакетов облом. а могу ли я принимать их в raw-режиме? и самостоятельно отделять заголовок и анализировать его?
     
  10. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    Limitations on Raw Sockets

    On Windows 7, Windows Server 2008 R2, Windows Vista, and Windows XP with Service Pack 2 (SP2), the ability to send traffic over raw sockets has been restricted in several ways:

    TCP data cannot be sent over raw sockets.
    UDP datagrams with an invalid source address cannot be sent over raw sockets. The IP source address for any outgoing UDP datagram must exist on a network interface or the datagram is dropped. This change was made to limit the ability of malicious code to create distributed denial-of-service attacks and limits the ability to send spoofed packets (TCP/IP packets with a forged source IP address).
    A call to the bind function with a raw socket is not allowed.