Отправка IP-пакета с необработанным сокетом в Python
Подводя итог моим проблемам:
У меня 2 проблемы:
- Я не могу отправить переменную IP_PACKET
- Как установить флаг в IP-пакете? (для отправки)
Это мой код:
#! /usr/bin/python
import socket
import struct
import sys
def Create_SOCKET():
global ST
try:
ST = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
except socket.error as MSG:
print "[ERROR] Socket creation error:\n", MSG
sys.exit()
def IP_HEADER(Source_IP, Destination_IP):
global IP_PACKET
#Variable validation
IP_VER = 4
IP_IHL = 5
IP_TOS = 0
IP_TOL = 60
IP_IDT = 54331
IP_FLG = 2 # 0x02 DF
IP_FOS = 0
IP_TTL = 64
IP_PROTO = socket.IPPROTO_TCP
IP_CHECKSUM = 0
IP_IHL_VER = (IP_VER << 4) + IP_IHL
SRC_IP = socket.inet_aton(Source_IP)
DST_IP = socket.inet_aton(Destination_IP)
IP_PACKET = struct.pack("!BBHHHBBH4s4s", IP_IHL_VER, IP_TOS, IP_TOL, IP_IDT, IP_FOS, IP_TTL, IP_PROTO, IP_CHECKSUM, SRC_IP, DST_IP)
def Send_PACKET(IFACE):
try:
Create_SOCKET()
ST.bind((IFACE, 0))
ST.send(IP_PACKET)
print "[SUCESS] Packet was sent."
except socket.error as MSG:
print "[ERROR] Packet can't send:\n", MSG
sys.exit()
IP_HEADER(sys.argv[1], sys.argv[2])
Send_PACKET(sys.argv[3])
Версия Python: 2.7
Операционная система: Ubuntu 16.04
Спасибо за помощь мне.
1 ответ
Ваша область действия неверна, функция определена внутри какой-то другой функции, поэтому она доступна только локально:
def f1():
pass
def f2():
def f3():
pass
f3() # works, local scope visible
f1() # works
f2() # works
try:
f3() # does not work, is not known, only inde f2()'s scope known
except NameError as ne:
print(ne)
Выход:
name 'f3' is not defined
Чтобы исправить свою структуру, сделайте IP_HEADER(Source_IP, Destination_IP):
вернуть построенное IP_PACKET
, сохранить его в переменную и предоставить его Send_PACKET(IFACE,data)
- также без отступов Send_PACKET(...)
:
def IP_HEADER(Source_IP, Destination_IP):
# your code
return IP_PACKET
def Send_PACKET(IFACE,data): # unindent 4 spaces so its in normal scope
# your code, use data instead of IP_PACKET
data = IP_HEADER(sys.argv[1], sys.argv[2])
Send_PACKET(sys.argv[3], data)
Решение первой проблемы:
global IP_PACKET
IP_PACKET =[]
htt ps://stackru.com/images/266071165565e3c86f26c1c077113d49065ef58a.png