#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <linux/if_ether.h>
#include <linux/in.h>
//#include <arpa/inet.h>
#define BUFFER_MAX 2048
struct my_ethhdr {
unsigned char h_dest[ETH_ALEN];
unsigned char h_source[ETH_ALEN];
unsigned short h_proto;
};
struct my_arphdr {
unsigned short ar_hrd;
unsigned short ar_pro;
unsigned char ar_hln;
unsigned char ar_pln;
unsigned short ar_op;
unsigned char ar_sha[ETH_ALEN];
unsigned char ar_sip[4];
unsigned char ar_tha[ETH_ALEN];
unsigned char ar_tip[4];
};
struct my_iphdr {
unsigned char ihl:4, version:4;
unsigned char tos;
unsigned short tot_len;
unsigned short id;
unsigned short frag_off;
unsigned char ttl;
unsigned char protocol;
unsigned short check;
unsigned int saddr;
unsigned int daddr;
};
struct my_tcphdr {
unsigned short source;
unsigned short dest;
unsigned int seq;
unsigned int ack_seq;
unsigned short res1:4, doff:4, fin:1, syn:1, rst:1, psh:1, ack:1, urg:1, res2:2;
unsigned short window;
unsigned short check;
unsigned short urg_ptr;
};
struct my_udphdr {
unsigned short source;
unsigned short dest;
unsigned short len;
unsigned short check;
};
struct my_icmphdr {
uint8_t type;
uint8_t code;
uint16_t checksum;
uint32_t data;
};
void uint32_ip_2_str_ip(uint32_t ip,char *str_ip) {
unsigned char bytes[4];
bytes[0] = (ip >> 24) & 0xFF;
bytes[1] = (ip >> 16) & 0xFF;
bytes[2] = (ip >> 8) & 0xFF;
bytes[3] = ip & 0xFF;
sprintf(str_ip,"%d.%d.%d.%d", bytes[0], bytes[1], bytes[2], bytes[3]);
}
int main(int argc, char *argv[])
{
int sock, n_read, proto;
char buffer[BUFFER_MAX];
struct my_ethhdr *ethhead;
struct my_iphdr *iphead;
struct my_tcphdr *tcphead;
struct my_udphdr *udphead;
struct my_icmphdr *icmphead;
char *p;
if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))) < 0)
{
fprintf(stdout, "create socket error/n");
exit(0);
}
while(1)
{
n_read = recvfrom(sock, buffer, 2048, 0, NULL, NULL);
if(n_read < 46)
{
fprintf(stdout, "以太网帧数据长度最小为 46 字节\n");
continue;
}
ethhead = (struct my_ethhdr *)buffer;
int n = 0XFF;
printf("MAC: %.2X:%02X:%02X:%02X:%02X:%02X==>""[%x]""==>"
"%.2X:%.2X:%.2X:%.2X:%.2X:%.2X\n",
ethhead->h_dest[0], ethhead->h_dest[1], ethhead->h_dest[2], ethhead->h_dest[3], ethhead->h_dest[4], ethhead->h_dest[5],ntohs(ethhead->h_proto),
ethhead->h_source[0], ethhead->h_source[1], ethhead->h_source[2], ethhead->h_source[3], ethhead->h_source[4], ethhead->h_source[5]);
iphead = (struct my_iphdr *)(buffer + 14);
char sip[32] = {};
char dip[32] = {};
uint32_ip_2_str_ip(ntohl(iphead->saddr),sip);
uint32_ip_2_str_ip(ntohl(iphead->daddr),dip);
printf("IP: %s ==[%d]=> %s\n",sip,iphead->protocol,dip);
}
}
原始套接字嗅探带arp报文
最新推荐文章于 2024-09-05 11:21:56 发布