raw ソケットを使用して、IP パケットに含まれるものを把握しようとしています。私は C++ で書いていますが、これまでのところ、次のコードを使用してパケット全体を出力できました。
int CreateRawSocket(int protocol_to_sniff)
{
int s
if(s = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff)
{
perror("Error creating raw socket");
exit(1);
}
return s;
}
void PrintPacket(unsigned char *packet, int len)
{
unsigned char *p = packet;
printf("\n--Packet start--\n");
while(len--)
{
printf("%.2x ", *p);
p++;
}
printf("\n--Packet end--\n");
}
int main()
{
int length, s, packets_to_sniff;
unsigned char *packet_buffer;
s = CreateRawSocket(ETH_P_ALL);
if(s == -1)
{
perror("Error creating socket");
exit(1);
}
packet_buffer = (unsigned char *)malloc(1518);
printf("Number of packets to sniff?: ");
cin >> packets_to_sniff;
while(packets_to_sniff--)
{
length = recvfrom(s, packet_buffer, ETH_FRAME_LEN, 0, NULL, NULL);
if(length == -1)
{
perror("Error recieving packet");
exit(1);
}
else
{
printf("Packet number: " + packets_to_sniff);
PrintPacket(packet_buffer, length);
}
}
}
プログラミングしている仮想マシンにpingを送信している仮想マシンがあり、プログラムが印刷しているように見えるのは、16進数であると思われるパケットのMACフレームだけです..
IP ヘッダーを読み取って、ヘッダーのどのフィールドにどのような情報が含まれているかを調べたいと思います。
少し似ています:
printf(packet_buffer[0]);
printf(packet_buffer[1]);
奇妙に思える出力を得ることなく、それを試しました。
よろしくお願いします!