0

チュートリアルなどを読みましたが、理解できません。パケットを送信することはできますが、それらのパケットの送信先を Winpcap に伝えるにはどうすればよいでしょうか? どの IP/ポートに転送するかを知るために、パケットに付ける必要があるヘッダーはありますか? つまり。リストの誰かに何かを書いたかのように、MSN にデータを送信したいとします。sendpacket() を使用できますが、パケット/バイト配列のみを引数として取り、どのアプリ/IP/ポートに送信するかを指定しません。

ありがとう

4

2 に答える 2

1

これは、回線経由で ARP 要求を送信する方法です。1. プロトコルの構造を定義します。つまり、ARP パケットを送信する場合は、データ リンク層 (イーサネット ヘッダー) とネットワーク層 (ARP ヘッダー) を含む構造が必要になります。同様に、IP 経由で tcp パケットを送信する場合は、イーサネット ヘッダー、ip ヘッダー、および tcp ヘッダーのデータ構造が必要になります。

  1. 構造を定義したら、必要な値で構造のインスタンスを初期化します。つまり、ネットワーク内のすべてのマシンにパケットを送信する場合は、イーサネット ヘッダーの宛先 MAC 値を ff:ff:ff:ff:ff に設定します。 ff (IP アドレス 192.168.0.88) を使用してマシン X にパケットを送信する場合は、IP レイヤーの宛先アドレスをその値に設定します。

  2. 完了したら、char* 配列を宣言し、すべての構造を char* 配列にコピーして、バイト シーケンスを作成し、ネットワーク経由で送信する必要があります。

// 構造を定義することによって何を意味するかを示すために // 残りのコード スニペットとは関係ありません

typedef struct IP_header 
{
    u_char      VersionNInternetHeaderLength;       // Version (4 bits) + Internet header length (4 bits)
    /*u_char        version:4;
    u_char      HeaderLength:4;*/
    u_char      Type;                               // Type of service 
    u_short     TotalLength;                        // Total length 
    u_short     Identification;                     // Identification

    u_char      rsv     : 1;
    u_char      df      : 1;
    u_char      mf      : 1;

    u_char      FragmentOffset1 : 5;
    u_char      FragmentOffset2;
    //u_short       Flags_fo;                           // Flags (3 bits) + Fragment offset (13 bits)

    u_char      TimeToLive;                         // Time to live
    u_char      Protocol;                           // Next level Protocol of the encapsulated payload
    u_short     Checksum;                           // Header checksum
    IP_address  SourceAddress;                      // Source address
    IP_address  DestinationAddress;                 // Destination address
    u_int       OptionNPadding;                     // Option + Padding

    IP_header()
    {
        mf = 0;
        rsv = 0;
        df = 0;
        FragmentOffset1 = 0;
        FragmentOffset2 = 0;

        TimeToLive = 128;

        TotalLength = sizeof(IP_header);
        Identification = 0xABCD;
        Checksum = 0xABCD;
        OptionNPadding = 0;
    }
}IP_header;


Ethernet_header EthernetHeader;// = (Ethernet_header*)malloc(sizeof(Ethernet_header));
        ARP_header ARPHeader ;//= (ARP_header*)malloc(sizeof(ARP_header));

        ARPHeader.HardwareType = htons(1);
        ARPHeader.ProtocolType = htons(0x800);
        ARPHeader.OPCODE = htons(1);

        ARPHeader.HeaderLength = 6;
        ARPHeader.ProtocolLength = 4;

        ARPHeader.SenderMAC = MY_FAKE_MAC;
        ARPHeader.SenderIP = MY_IP;

        ARPHeader.TargetMAC = MAC_address();
        ARPHeader.TargetIP = Whose;

        EthernetHeader.DestinationMAC = BROADCASTMAC;
        EthernetHeader.SourceMAC = MY_FAKE_MAC;
        EthernetHeader.EtherType = htons(0x806);

        u_char* packet = (u_char*)malloc(sizeof(EthernetHeader) + sizeof(ARPHeader));

        memcpy(packet, &EthernetHeader, sizeof(EthernetHeader));
        memcpy(packet + sizeof(EthernetHeader), &ARPHeader, sizeof(ARPHeader));

        SendPacket(packet);
于 2012-08-20T19:43:54.590 に答える
1

パケットの送信先を Winpcap に指示しません。回線にパケットを送信するように指示します。ネットワーク スイッチは、パケットを正しい宛先に送信します。受信側の TCP スタックは、パケットを適切なアプリケーション/サービスに送信します。明らかに、これはルーティング情報がパケット自体に含まれている必要があることを意味します。

例を挙げると、適切な MSN サーバーの IP アドレスと TCP ポートをパケットに入れる必要があります。そうしないと、ネットワーク ハードウェアがそのパケットを破棄または誤ってルーティングします。

于 2009-08-14T14:55:00.197 に答える