saga's blog

突出重点,系统全面,不留死角

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  33 Posts :: 2 Stories :: 185 Comments :: 0 Trackbacks

公告

QQ:34O859O5

常用链接

留言簿(15)

搜索

  •  

积分与排名

  • 积分 - 209432
  • 排名 - 121

最新评论

阅读排行榜

评论排行榜

最近用winpcap编程发现winpcap不能直接的提取本地网卡的mac地址.
     于是通过向自己发arp请求来获得本地的mac.自己写了段代码,如下:

int  getmmac()
{   
    unsigned 
char    sendbuf[ 42 ];
    
int     i = 7 ,k;
    ETHDR  eth;
    ARPHDR arp;
    
struct  pcap_pkthdr  *   pkt_header;
    u_char 
*  pkt_data; 

    
for (k = 0 ;k < 6 ;k ++ )
    {
        eth.eh_dst[k]
= 0xff ;
        eth.eh_src[k]
= 0x0f ;
        arp.arp_sha[k]
= 0x0f ;
        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
= myip -> ip;
    arp.arp_spa
= inet_addr( " 127.0.0.2 " );

    memset(sendbuf,
0 , sizeof (sendbuf));
    memcpy(sendbuf,
& eth, sizeof (eth));
    memcpy(sendbuf
+ sizeof (eth), & arp, sizeof (arp));

    
if (pcap_sendpacket(slecadopt,sendbuf, 42 ) == 0 )
    {
        printf(
" PacketSend succeed\n\n " );
    }
    
else
    {
        printf(
" PacketSendPacket in getmine Error: %d\n " ,GetLastError());
        
return   0 ;
    }
    
    
while ((k = pcap_next_ex(slecadopt, & pkt_header,( const  u_char ** ) & pkt_data)) >= 0 )
    {       
        
if ( * (unsigned  short   * )(pkt_data + 12 ) == htons(ETH_ARP) &&* (unsigned  short * )(pkt_data + 20 ) == htons(ARP_REPLY) &&* (unsigned  long * )(pkt_data + 38 ) == inet_addr( " 127.0.0.2 " ))
        {
            
            
for (i = 0 ;i < 6 ;i ++ )
            {
                myip
-> mac[i] =* (unsigned  char * )(pkt_data + 22 + i);
            }
                
break ;
        }
    }
    
if (i == 6 )
    {
        
return   1 ;
    }
    
else
    {
        
return   0 ;
    }
}

写的是一个函数,其中arp请求的发送方地址填的是127.0.0.2.这个都没什么关系.
当然提取本地的mac还可以用api直接获取.但是不知道用pcap还有别的好方法.高手指教.谢谢
posted on 2006-04-13 15:02 saga.constantine 阅读(4646) 评论(8)  编辑 收藏 引用 所属分类: Winpcap

Feedback

# re: [原创]用winpcap获取本地mac的一段代码! 2006-05-08 15:39 oosky
pcap_next_ex
pcap_loop
这两个函数抓到的是通过网卡的原始数据包还是被网卡过滤后的IP包?
对这些包的格式不了解,进而不好分析包的结构。
郁闷中。  回复  更多评论
  

# re: [原创]用winpcap获取本地mac的一段代码! 2006-05-09 08:25 saga.constantine
@oosky
打开网卡时设为混杂模式,抓到的就应该是原始数据包!!但是不会包括线路上损坏了的数据包,那要用硬件嗅探.
自己可以设置过滤,是通过过滤函数结合过滤表达式的实现的,那样抓到的包就应该式过滤后的包了.不一定是ip包,内网的arp包等也会有!
对包的结构可以找资料看看,再进行分析!
ip头和tcp头的分析都不太难!!
  回复  更多评论
  

# re: [原创]用winpcap获取本地mac的一段代码! 2008-04-25 16:20 牛人
你真有才。。。
脱裤子放了个P  回复  更多评论
  

# 帮助很大!先赞再细读! 2008-07-04 18:00 Utensil
我正苦苦寻觅跨平台的,不依赖于pcap以外的库的获得本地mac的方法,搜到了博主的文章...首先思路就很启发!

研读之后会再来回访请教~  回复  更多评论
  

# re: [原创]用winpcap获取本地mac的一段代码! 2008-07-05 08:30 Utensil
其他地方参照http://www.libing.net.cn/read.php/837.htm都看明白了

请教:
既然
unsigned long myip; //本地主机IP
为何会有
arp.arp_tpa = myip -> ip;
myip -> mac[i] =* (unsigned char * )(pkt_data + 22 + i);

myip并不是一个结构啊?

我现在头疼的也正是这个目标IP,我是在尚未上线(802.1x协议认证)的情况下,需要获得本地MAC。

改成发到localhost(127.0.0.1)行不行呢 ?  回复  更多评论
  

# re: [原创]用winpcap获取本地mac的一段代码! 2008-07-05 08:33 Utensil
另外一个地方:

eth.eh_src[k] = 0x0f ;

0F:0F:0F:0F:0F:0F是什么的MAC啊?  回复  更多评论
  

# re: [原创]用winpcap获取本地mac的一段代码! 2008-07-08 14:23 saga
0f 可能是随意添加的 我也记不太清楚了  回复  更多评论
  

# re: [原创]用winpcap获取本地mac的一段代码! 2010-07-08 13:01 zuoliang.
开发例子包里有通过packet.dll得到mac的例子。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理