كيف ترسل حزمة IP مع حمولة سداسية في Python؟
سؤال
لقد استنشقت حزمة IGMP والآن أود أن أرسلها بمساعدة Python. هل هناك أي طريقة لإرسال حزمة مثل
0x0000 01 00 5E 00 43 67 00 02-B3 C8 7F 44 81 00 00 DE ..^.Cg..іИD?..Ю
0x0010 08 00 46 00 00 20 00 01-00 00 01 02 36 4C C0 A8 ..F.. ......6LАЁ
0x0020 00 7B EA 00 43 67 94 04-00 00 16 00 BC 97 EA 00 .{к.Cg”.....ј—к.
0x0030 43 67 Cg
بدون أي مولدات حزمة مثل hispacket؟
تحديث موافق ، حاولت استخدام مآخذ أو الخام ، مثل ذلك:
dst = '234.0.67.103'
# Open a raw socket.
s = socket.socket(socket.AF_INET, socket.SOCK_RAW,2)
res=''
temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67'
for i in temp.split(' '):
res+=chr(int(i, 16))
print res
s.sendto(res, (dst, 0))
كل شيء على ما يرام باستثناء شيء صغير واحد ... إذا شم هذا الحزمة ، يبدو ذلك:
0x0000 01 00 5E 00 43 67 00 02-B3 C8 7F 44 08 00 45 00 ..^.Cg..іИD..E.
0x0010 00 46 07 06 00 00 01 02-C4 25 C0 A8 00 7B EA 00 .F......Д%АЁ.{к.
0x0020 43 67 01 00 5E 00 43 67-00 02 B3 C8 7F 44 81 00 Cg..^.Cg..іИDЃ.
0x0030 00 DE 08 00 46 00 00 20-00 01 00 00 01 02 36 4C .Ю..F.. ......6L
0x0040 C0 A8 00 7B EA 00 43 67-94 04 00 00 16 00 BC 97 АЁ.{к.Cg”.....ј—
0x0050 EA 00 43 67 к.Cg
كما ترون ، لسبب ما يتجاهل بيثون رأسي ويخلق خاصا به. كيف يمكنني إصلاح ذلك؟
المحلول 2
حسنًا ، كما أفهم ، فإن الطريقة الوحيدة للقيام بذلك هي استخدام Scapy بطريقة كهذه:
from scapy.all import *
a=Ether(import_hexcap())
<some dumped hex>
sendp(a)
نصائح أخرى
بسبب برمجة شبكة UNIX (الطبعة الثالثة):
sockfd = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
# inform os about that program are compose ip header
sockfd.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, True)
ما يلي هو تعديل الكود الخاص بك الذي سيرسل الحزمة الخام:
import socket
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0x8100)
s.bind(('eth0', 0x8100))
res=''
temp='01 00 5E 00 43 67 00 02 B3 C8 7F 44 81 00 00 DE 08 00 46 00 00 20 00 01 00 00 01 02 36 4C C0 A8 00 7B EA 00 43 67 94 04 00 00 16 00 BC 97 EA 00 43 67'
for i in temp.split(' '):
res+=chr(int(i, 16))
s.send(res)
لا تنتمي إلى StackOverflow