无法在这个位置找到: head2.htm
当前位置: 建站首页 > 新闻动态 > 公司新闻 >

WinPcap开发设计(一):零基本新手入门

时间:2021-01-29 22:31来源:未知 作者:jianzhan 点击:
互联网程序编写在互联网安全性层面具备至关重要的功效,怎样便捷高效率的监视、剖析、结构互联网总流量,变成许多安全性从事者必须处理的关键难题。而winpcap这一完全免费开源系

互联网程序编写在互联网安全性层面具备至关重要的功效,怎样便捷高效率的监视、剖析、结构互联网总流量,变成许多安全性从事者必须处理的关键难题。而winpcap这一完全免费开源系统新项目正好能够为win32运用程序出示浏览互联网最底层的工作能力,因此其变成了有关互联网程序编写的优选开发设计专用工具。
0 01 winpcap是啥?
winpcap(windows packet capture)是windows服务平台下一个完全免费的互联网浏览系统软件,能用于windows系统软件下的互联网程序编写。知名的wireshark就是根据winpcap开发设计的,大伙儿在安裝wireshark中能看到winpcap驱动器程序的安裝全过程。
相关winpcap的详细介绍互联网上许多,百度百科里边详细介绍的也很详尽,我也已不copy了。必须留意的一点是,winpcap其实不是一个简易的library,只是一个对于Win32服务平台上的抓包软件和互联网剖析的一个构架,它包含一个关键态的包过虑器,一个最底层的动态性连接库(packet.dll)和一个高层住宅的不依靠于系统软件的库(wpcap.dll)。因此它只有 嗅探 到物理学路线上的数据信息包,而不具有阻拦的工作能力,因而不适感用以本人防火安全墙等新项目。
0 02 你必须提前准备些甚么?
0 03 你可以学得甚么?
1.  Winpcap获得网口基本资料及收取和发送数据信息包
2.  生存服务器检测
3.  端口号扫描仪
4.  Arp蒙骗
5.  正中间人进攻的简易完成
6.  总流量统计分析与剖析
0 04 专业知识填补
开展下边的详细介绍前,大家必须掌握好多个名词的关联。
winpcap(windows packet capture)是windows服务平台下一个完全免费的互联网浏览系统软件,能用于windows系统软件下的互联网程序编写。linux 服务平台下相匹配的开发设计包是libpcap。
Wireshark是根据winpcap解决互联网驱动器层。
Wpdpack是winpcap的开发设计包,出示开发设计有关程序的插口。
0 05 自然环境提前准备
最先依据你选定择的开发设计語言挑选相匹配的编译程序器,小编应用c語言,运用VS2012开展有关开发设计。

 
安裝好编译程序器后,开展有关配备。免费下载wpdpack点一下这儿
新手能够挑选里边的Examples开展编译程序,能看到找不着头文档,及有关库。
 

 
它是由于wpdpack中的有关库还没有有引进到编译程序自然环境中

 
将wpdpack包中的Include和lib文档夹中的文档加上到VS的有关文件目录下就可以编译程序根据。将编译程序后的程序开展运作则出現下列不正确。

 
它是因为运作时欠缺动态性连接库造成,非常简单的方式是立即免费下载并安裝winpcap驱动器程序 免费下载
假如你感觉那样子很不便,还可以选用简单方式。程序在运作时只必须winpcap在system32下边释放出来的wpcap.dll和packet.dll,也有driver下边的npf.sys,因此不用详细安裝winpcap,而挑选只拷贝之上三个文档到相匹配文件目录中就可以。

0 06 枚举类型能用互联网兼容器資源
在应用winpcap开展收取和发送数据信息包时,需特定相匹配的网口,因此必须列举测算机上全部能用的互联网兼容資源。
列取网口信息内容的关键编码:
//该涵数在Arpspoof程序中,小编开展了详尽注解
void ListAdapters()
{
 pcap_if_t *alldevs;//用以储存网口链表的头指针
 pcap_if_t *d;//用以解析xml网口链表的临时性自变量
  int i = 0;//纪录网口数量
char errbuf[PCAP_ERRBUF_SIZE];//储存不正确信息内容
char szGateIPAddr[16];//网口相匹配网关ip详细地址
char *p;//网口名词
 char szIPAddr[16];//网口相匹配IP
 unsigned char ucPhysicalAddr[6];//网口相匹配的MAC详细地址
  if (pcap_findalldevs( alldevs, errbuf) == -1)//获得网口链表
  {
  fprintf(stderr, Error in pcap_findalldevs: %s , errbuf);
  return;
  }
  for (d=alldevs; d; d=d- next)//解析xml网口链表
  {
  if (d- addresses != NULL (p = strchr(d- name, { )) != NULL

  Getadapterbyname(p, szIPAddr, ucPhysicalAddr,szGateIPAddr))//获得网口的相匹配信息内容
 {
 for(int j = strlen(d- description) - 1; j j--)//对网口的叙述信息内容文件格式化
 {
 if (d- description[j] == 0x20)
 d- description[j] =
 else
 break;
 }
 printf(   %d. %s IP Address. . . . . : %s , i, d- description, szIPAddr);//文件格式化輸出网口信息内容
 printf( Physical Address. . : %.2X-%.2X-%.2X-%.2X-%.2X-%.2X ,
 ucPhysicalAddr[0], ucPhysicalAddr[1], ucPhysicalAddr[2],
 ucPhysicalAddr[3], ucPhysicalAddr[4], ucPhysicalAddr[5]);
 printf( Default Gateway . . : %s , szGateIPAddr);
 i ++;
 }
  } 
  if (i==0)
  {
  printf( No interfaces found! Make sure WinPcap is installed.
  return;
  }
 
  pcap_freealldevs(alldevs);//释放出来网口链表
}
科谱Tips:
网口 是神马?
测算机与外部局域网络的联接是根据服务器箱内插进一块互联网插口板(或是是在手记本电脑上中插进一块PCMCIA卡)。work adapter)或互联网插口卡NIC(Network Interface Card),可是大量的人想要应用更加简易的名字 网口 。
运用上边的程序,大家能够查询测算机上可运用的全部网口資源,便于挑选相对的网口資源开展有关实际操作。以便有利于观查,大家在VMware虚似机中开展,最先在相匹配的虚似机设定中提升硬件配置选择项中加上多块网口,随后配备相对的IP,运作程序,能够获得相匹配网口的名字叙述、IP详细地址、MAC详细地址等。


0 07 怎样结构和推送数据信息包
上一步大家列举了全部的能用网口資源,在推送数据信息包前,必须开启相匹配的网口来开展推送数据信息包的实际操作。这儿应用的涵数是pcap_open_live:
涵数名字:pcap_t *pcap_open_live(char *device, int snaplen, int promisc, int to_ms, char *ebuf)
涵数作用:得到用以捕捉互联网数据信息包的数据信息包捕捉叙述字。
主要参数表明:device主要参数为特定开启的互联网机器设备名。snaplen主要参数界定捕捉数据信息的较大字节数数。promisc特定是不是将互联网插口放置掺杂方式。to_ms主要参数特定请求超时時间(毫秒)。ebuf主要参数则仅在pcap_open_live()涵数错误回到NULL时要于传送不正确信息。
回到值:开启的网口句柄
Arpspoof里将网口的开启实际操作开展了以下封裝,启用时立即键入网口编号就可以,程序会对主要参数2、3、4开展原始化设定:
pcap_t* OpenAdapter(int uIndexofAdapter, char szIPSelf[],
 unsigned char ucPhysicalAddr[], char szGateIPAddr[])
{
 pcap_if_t *alldevs;
 pcap_if_t *d;
 pcap_t *fp = NULL;
  int i = 0;
  char errbuf[PCAP_ERRBUF_SIZE], *p;
  /* 这一API用于得到网口的目录 */
  if (pcap_findalldevs( alldevs, errbuf) == -1)
  {
  fprintf(stderr, Error in pcap_findalldevs: %s , errbuf);
  return NULL;
  }
  /* 显示信息目录的响应字段名的內容 */
  for (d=alldevs; d; d=d- next)
  { 
 if (d- addresses != NULL (p = strchr(d- name, { )) != NULL
  Getadapterbyname(p, szIPSelf, ucPhysicalAddr, szGateIPAddr))
 { 
 if (i == uIndexofAdapter)
 {
 if ((fp = pcap_open_live(d- name, // 机器设备名字
 65536,  // portion of the packet to capture.
 // 65536 grants that the whole packet will be captured on all the MACs.
 1,  // 掺杂方式
 1, //读请求超时为10ms,越低越好
 errbuf  // error buffer
 )) == NULL)
 {
 fprintf(stderr, Unable to open the adapter.
 %s is not supported by WinPcap , d- name);
 pcap_freealldevs(alldevs);
 return NULL;

 

 }
 else
 {
 // 除掉网口注解右侧的空格符
 for(int j = strlen(d- description) - 1; j j--)
 {
 if (d- description[j] == 0x20)
 d- description[j] =
 else
 break;
 }
 printf( [*] Bind on %s %s ... , szIPSelf, d- description);
 return fp;
 }
 }
 i ++;
 }
  }
  if (i==0)
  {
  printf( No interfaces found! Make sure WinPcap is installed.
  return FALSE;
  }
  /* We don t need any more the device list. Free it */
  pcap_freealldevs(alldevs);
 return NULL;
}
 
应用案例:
pcap_t *adhandle; // 网口句柄
unsigned char ucSelf[6];
char szIPSelf[16], szIPGate[16];
if ((adhandle = OpenAdapter(0, szIPSelf, ucSelf, szIPGate)) == NULL)
{
 printf( [!] Open adatper error!
 return FALSE;
}
在获得到网口句柄并开启后,推送数据信息包就非常容易了
if(pcap_sendpacket(adhandle, (const unsigned char *) ucFrame,
 ucFrameLen) 0)
{
 printf( Send Packet Error
 return FALSE;
}
ucFrame是封裝好的数据信息包,ucFrameLen为数据信息包的长短。
下边大家封裝一个案子,应用所述编码推送ARP恳求包,用以查寻某IP相匹配的MAC详细地址。
ARP协议书文件格式

 
重要编码
bool sendARPData(pcap_t *adhandle)
{
 u_char ucFrame[ARP_LEN];
 // 头
 ETHeader eh = { 0 };
 memset(eh.dhost,0xff, 6);//ARP广播节目包目地详细地址为ffffffffffff
 memcpy(eh.shost, ucSelf, 6);
 eh.type = htons(ETHERTYPE_ARP);//帧种类为ARP
 memcpy(ucFrame, eh, sizeof(eh));
 
 // 设定Arp头
 ARPHeader ah = { 0 };
 ah.hrd = htons(ARPHRD_ETHER);
 ah.eth_type = htons(ETHERTYPE_IP);
 ah.maclen = 6;//硬件配置详细地址长短
 ah.iplen = 4;//IP详细地址长短
 ah.opcode = htons(ARP_REQUEST);//ARP恳求包种类
 memcpy(ah.smac, ucSelf, 6);
 ah.saddr = inet_addr(szIPSelf); 
 memset(ah.dmac, 0x00, 6);//ARP恳求包中目地MAC详细地址均置0
 ah.daddr = inet_addr( 192.168.0.2   //ARP恳求的目地IP详细地址
 
 memcpy( ucFrame[sizeof(ETHeader)], ah, sizeof(ah));
 
 // 推送ARP数据信息包
 if(pcap_sendpacket(adhandle, (const unsigned char *) ucFrame,ARP_LEN) 0)
 {
 printf( Send Packet Error
 return FALSE;
 }
 return TRUE; 
}
 
起动wireshark开展监视,运作程序,大家能看到以下結果,程序传出了一个ARP广播节目包,用以查寻192.168.0.2的服务器MAC,而且总体目标机在接到该查寻包后,开展了回应,将自身的MAC详细地址告知了查寻进行的设备。

0 08 怎样监视剖析数据信息包
在监视数据信息包时,应用的重要涵数为pcap_loop
涵数名字:int pcap_loop(pcap_t * p,t, pcap_handler callback, uchar * user);
主要参数表明:
p 是由pcap_open_live()回到的所开启的网口的指针;
cnt用以设定所捕捉数据信息包的数量;
callback 是回调函数涵数,其原形为pcap_callback(u_char* argument,const struct pcap_pkthdr* packet_header,const u_char* packet_content)
;user值通常是NULL
融合上边的编码,大家在得到并开启网口句柄adhandle,应用下边的编码并可捕捉数据信息包
 
//每一次捕获到数据信息包时,pcap都是全自动启用这一回调函数涵数
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
 struct tm *ltime;
 char timestr[16];
 _sec;
 //将時间戳变换成可鉴别的文件格式
&_sec = header- ts.tv_sec;
 printf( %d , _sec);
 ltime = localtime( _sec);
 strftime(timestr, sizeof(timestr), %H %M %S , ltime);
 printf( %s,%.6d len:%d , ctime( _sec), header- ts.tv_usec, header- len);
}
 
pcap_loop(adhandle, 0, packet_handler, NULL);
 
程序在每个数据信息包来临时,都是全自动启用回调函数涵数packet_handler来多数据包开展解决,其第三个主要参数就是数据信息包內容。

 


图中为运作結果图,能看到每个数据信息包的時间戳信息内容,和长短信息内容。
非常值得留意的是,初始套接字还可以进行数据信息包的推送和监视工作中,可是与winpcap对比,在监视数据信息包层面是有差别的,因为winpcap更贴近与最底层,因此在掺杂方式下,但凡抵达网口的数据信息包无论目地详细地址是不是为本身服务器,winpcap均能接受到;而初始套接字只有接受到投赠给自身的数据信息包。
0 09 小结与預告
此章中大家简易了解了winpcap的有关基本专业知识,学习培训了推送数据信息包和接受数据信息包的方式,实际上不会太难发觉,推送和接受数据信息包的全过程都较为简易,只必须启用有关库涵数就可以,而大量的活力在数据信息包的机构和分拆上,同时在一些情景中,优化算法的应用也比较关键。在接下去的章节目录中,大家会见到下边的內容:
1.扫描仪生存服务器
2.Arp蒙骗的完成与运用
3.端口号扫描仪
4.总流量监管与统计分析剖析 (责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
无法在这个位置找到: ajaxfeedback.htm
栏目列表
推荐内容


扫描二维码分享到微信