2013-11-12 2 views
-1

Как я могу создать кадр ICMP отмечает malformet пакета на питонеискаженного Packet на ICMP питоне

  1. импорта гнездо, структура, UUID, подпроцесс, Fcntl, время, случайное

  2. Список пункт

из binascii импорта hexlify, unhexlify от даты и времени импорта DateTime просмоленной = raw_input ('Ingrese Номбр де Tarjeta де Красный Utilizada: ') subprocess.call ([' ifconfig ', tarRed,' promisc ']) pt = 0x0800 s = socket.socket (socket.AF_PACKET, socket.SOCK_RAW, socket.htons (pt)) s.bind ((tarRed, pt)) #GETCheck def getchecksum (ip_header, size): cksum = 0 pointer = 0 while size> 1: cksum + = int ((str ("% 02x"% (ip_header [pointer],)) + str ("% 02x"% (ip_header [указатель + 1],))), 16) size - = 2 указатель + = 2 #if размер: # Это объясняет ситуацию, когда заголовок нечетный #cksum + = int (ip_header [pointer]) cksum = (cksum >> 16) + (cksum & 0xffff) cksum + = (cksum >> 16) return (~ cksum) & 0xFFFF def _checksum (data): # вычислять заголовок sum ip_header_sum = sum (struct.unp ack_from ("6H", данные)) #add перенос ip_header_sum = (ip_header_sum & 0xFFFF) + (ip_header_sum >> 8 & 0xFFFF) ip_header_sum = ~ ip_header_sum & 0xFFFF возвращающие ip_header_sum Защиту i_checksum (checksum_packet): Всего = 0 NUM_WORDS = len (checksum_packet)/2 для chunk в struct.unpack ("!% SH"% num_words, checksum_packet [0: num_words * 2]): total + = chunk if len (checksum_packet)% 2: total + = ord (checksum_packet [-1]) < общая + = итого >> 16 возврата (~ общая + 0xffff & 0xffff)

def checksum(source_string): sum = 0  countTo = 
(len(source_string)/2)*2 count = 0 while count<countTo: 
      thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])   sum = sum + thisVal   sum = sum & 
0xffffffff 
      count = count + 2 if countTo<len(source_string):  sum = sum + ord(source_string[len(source_string) - 1])  sum = sum & 
0xffffffff sum = (sum >> 16) + (sum & 0xffff) sum = sum + (sum 
>> 16) answer = ~sum answer = answer & 0xffff #answer = answer >> 8 | (answer << 8 & 0xff00) return answer def 
checksuma(source_string): sum = 0  countTo = 
(len(source_string)/2)*2 count = 0 while count<countTo: 
      thisVal = ord(source_string[count + 1])*256 + ord(source_string[count])   sum = sum + thisVal   sum = sum & 
0xffffffff 
      count = count + 2 if countTo<len(source_string):  sum = sum + ord(source_string[len(source_string) - 1])  sum = sum & 
0xffffffff sum = (sum >> 16) + (sum & 0xffff) sum = sum + (sum 
>> 16) answer = ~sum answer = answer & 0xffff answer = answer >> 8 | (answer << 8 & 0xff00) return answer def ultimo(str): 
    csum = 0 
    countTo = (len(str)/2) * 2 
    count = 0 

    while count < countTo: 
     thisVal = ord(str[count+1]) * 256 + ord(str[count]) 
     csum = csum + thisVal 
     csum = csum & 0xffffffff 
     count = count + 2 

    if countTo < len(str): 
     csum = csum + ord(str[len(str) - 1]) 
     csum = csum & 0xffffffff 

    csum = (csum >> 16) + (csum & 0xffff) 
    csum = csum + (csum >> 16) 
    answer = ~csum 
    answer = answer & 0xffff 
    answer = answer >> 8 | (answer << 8 & 0xff00) 
    return answer 
#GETCheck 
#MACs adst='ffffffffffff' mac_destino = unhexlify(adst) ma = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) info = 
fcntl.ioctl(ma.fileno(), 0x8927, struct.pack('256s', tarRed[:15])) 
asrc = ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1] 
sd = asrc.split(':') asrc = sd[0]+sd[1]+sd[2]+sd[3]+sd[4]+sd[5] 
mac_origen = unhexlify(asrc) 
#MACs cabEther = struct.pack('!6s6sh',mac_destino,mac_origen,pt) 
#datosIP 
#version = '4' 
#IHL = '5' tipoServicio = unhexlify('00') longitudT = struct.pack('!BB',00,24) identificador = struct.pack('!BB',00,01) 
flag_Pos = 0x4000 tiempoVida = 05 ptIP = unhexlify('01') SCC = 0 
#IPs ip = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) ipO= str(socket.inet_ntoa(fcntl.ioctl(ip.fileno(),0x8915,struct.pack('256s', 
tarRed[:15]))[20:24])) ipO1 = ipO.split('.') ipOr = 
struct.pack("!BBBB",int(ipO1[0]),int(ipO1[1]),int(ipO1[2]),int(ipO1[3])) 
ipD = raw_input('Ingrese la direccion IP destino: ') ipD1 = 
ipD.split('.') ipDest = 
struct.pack("!BBBB",int(ipD1[0]),int(ipD1[1]),int(ipD1[2]),int(ipD1[3])) 
#IPs 
#datosIP cabIP = struct.pack('!1s1s2s2shB1sH4s4s',unhexlify('45'),tipoServicio,longitudT,identificador,flag_Pos,tiempoVida,ptIP,SCC,ipOr,ipDest) 
SCC = checksum(cabIP) cabIP = 
struct.pack('!1s1s2s2shB1sH4s4s',unhexlify('45'),tipoServicio,longitudT,identificador,flag_Pos,tiempoVida,ptIP,socket.htons(SCC),ipOr,ipDest) 
#datosIcmp tipo = 8 codigo = 0x00 check = 0x0000 identificador = int((id(1) * random.random()) % 65535) secuencia = 0x0000 
#datos = 'qwertyasdfghzxcvbn0102030405060708091011121314151617181920' datos = 
1 * 'Q' 
#datosIcmp cabIcmp = struct.pack('!bbHHh',tipo,0,0,identificador,1) my_checksum = ultimo(cabIcmp + datos) cabIcmp = 
struct.pack('!bbHHh',tipo,0,socket.htons(my_checksum),identificador,1) 
cabIcmp = cabIcmp + datos tiempo = datetime.now() print tiempo for i 
in range(15): s.send(cabEther + cabIP + cabIcmp,0) 
+1

Что это за беспорядок кода? Даже если вы исправите форматирование, чтобы мы могли его прочитать, что он должен делать _do_ и _why_? Как это связано с вопросом? И что именно вы застряли? – abarnert

ответ

3

Ваш вопрос едва понятен. Похоже, вы спрашиваете, как создать ICMP-пакет ECHO, так как пакет, который вы создаете в указанном коде, как сообщается в вашей системе. Я постараюсь ответить, почему ваш код не будет работать.

Во-первых, неправильный тип сокета. Вам нужно 1-го типа, а не 8. Это может быть сделано достаточно легко с третьего параметра:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) 

(. Примечание вам нужно корневые или администратора, чтобы сделать этот вызов)

Во-вторых, после создания сокет, вам нужно создать заголовок ICMP. Заголовок ICMP состоит из следующей структуры:

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
0 |  Type  |  Code  |   Checksum    | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
4 |       REST OF HEADER      | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

Обратите внимание, что вторые четыре байта «ОТДЫХ НА ГОЛОВКУ». Этот второй набор из четырех байтов зависит от TYPE/CODE в первых двух байтах.Например, если TYPE равен 0, а CODE равен 0, это означает, что вы имеете дело с эхо-ответом, и, как таковой, второй четыре байта станет 2-байтным Идентификатор и 2-байтовый Последовательность полей, начиная по смещению 4 и заканчивая смещением 7, как показано на рисунке:

0     1     2     3 
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
0 |  Type  |  Code  |   Checksum    | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
4 |   Identifier   |  Sequence Number  | 
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
8 |  Data ... 
    +-+-+-+-+- 

чтобы создать этот заголовок, я собираюсь использовать тип 8, эхо-структуру запроса, как таковой (заметим, что байты 4-5 и 6 -7 в этом создании просто для иллюстрации, обычно это будут разные значения, отличные от нуля):

icmp = struct.pack(">BBHHH", 8, 0, 0, 0, 0) 

При этом первоначальном создании заголовка контрольная сумма равна нулю. Что нам теперь нужно, чтобы фактически вычислить контрольную сумму (с этим нулевым значением), а затем воссоздать заголовок с новым значением контрольной суммы:

icmp = struct.pack(">BBHHH", 8, 0, cksum(icmp), 0, 0) 

Но это, где ваш код неверен снова. Ошибка i_checksum(). Чтобы исправить это, я оставлю это вам, чтобы понять это. Контрольная сумма называется дополнением 1, и в ней много статей в Интернете, а также код C на системах Linux, которые его реализуют.

После того, как у вас есть заголовок и его правильная контрольная сумма (важно, потому что ваша система не будет посылать пакет, если неправильно), вы просто отправить его куда-нибудь:

s.sendto(icmp, (SOME_REMOTE_HOST, 0)) 

А потом получить ответы если:

s.recvfrom(1500) 

(Обратите внимание, я выбрал 1500 байт, как это MTU из IP-кадра, и, таким образом, вряд ли ответ будет больше, чем это, хотя это, конечно, возможно.)

И НА ЭТОЙ ТОЧКЕ ВАШЕ КОДЕКС ПОЛНОСТЬЮ НЕИСПРАВНОСТИ - просто потому, что у вас нет кода, который выполняет последние два шага, не говоря уже о дополнительном коде для обработки того, что делать с ответами и структурного разбора полей заголовка.

Что касается других двух функций, которые вы определили, они странные. Один из них, по-видимому, подразумевает, что он имеет дело с полями уровня ссылок, что никогда не бывает в сокетах, поскольку сокеты имеют дело только с IP-слоем и выше - в то время как другие, похоже, пытаются вычислить контрольную сумму ... хотя и неправильно (еще раз).

Вкратце, поскольку abarnert подразумевается, пожалуйста, уточните (и добавьте еще несколько) код И ваш вопрос.