سؤال بسيط winpcap - كيفية إرسال حزم إلى منفذ IP / منفذ محدد؟

StackOverflow https://stackoverflow.com/questions/1278294

سؤال

قرأت البرامج التعليمية وكذلك، لكنني لا أحصل عليه. إنها تتيح لك إرسال حزم، ولكن كيف يمكنك أن تخبر WinPCap أين لإرسال تلك الحزم؟ هل هناك أي رأس يجب أن أضعه على الحزم، لذلك سيعرف أي IP / Port لإعادة توجيهه؟ أعني. دعنا نتخيل أنني أريد إرسال بعض البيانات إلى MSN الخاص بي، كما لو كنت قد كتبت شيئا لشخص ما في قائمتي. يمكنني استخدام SENDBAKET ()، لكنها ستأخذ صفيف الحزمة / البايت فقط كوسيطة، وليس تحديد التطبيق / IP / منفذ حتى إرسالها.

شكرًا

هل كانت مفيدة؟

المحلول

لا تخبر WinPcap حيث لإرسال الحزم. تخبره بوضع حزمة على السلك. سيتم إرسال مفتاح الشبكة الحزمة إلى الوجهة المناسبة. سيتم إرسال مكدس TCP على الطرف الاستقبال الحزمة إلى التطبيق / الخدمة المناسبة. من الواضح أن هذا يعني أن معلومات التوجيه يجب أن تكون في الحزمة نفسها.

لأخذ مثالك، كنت بحاجة إلى وضع عنوان IP ومنفذ TCP لخادم MSN المناسب في الحزمة. إذا لم تقم بذلك، فستجاهل أجهزة الشبكات الخاصة بك أو تصحيح تلك الحزمة.

نصائح أخرى

هذه هي الطريقة التي أرسلتها طلب ARP عبر الأسلاك. 1. حدد الهياكل للبروتوكولات IE إذا كنت ترغب في إرسال حزم ARP، فستحتاج إلى بنية سيتضمن طبقة رابط البيانات (رأس إيثرنت) وطبقة الشبكة (رأس ARP). في المقابل إذا كنت ترغب في إرسال حزمة TCP عبر IP، فستحتاج إلى بنية بيانات لرأس Ethernet ورأس IP ورأس TCP.

  1. بمجرد تحديد الهياكل، قم بتهيئة مثيل الهيكل مع القيم التي تريدها، إذا كنت تريد أن تذهب الحزمة إلى جميع الأجهزة في الشبكة، فقم بتعيين قيمة MAC الوجهة لرأس Ethernet إلى FF: FF: FF: FF: FF إذا كنت ترغب في إرسال الحزمة إلى الجهاز X مع (عنوان IP 192.168.0.88) ثم قم بتعيين عنوان الوجهة في طبقة 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top