TCPdump удаляет заголовки при получении пакетов? - PullRequest
0 голосов
/ 20 ноября 2018

Итак, я пытаюсь отправить уже созданный пакет через интерфейс сокета RAW (это пакеты, которые были ранее перехвачены, и я хочу повторно отправить их без изменения целостности пакета), и я использую TCPdump, чтобы проверить, что пакеты идутправильно (неожиданно они не являются).

Пакеты отправляются физически, но всегда на 24 байта меньше того, что возвращает мой "отправленный".

В wireshark мои заголовки eth стираются, поскольку мои MAC-адреса source и dest являются "00: 00: 00: 00: 00

установка носка выглядит следующим образом

sock = socket(AF_PACKET,SOCK_RAW,IPPROTO_RAW);
if(sock==-1)
{
    qDebug() << "sock error";
}

int reuse = 1;

if(setsockopt(sock, IPPROTO_RAW, IP_HDRINCL, (char *)&reuse, sizeof(reuse)) < 0)
{
    qDebug() << "error setting reuse"
}
else
{
    "setting reuse"
}

struct sockaddr_ll sll;
struct ifreq ifr;

bzero(&sll, sizeof(sll));
bzero(&ifr, sizeof(ifr));

sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(IPPROTO_RAW);
sll.sll_halen = ETH_ALEN;

strncpy((char*)ifr.ifr_ifrn.ifrn_name,interface.toUtf8.constData(),IFNAMSIZ);
if(ioctl(sock,SIOCGIFINDEX,&ifr) == -1)
{
   qDebug() << "error getting interface name";
}
strncpy((char*)ifr.ifr_ifrn.ifrn_name,interface.toUtf8.constData(),IFNAMSIZ);
if(ioctl(sock,SIOCGIFHWADDR,&ifr) == -1)
{
   qDebug() << "error getting interface name";
}

if(bind(sock,(struct sockaddr *)&sll,sizeof(sll))==-1)
{
   qDebug() << "error binding sock";
}

после этого я использую

int size = write(sock,(const void*)&packet,hdr.caplen);

Я пытался отправить в прошломно это всегда переконфигурирует вещи, так что это было мое следующее решение, которое также не работает так, как мне бы хотелось.

Я не очень разбираюсь в TCP / IP, поэтому любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 20 ноября 2018

хорошо, поэтому, попробовав кучу разных вещей, я нашел то, что кажется моим решением.

я создал второй указатель, который будет указывать на верх пакета и отправлять его вместо этого.

(char *)sendingPacket;
struct ethhdr *ethh = (struct ethhdr*)packet;
sendingPacket = (char*) ethh;

Я не очень понимаю, почему это работает, но отправка другого пакета не так, если у кого-то есть понимание, пожалуйста, поделитесь!

...