写arp包问题

star19678051 2010-04-28 02:44:38
#define WIN32
#define HAVE_REMOTE
#include <stdio.h>
#include "winsock2.h"
#include "pcap.h"
#include "Packet32.h"
#pragma comment(lib, "ws2_32.lib")

typedef struct DLCHEADER
{
unsigned char eth_addr_des[6];//以太网目的地址
unsigned char eth_addr_src[6];//以太网源地址
unsigned short frame_type; //帧类型
}DlcHeader;

typedef struct ARPFRAME
{
unsigned short hwtype; //硬件类型
unsigned short protrol_type; //协议类型
unsigned char hw_length; //硬件地址长度
unsigned char pro_length; //协议地址长度
unsigned short op; //ARP包类型;
unsigned char mac_src[6];//发送端以太网地址
unsigned long ip_src; //发送端IP地址
unsigned char mac_des[6];//目的以太网地址
unsigned long ip_des; //目的IP地址
unsigned char pading[18]; //填充位
}ArpFrame;

typedef struct ARPPACKET
{
DlcHeader arp_header;
ArpFrame arp_frame;
}ArpPacket;

/****************************************************************************
* Name & Params::
* formatStrToMAC
* (
* const LPSTR lpHWAddrStr : 用户输入的MAC地址字符串
* unsigned char *HWAddr : 返回的MAC地址字符串(赋给数据包结构体)
* )
* Purpose:
* 将用户输入的MAC地址字符转成数据包结构体需要的格式
****************************************************************************/
void formatStrToMAC(const LPSTR lpHWAddrStr, unsigned char *HWAddr)
{
unsigned int i, index = 0, value, temp;
unsigned char c;
_strlwr(lpHWAddrStr); // 转换成小写
for (i = 0; i < strlen(lpHWAddrStr); i++)
{
c = *(lpHWAddrStr + i);
if (( c>='0' && c<='9' ) || ( c>='a' && c<='f' ))
{
if (c>='0' && c<='9') temp = c - '0'; // 数字
if (c>='a' && c<='f') temp = c - 'a' + 0xa; // 字母
if ( (index % 2) == 1 )
{
value = value*0x10 + temp;
HWAddr[index/2] = value;
}
else value = temp;
index++;
}
if (index == 12) break;
}
}

void GenArpPacket(ArpPacket *APbuf)
{
int i;
memset(APbuf,0,sizeof(*APbuf));
formatStrToMAC("00e0524ca312",APbuf->arp_header.eth_addr_src);
formatStrToMAC("ffffffffffff",APbuf->arp_header.eth_addr_des);
APbuf->arp_header.frame_type=htons((u_short)0x0806);
APbuf->arp_frame.hwtype=htons((u_short)1);//以太网类型
APbuf->arp_frame.protrol_type=htons((u_short)0x0800);
APbuf->arp_frame.hw_length=(u_char)6;
APbuf->arp_frame.pro_length=(u_char)4;
APbuf->arp_frame.op=htons((u_short)0x0001);
formatStrToMAC("00e0524ca312",APbuf->arp_frame.mac_src);
APbuf->arp_frame.ip_src=inet_addr("202.192.165.169");
formatStrToMAC("ffffffffffff",APbuf->arp_frame.mac_des);
APbuf->arp_frame.ip_des=inet_addr("202.192.165.199");
for(i=0;i<18;i++)
APbuf->arp_frame.pading[i]=i;
}






int main()
{
pcap_if_t *alldevs;
pcap_if_t *d;
int inum;
int i=0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
int ret=-1;
int MaxPacketLen=100;
ArpPacket *pbuf;
u_char *pBuf;

/* 获取本机网络设备列表*/
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL,
&alldevs, errbuf) == -1)
{
fprintf(stderr,
"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 打印网络设备列表*/
for(d=alldevs; d; d=d->next)
{
printf("%d. %s", ++i, d->name);
if (d->description)
printf(" (%s)\n", d->description);
else
printf(" (No description available)\n");
}

if(i==0)
{
printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
return -1;
}

/*选择网络设备接口*/
printf("Enter the interface number (1-%d):",i);
scanf("%d", &inum);

if(inum < 1 || inum > i)
{
printf("\nInterface number out of range.\n");
/* 释放设备列表*/
pcap_freealldevs(alldevs);
return -1;
}

/* 跳转到选中的适配器*/
for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);

/* 打开设备*/
if ( (adhandle= pcap_open(d->name, 65536,
PCAP_OPENFLAG_PROMISCUOUS, 1000, NULL,errbuf) )
== NULL)
{
fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d->name);
/* 释放设备列表*/
pcap_freealldevs(alldevs);
return -1;
}

/*在选中的设备接口上监听数据*/
printf("\nlistening on %s...\n", d->description);


pbuf=(ArpPacket *)malloc(sizeof(ArpPacket));
GenArpPacket(pbuf);
if ( (ret=pcap_sendpacket(adhandle,pbuf,sizeof(ArpPacket)))
!=0)
{
printf("发送失败\n");
pcap_close(adhandle);
pcap_freealldevs(alldevs);
return -1;
}
else
printf("发送成功\n");


/*释放资源*/
free(pbuf);
pcap_close(adhandle);
pcap_freealldevs(alldevs);

getch();
}

请高手们看看有没有错,程序是可以运行的,而且还显示到发送成功,但我用WireShark捕获时却捕获不到,通过指定IP地址和ARP协议为条件进行捕获的,我现在不知道是程序错误还是捕获那方面出错啊!!!!!郁闷
...全文
99 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
star010513 2010-05-10
  • 打赏
  • 举报
回复
是可以捕获到的,问题出在你编程那里,仔细看看吧
vincent_1011 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 star19678051 的回复:]

我是在发送方捕获的~~应该可以捕获到自己的请求包吧,而且如果请求成功也应该捕获的回应包
可惜我两个都捕获不到~~
[/Quote]

我还真不好说你能捕获到自己发出去的消息。因为你的发送协议驱动和捕获用到的协议驱动的关系是平行的
star19678051 2010-04-28
  • 打赏
  • 举报
回复
我是在发送方捕获的~~应该可以捕获到自己的请求包吧,而且如果请求成功也应该捕获的回应包
可惜我两个都捕获不到~~
vincent_1011 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 r11222 的回复:]

在学校做arp攻击会给人找上宿舍算账的。。。
[/Quote]
你以为ARP攻击能找到源头啊?
r11222 2010-04-28
  • 打赏
  • 举报
回复
在学校做arp攻击会给人找上宿舍算账的。。。
vincent_1011 2010-04-28
  • 打赏
  • 举报
回复
是在接收主捕获吗?

这鸟东西官方都有sample,我毕业也是搞这个。打算到答辩前一天再做。哈
xinzaiyiqi 2010-04-28
  • 打赏
  • 举报
回复
莫非这就是传说中的C网络编程
不懂,帮顶

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧