#include <stdio.h>
#include <winsock2.h>
#include <mstcpip.h>
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"IPHLPAPI.lib")//获取本地网络信息的开发接口
typedef unsigned char byte;
int main()
{
//初始化
WSADATA wsadata;
WSAStartup(MAKEWORD(2, 2), &wsadata);
//创建原始socket
SOCKET raw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
if (raw ==INVALID_SOCKET)
{
printf("请用管理员身份运行\n"); Sleep(2000); return 0;
}
//获取主机名
char hostname[200] = { 0 };
gethostname(hostname, 200);
hostent* Phostname = gethostbyname(hostname);
//获取主机名下的所有IP网卡
int i = 0;
for (; Phostname->h_addr_list[i]; i++)
{
printf(" %d %s\n", i+1, inet_ntoa(*(struct in_addr*)Phostname->h_addr_list[i]));
}
//选择网卡
int chose = 0;
printf("选择网卡:");
scanf("%d", &chose);
if (chose > i || chose <= 0)
{
printf("输入错误\n"); Sleep(2000); exit(0);
}
//创建网卡绑定参数
SOCKADDR_IN net;
net.sin_family = AF_INET;
memcpy(&net.sin_addr.S_un.S_addr, Phostname->h_addr_list[chose - 1], Phostname->h_length);
net.sin_port = htons(80);
if (bind(raw, (const sockaddr *)&net, sizeof(net)) == SOCKET_ERROR)
{
printf("绑定网卡失败\n"); Sleep(2000); return 0;
}
//设置网卡为混杂模式
u_long IO = 1;
ioctlsocket(raw, SIO_RCVALL, &IO);
//开始循环接受数据
while (true)
{
char data[2000] = { 0 };
ZeroMemory(data, sizeof(data));
int ret = recv(raw, data, sizeof(data), 0);
if (ret > 0 && data[0] == 0x45)
{
switch ((byte)data[9])//下层协议类型
{
case 0x06://tcp
{
printf("TCP %d.%d.%d.%d:%d-->%d.%d.%d.%d:%d TTL=%d len=%d\n",
(byte)data[12], (byte)data[13], (byte)data[14], (byte)data[15], (byte)data[20] * 256 + (byte)data[21],
(byte)data[16], (byte)data[17], (byte)data[18], (byte)data[19], (byte)data[22] * 256 + (byte)data[23],
(byte)data[8], ret - 40);//长度需要减去帧头长度
break;
}
case 0x17://udp
{
printf("UDP %d.%d.%d.%d:%d-->%d.%d.%d.%d:%d TTL=%d len=%d\n",
(byte)data[12], (byte)data[13], (byte)data[14], (byte)data[15], (byte)data[20] * 256 + (byte)data[21],
(byte)data[16], (byte)data[17], (byte)data[18], (byte)data[19], (byte)data[22] * 256 + (byte)data[23],
(byte)data[8], ret - 28);
break;
}
case 0x01://icmp
{
if (data[20] == 0x08)
{
printf("ICMP Q %d.%d.%d.%d-->%d.%d.%d.%d TTL=%d %d\n",
(byte)data[12], (byte)data[13], (byte)data[14], (byte)data[15],
(byte)data[16], (byte)data[17], (byte)data[18], (byte)data[19],
(byte)data[8], ret - 28);
break;
}
if (data[20] == 0x00)
{
printf("ICMP A %d.%d.%d.%d-->%d.%d.%d.%d TTL=%d %d\n",
(byte)data[12], (byte)data[13], (byte)data[14], (byte)data[15],
(byte)data[16], (byte)data[17], (byte)data[18], (byte)data[19],
(byte)data[8], ret - 28);
break;
}
}
default:
//打印原始数据 (其他需要的类型自己添加)
/* {
for (int i = 0; i < ret; i++)
{
printf("%02X", (byte)data[i]);
}
printf(" %d\n", ret);
}*/
break;
}
}
else
{
printf("发生错误!\n"); Sleep(2000);
break;
}
}
//关闭socket
closesocket(raw);
WSACleanup();
return 0;
}
C语言Windows下 抓包
于 2022-12-16 14:44:19 首次发布