سؤال بسيط winpcap - كيفية إرسال حزم إلى منفذ IP / منفذ محدد؟
-
16-09-2019 - |
سؤال
قرأت البرامج التعليمية وكذلك، لكنني لا أحصل عليه. إنها تتيح لك إرسال حزم، ولكن كيف يمكنك أن تخبر WinPCap أين لإرسال تلك الحزم؟ هل هناك أي رأس يجب أن أضعه على الحزم، لذلك سيعرف أي IP / Port لإعادة توجيهه؟ أعني. دعنا نتخيل أنني أريد إرسال بعض البيانات إلى MSN الخاص بي، كما لو كنت قد كتبت شيئا لشخص ما في قائمتي. يمكنني استخدام SENDBAKET ()، لكنها ستأخذ صفيف الحزمة / البايت فقط كوسيطة، وليس تحديد التطبيق / IP / منفذ حتى إرسالها.
شكرًا
المحلول
لا تخبر WinPcap حيث لإرسال الحزم. تخبره بوضع حزمة على السلك. سيتم إرسال مفتاح الشبكة الحزمة إلى الوجهة المناسبة. سيتم إرسال مكدس TCP على الطرف الاستقبال الحزمة إلى التطبيق / الخدمة المناسبة. من الواضح أن هذا يعني أن معلومات التوجيه يجب أن تكون في الحزمة نفسها.
لأخذ مثالك، كنت بحاجة إلى وضع عنوان IP ومنفذ TCP لخادم MSN المناسب في الحزمة. إذا لم تقم بذلك، فستجاهل أجهزة الشبكات الخاصة بك أو تصحيح تلك الحزمة.
نصائح أخرى
هذه هي الطريقة التي أرسلتها طلب ARP عبر الأسلاك. 1. حدد الهياكل للبروتوكولات IE إذا كنت ترغب في إرسال حزم ARP، فستحتاج إلى بنية سيتضمن طبقة رابط البيانات (رأس إيثرنت) وطبقة الشبكة (رأس ARP). في المقابل إذا كنت ترغب في إرسال حزمة TCP عبر IP، فستحتاج إلى بنية بيانات لرأس Ethernet ورأس IP ورأس TCP.
بمجرد تحديد الهياكل، قم بتهيئة مثيل الهيكل مع القيم التي تريدها، إذا كنت تريد أن تذهب الحزمة إلى جميع الأجهزة في الشبكة، فقم بتعيين قيمة MAC الوجهة لرأس Ethernet إلى FF: FF: FF: FF: FF إذا كنت ترغب في إرسال الحزمة إلى الجهاز X مع (عنوان IP 192.168.0.88) ثم قم بتعيين عنوان الوجهة في طبقة IP لهذه القيمة.
بمجرد القيام بذلك، ستحتاج إلى إعلان صفيف 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);