Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 14, 2010 19:17:38

vnaz
От:
Зарегистрирован: 2010-01-14
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с AF_PACKET (SOCK_RAW)

на питоне под линуксом пробую выполнить следующее:

import socket, array;

a= array.array(“B”,( 0x00, 0x26, 0x5a, 0x9a, 0xd9, 0xd2, 0x08, 0x00, 0x27, 0xdb, 0xf0, 0x66, 0x08, 0x00, 0x45, 0x00, \
0x00, 0x54, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0xf9, 0xc6, 0xc0, 0xa8, 0x00, 0x66, 0x5b, 0xc6, \
0x24, 0x0e, 0x08, 0x00, 0x27, 0x98, 0x75, 0x08, 0x00, 0x01, 0xdd, 0x46, 0x4f, 0x4b, 0x3c, 0xc9, \
0x07, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, \
0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, \
0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f));
str =a.tostring();

s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW,0);
s.bind((“eth0”,0));
s.send(str);

при этом tcpdump выдает

8:58:02.484933 IP truncated-ip - 8 bytes missing! vit-linux.local > www.i.ua: ICMP echo request, id 29960, seq 1, length 64
0x0000: 0026 5a9a d9d2 0800 27db f066 0800 4500 .&Z…..'..f..E.
0x0010: 0054 0000 4000 4001 f9c6 c0a8 0066 5bc6 .T..@.@……f[.
0x0020: 240e 0800 2798 7508 0001 dd46 4f4b 3cc9 $…'.u….FOK<.
0x0030: 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 …………….
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 ………..!

вместо

8:58:02.484933 IP truncated-ip - 8 bytes missing! vit-linux.local > www.i.ua: ICMP echo request, id 29960, seq 1, length 64
0x0000: 0026 5a9a d9d2 0800 27db f066 0800 4500 .&Z…..'..f..E.
0x0010: 0054 0000 4000 4001 f9c6 c0a8 0066 5bc6 .T..@.@……f[.
0x0020: 240e 0800 2798 7508 0001 dd46 4f4b 3cc9 $…'.u….FOK<.
0x0030: 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 …………….
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 ………..!

т.е. отрезает 8 байт и следовательно никакого ответа от www.i.ua я не получаю

пробовал строку сохранить в файл, тас все на меесте т.е проблема в строке
s.send(str);

может кто-то что-то подскажет?



Офлайн

#2 Янв. 14, 2010 19:49:10

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

проблема с AF_PACKET (SOCK_RAW)

Может трабла и не в этом, но всё же попробуй socket.send_all…

P.S. У тебя два одинаковых дампа. :-)



Офлайн

#3 Янв. 14, 2010 20:19:37

vnaz
От:
Зарегистрирован: 2010-01-14
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с AF_PACKET (SOCK_RAW)

socket.send_all не нашел

>>> dir(s)


написал s.sendall(str) - не помогло

выдает все тоже

20:11:25.589875 IP truncated-ip - 8 bytes missing! vit-linux.local > www.i.ua: ICMP echo request, id 29960, seq 1, length 64
0x0000: 0026 5a9a d9d2 0800 27db f066 0800 4500 .&Z…..'..f..E.
0x0010: 0054 0000 4000 4001 f9c6 c0a8 0066 5bc6 .T..@.@……f[.
0x0020: 240e 0800 2798 7508 0001 dd46 4f4b 3cc9 $…'.u….FOK<.
0x0030: 0700 0809 0a0b 0c0d 0e0f 1011 1213 1415 …………….
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 ………..!

при нормальном пинге:

20:12:07.556087 IP vit-linux.local > www.i.ua: ICMP echo request, id 37638, seq 1, length 64
0x0000: 0026 5a9a d9d2 0800 27db f066 0800 4500 .&Z…..'..f..E.
0x0010: 0054 0000 4000 4001 f9c6 c0a8 0066 5bc6 .T..@.@……f[.
0x0020: 240e 0800 7ecf 9306 0001 775e 4f4b 2c7c $…~…..w^OK,|
0x0030: 0800 0809 0a0b 0c0d 0e0f 1011 1213 1415 …………….
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ………..!“#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f &'()*+,-./

20:12:07.564447 IP www.i.ua > vit-linux.local: ICMP echo reply, id 37638, seq 1, length 64
0x0000: 0800 27db f066 0026 5a9a d9d2 0800 4530 ..'..f.&Z…..E0
0x0010: 0054 7b43 0000 3801 c653 5bc6 240e c0a8 .T{C..8..S[.$…
0x0020: 0066 0000 86cf 9306 0001 775e 4f4b 2c7c .f……..w^OK,|
0x0030: 0800 0809 0a0b 0c0d 0e0f 1011 1213 1415 …………….
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ………..!”#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f &'()*+,-./



Офлайн

#4 Янв. 14, 2010 21:17:33

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с AF_PACKET (SOCK_RAW)

Офлайн

#5 Янв. 15, 2010 00:36:54

vnaz
От:
Зарегистрирован: 2010-01-14
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с AF_PACKET (SOCK_RAW)

в указаном источнике сокет создается так
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('icmp'));
я также нашел аналогичную программу (http://www.g-loaded.eu/2009/10/30/python-ping/), проверил, она работает с точки зрения отправки пингов, но сокет создается с другой “socket_family”

если у меня в программе изменить

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname(“icmp”));
s.sendto(str, (“i.ua”,1));

то проблема с IP truncated-ip - 8 bytes missing! исчезает и получается что-то типа:

00:17:08.828956 IP vit-linux.local > www.i.ua: ICMP echo reply, id 55762, seq 2048, length 90
0x0000: 0026 5a9a d9d2 0800 27db f066 0800 4500 .&Z…..'..f..E.
0x0010: 006e 0000 4000 4001 f9ac c0a8 0066 5bc6 .n..@.@……f[.
0x0020: 240e 0026 5b9a d9d2 0800 27db f066 0800 $..&[…..'..f..
0x0030: 4600 0054 0000 4000 4001 f9c6 c0a8 0066 F..T..@.@……f
0x0040: 5b00 240e 0800 2798 7508 0001 dd46 4f4b [.$…'.u….FOK
0x0050: 3cc9 0700 0809 0a0b 0c0d <………

хотя ответы с i.ua и не идут, но я думаю это можно легко решить, но проблема заключается в другом, при использовании socket.AF_INET сокет сам себя коректирует, и если я исправляю строку данных например так:

(в квадратных скобках измененные данные)

a1= array.array(“B”,( 0x00, 0x26, , 0x9a, 0xd9, 0xd2, 0x08, 0x00, 0x27, 0xdb, 0xf0, 0x66, 0x08, 0x00, , 0x00, \
0x00, 0x54, 0x00, 0x00, 0x40, 0x00, 0x40, 0x01, 0xf9, 0xc6, 0xc0, 0xa8, 0x00, 0x66, 0x5b, , \
0x24, 0x0e, 0x08, 0x00, 0x27, 0x98, 0x75, 0x08, 0x00, 0x01, 0xdd, 0x46, 0x4f, 0x4b, 0x3c, 0xc9, \
0x07, 0x00, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, \
0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, \
0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f));

то на выходе я получаю все-равно
0x0000: 0026 5a9a d9d2 0800 27db f066 0800 4500 .&Z…..'..f..E.
0x0010: 006e 0000 4000 4001 f9ac c0a8 0066 5bc6 .n..@.@……f[.
0x0020: 240e 0026 5b9a d9d2 0800 27db f066 0800 $..&[…..'..f..
0x0030: 4600 0054 0000 4000 4001 f9c6 c0a8 0066 F..T..@.@……f
0x0040: 5b00 240e 0800 2798 7508 0001 dd46 4f4b [.$…'.u….FOK
0x0050: 3cc9 0700 0809 0a0b 0c0d <………

если в первой строке данные канального уровня (мак адреса) то их изменение еще простительно, но данные во второй строчке это уже
DestinationAddress для ipv4 пакета. Тогда спрашивается в чем заслуга socket.SOCK_RAW, если он игнорирует мои данные.


При использовании socket.AF_PACKET все точно так, как написано в исходной строке строке.

Задача стоит в том чтобы посылать именно RAW пакеты а не сгенерированые системой. В описаном выше примере программы я взял демп посланого ранее посредством программы ping пакета и пытался послать его повторно через питон, не меняя ни одного из полей заголовков…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version