Я посещаю занятия по компьютерной и сетевой безопасности.Мы пишем пакетный спуфер.Я мог бы просто скачать один из Интернета и использовать его, но я предпочитаю писать материал сам.Ниже приведена структура, которую я использую для представления заголовка ip, который я основываю на статье Википедии .Я пытаюсь отправить пинг-пакет icmp.Я сделал это успешно, но только после присвоения значения длины заголовка ip полю версии, и наоборот.Каким-то образом я неправильно настроил свою структуру или неправильно присваиваю значения, и я не уверен, что делаю неправильно.
struct ip_header
{
uint8_t version : 4 // version
, ihl : 4; // ip header length
uint8_t dscp : 6 // differentiated services code point
, ecn : 2; // explicit congestion notification
uint16_t total_length; // entire packet size in bytes
uint16_t identification; // a unique identifier
uint16_t flags : 3 // control and identify fragments
, frag_offset : 13; // offset of fragment relative to the original
uint8_t ttl; // how many hops the packet is allowd to travel
uint8_t protocol; // what protocol is in use
uint16_t checksum; // value used to determine bad packets
uint32_t src_ip; // where the packet is form
uint32_t dest_ip; // where the packet is going
};
Если я назначу version
и ihl
, как показано нижеwireshark сообщает об ошибке с заголовком «Bogus IPV4 version (0, должно быть 4)».
char buffer[1024];
struct ip_header* ip = (struct ip_header*) buffer;
ip->version = 4;
ip->ihl = 5;
Однако после перехода к следующему листингу ICMP-запрос проходит нормально.
char buffer[1024];
struct ip_header* ip = (struct ip_header*) buffer;
ip->version = 5;
ip->ihl = 4;
Я попытался поместить htons
вокруг чисел, но это, похоже, не приносит никакой пользы.Что мне здесь не хватает?