当前位置:文档之家› MAC地址欺骗的原理和实战介绍1

MAC地址欺骗的原理和实战介绍1

MAC地址欺骗的原理和实战介绍1
MAC地址欺骗的原理和实战介绍1

一.MAC地址欺骗的原理和实战介绍

一、原理:

在开始之前我们先简单了解一下交换机转发过程:交换机的一个端口收到一个数据帧时,首先检查改数据帧的目的MAC地址在MAC地址表(CAM)对应的端口,如果目的端口与源端口不为同一个端口,则把帧从目的端口转发出去,同时更新MAC地址表中源端口与源MAC的对应关系;如果目的端口与源端口相同,则丢弃该帧。

有如下的工作场景:

一个4口的switch,端口分别为Port.A、Port.B、Port.C、Port.D对应主机 A,B,C,D,其中D为网关。

当主机A向B发送数据时,A主机按照OSI往下封装数据帧,过程中,会根据IP地址查找到B主机的MAC地址,填充到数据帧中的目的MAC地址。发送之前网卡的MAC层协议控制电路也会先做个判断,如果目的MAC相同于本网卡的MAC,则不会发送,反之网卡将这份数据发送出去。Port.A接收到数据帧,交换机按照上述的检查过程,在MAC地址表发现B的MAC地址(数据帧目的MAC)所在端口号为Port.B,而数据来源的端口号为Port.A,则交换机将数据帧从端口Port.B转发出去。B主机就收到这个数据帧了。

这个寻址过程也可以概括为IP->MAC->PORT,ARP欺骗是欺骗了IP/MAC的应关系,而MAC欺骗则是欺骗了MAC/PORT的对应关系。比较早的攻击方法是泛洪交换机的MAC地址,这样确实会使交换机以广播模式工作从而达到嗅探的目的,但是会造成交换机负载过大,网络缓慢和丢包甚至瘫痪,我们不采用这种方法。

二、实战

工作环境为上述的4口swith,软件以cncert的httphijack 为例,应用为A主机劫持C主机的数据。

以下是劫持过程(da为目的MAC,sa为源MAC)

1.A发送任意da=网关.mac、sa=B.mac的数据包到网关。这样就表明b.mac 对应的是port.a,在一段时间

内,交换机会把发往b.mac 的数据帧全部发到a主机。这个时间一直持续到b主机发送一个数据包,或者另外一个da=网关.mac、sa=b.mac的数据包产生前。

2. A 主机收到网关发给B的数据,记录或修改之后要转发给B,在转发前要

发送一个请求B.MAC的广播,这个包是正常的

MAC信息为:da=FFFFFFFFFF、sa=a.mac

这个数据帧表明了a.mac对应port.a,同时会激发b主机响应一个应答包

MAC信息为:da=a.mac、sa=b.mac

这个数据帧表明了 b.mac对应port.b

至此,对应关系已经恢复,A主机将劫持到的数据可顺利转发至B

3. 转发劫持到的数据到B,完成一次劫持

三、攻击特点

1. 由于这种攻击方法具有时间分段特性,所以对方的流量越大,劫持频率也越低,网络越稳定。

2. 隐蔽性强,基于1的特殊性和工作本质,可以在ARP防火墙和双向绑定的环境中工作。

四、如何防护

高级的交换机可以采用ip+mac+port 绑定,控制CAM表的自动学习。目前尚无软件可以防护此类攻击

五、利用工具

1.httphijack beta 2 说明:http会话劫持

2.ssclone 说明:交换环境下的会话复制软件(gmail,qqmail,sohumail…..)

3.skiller 说明:流量控制

二.前很多网络都使用Hub进行连接的,众所周知,数据包经过Hub传输到其他网段时,Hub只是简单地把数据包复制到其他端口。因此,对于利用Hub组成的网络来说,没有安全而言,数据包很容易被用户拦截分析并实施网络攻击(MAC地址欺骗、IP地址欺骗及更高层面的信息骗取等)。为了防止这种数据包的无限扩散,人们越来越倾向于运用交换机来构建网络,交换机具有MAC地址学习功能,能够通过VLAN等技术将用户之间相互隔离,从而保证一定的网络安全性。

交换机队于某个目的MAC地址明确的单址包不会像Hub那样将该单址包简单复制到其他端口上,而是只发到起对应的特定的端口上。如同一般的计算机需要维持一张ARP高速缓冲表一样,每台交换机里面也需要维持一张MAC地址(有时是MAC地址和VLAN)与端口映射关系的缓冲表,称为地址表,正是依靠这张表,交换机才能将数据包发到对应端口。

地址表一般是交换机通过学习构造出来的。学习过程如下:

(1) 交换机取出每个数据包的源MAC地址,通过算法找到相应的位置,如果是新地址,则创建地址表项,填写相应的端口信息、生命周期时间等;

(2) 如果此地址已经存在,并且对应端口号也相同,则刷新生命周期时间;

(3) 如果此地址已经存在,但对应端口号不同,一般会改写端口号,刷新生命周期时间;

(4) 如果某个地址项在生命周期时间内没有被刷新,则将被老化删除。

如同ARP缓冲表存在地址欺骗的问题,交换机里的这种MAC地址表也存在地址欺骗问题。在实际应用中,人们已经发现早期设计的许多交换机都存在这个问题,以Cisco2912交换机为例,阐明一下如何进行MAC地址欺骗。

如图所示,两个用户PcA和PcB分别连接Cisco2912的portA和portB两个端口。

PortC https://www.doczj.com/doc/3112942951.html, Internet

Cisco2912

portA / portB /

Hub Hub

PcA PcB

00.00.AA.AA.AA.AA 00.00.BB.BB.BB.BB

假定PcA的MAC的地址是00.00.AA.AA.AA.AA

PcB的MAC的地址是00.00.BB.BB.BB.BB

在正常的情况下,Cisco2912里会保存如下的一对映射关系:

(00.00.AA.AA.AA.AA)<—>portA

(00.00.BB.BB.BB.BB) <—>portB

(https://www.doczj.com/doc/3112942951.html,) <—>portC

依据这个映射关系,Cisco2912把从PortC上收到的发给PcA的包通过PortA发出,而不会从PortB发出。但是如果我们通过某种手段使交换机改变了这个映射关系,则Cisco2912就会将数据包转发到不应该去的端口,导致用户无法正常访问Internet等服务。最为简单的一种方法就是用户PcB构造一种数据包,该包的源MAC地址不再是自己的MAC地址00.00.BB.BB.BB.BB,而是PcA的MAC地址

00.00.AA.AA.AA.AA,从上面的地址学习过程可以看出,Cisco2912就会错误的认为MAC地址

00.00.AA.AA.AA.AA是从portB上来的,因此映射关系也就改为:

(00.00.AA.AA.AA.AA)<—>portB

(00.00.BB.BB.BB.BB) <—>portB

这样,Cisco2912就会错误地把从PortC上收到的目的地址为MAC A的数据包通过PortB发出,而不再发给PortA.。显然,如果PcB一直在发这种特意构造的包。用户PcA就无法通过Cisco2912正常访问Internet。更为严重的是,如果用户PcB构造portC上联设备(如路由器)的MAC地址(https://www.doczj.com/doc/3112942951.html,),则会导致Cisco 2912下面所有的用户无法正常访问Internet等业务。

这太简单了,对付MAC地址欺骗,其实就是对局域网ARP保护就可以了。

每台主机都有一个临时存放IP-MAC的对应表ARP攻击就通过更改这个缓存来达到欺骗的目的,使用静态的ARP来绑定正确的MAC是一个有效的方法.在命令行下使用arp -a可以查看当前的ARP缓存表.以下是本机的ARP表:

C:\Documents and Settings\cnqing>arp -a

Interface: 192.168.0.1 on Interface 0x1000003

Internet Address Physical Address Type

192.168.0.1 00-03-6b-7f-ed-02 dynamic

其中代表动态缓存,即收到一个相关ARP包就会修改这项.如果是个非法的含有不正确的网关的ARP包,这个表就会自动更改.这样我们就不能找到正确的网关MAC,就不能正常和其他主机通信.静态表的建立用ARP -S IP MAC.

执行arp -s 192.168.0.1 00-03-6b-7f-ed-02后,我们再次查看ARP缓存表.

C:\Documents and Settings\cnqing>arp -a

Interface: 192.168.0.1 on Interface 0x1000003

Internet Address Physical Address Type

192.168.0.1 00-03-6b-7f-ed-02 static

此时"TYPE"项变成了"static",静态类型.这个状态下,是不会在接受到ARP包时改变本地缓存的.从而有效的防止ARP攻击.静态的ARP条目在每次重启后都要消失需要重新设置. 此时我们就可以自己写一个批处理文件,文件内容如下:

@echo off

arp -d

arp -s 192.168.0.1 00-03-6b-7f-ed-02

写好之后我们把它存储为rarp.bat,再把此文件放到开始菜单-程序-启动栏,这样每次启动机器时,就自动执行此批处理文件。菜单-程序-启动栏默认目录:C:\Documents and Settings\All Users\「开始」菜单\程序\启动

第二种方法就是直接使用防止局域网Arp攻击的软件

比如说:Arp保护神等等

交换机如何获得mac地址

交换机工作在数据链接层,当一台主机发送数据时,交换机会收到MAC帧,我包含发送主机的MAC地址和接收主机的地址,交换机收到这个帧后,会把这个发送主机的MAC地址记录在自己的MAC表中,并记下这个发送主机对应的端口号。之后交换机会查看自己MAC表看有没得接收主机的记录,如果有就直接发到对应的端口,如果没有就广播出去

交换机的工作原理中,交换机之间的MAC地址学习室通过端口泛洪的方式

以太网交换机厂商根据市场需求,推出了三层甚至四层交换机,但无论如何,其核心功能仍是二层的以太网数据包交换,这样将大大提高交换机的处理速率。

交换机是一种基于MAC地址识别,能完成封装转发数据包功能的网络设备。交换机可以“学习”MAC 地址,并把其存放在内部地址表中,通过在数据帧的始发者和目标接收者之间建立临时的交换路径,使数据帧直接由源地址到达目的地址。

1.交换机根据收到数据帧中的源MAC地址建立该地址同交换机端口的映射,并将其写入MAC地址表中。

2.交换机将数据帧中的目的MAC地址同已建立的MAC地址表进行比较,以决定由哪个端口进行转发。

3.如数据帧中的目的MAC地址不在MAC地址表中,则向所有端口转发。这一过程称为泛洪(flood)。

4.广播帧和组播帧向所有的端口转发。

以太网交换机了解每一端口相连设备的MAC地址,并将地址同相应的端口映射起

有如下的工作场景:

一个4口的switch,端口分别为Port.A、Port.B、Port.C、Port.D对应主机A,B,C,D,其中D为网关。当主机A向B发送数据时,A主机按照OSI往下封装数据帧,过程中,会根据IP地址查找到B主机的M AC地址,填充到数据帧中的目的MAC地址。

发送之前网卡的MAC层协议控制电路也会先做个判断,如果目的MAC相同于本网卡的MAC,则不会发送,反之网卡将这份数据发送出去。Port.A接收到数据帧,交换机按照上述的检查过程,在MAC地址表发现B的MAC地址(数据帧目的MAC)所在端口号为Port.B,而数据

这个寻址过程也可以概括为IP->MAC->PORT,ARP欺骗是欺骗了IP/MAC的应关系,而MAC欺骗则是欺骗了MAC /PORT的对应关系。比较早的攻击方法是泛洪交换机的MAC地址,这样确实会使交换机以广播模式工作从而达到嗅探的目的,但是会造成交换机负载过大,网络缓慢和丢包甚至瘫痪,我们不采用这种方法。

工作环境为上述的4口swith,软件以cncert的httphijack 为例,应用为A主机劫持C主机的数据。以下是劫持过程(da为目的MAC,sa为源MAC)这样就表明b.mac 对应的是port.a,在一段时间内,交换机会把发往b.mac 的数据帧全部发到a主机。这个时间一直持续到b主机发送一个数据包,或者另外一个da=网关.mac、sa=b.mac的数据包产生前。

由于这种攻击方法具有时间分段特性,所以对方的流量越大,劫持频率也越低,网络越稳定。隐蔽性强,基于1的特殊性和工作本质,可以在ARP防火墙和双向绑定的环境中工作。

高级的以太网交换机可以采用ip+mac+port 绑定,控制CAM表的自动学习。目前尚无软件可以防护此类攻击

三.交换机端口安全之Mac泛洪攻击

我们都知道,组建我们的网络,交换机是必不可少的一个设备,我们都会用它来做一些相应的配置,如划分VLAN、VTP、以及生成内的端口安全呢?这是一个必要的操作。那么下面我们就使用Cisco Packet Tracer 5.2来做做这方面的实验,但是还是有一些不我们知道交换机在网络中存在规模最大,

通过这个图我们得出一个结论那就是:离接入层越近风险越大,所以问题主要集中在接入层。

那么下来我们就来分析一下这个交换机倒底存在那些安全呢?

交换机所面临攻击的层面:

MAC layer attacks

VLAN attacks

Spoofing attacks

Attacks on switch devices

那么我们知道了交换机所面临这四种攻击,我们现在来一个一个的分析一下这些:

Mac Flooding Attack:

利用伪造数据帧或数据包软件,不停变化源MAC地址向外发包,让有限的MAC地址表空间无法容纳进而破坏MAC地址表。

应对:限定端口映射的MAC数量

在这里三台PC的IP地址如下:

以下我们在交换机上面配置MAC地址绑定。Switch(config)#interface fastEthernet 0/1

Switch(config-if)#switchport mode access(当端口连接是主机时,接入链路)

Switch(config-if)#switchport port-security(启动端口安全)

Switch(config-if)#switchport port-security mac-address 00E0.A342.20E6(绑定一个MAC地址,默认只能绑定一个MAC Switch(config-if)#switchport port-security violation ?

protect Security violation protect mode (不转发数据)

restrict Security violation restrict mode (不转发数据,上报网管平台)

shutdown Security violation shutdown mode (关闭接口,并上报网管平台)

Switch(config-if)#switchport port-security violation shutdown

那现我们来测试一下看看能否正常使用。

从这里我们可以看见,PC0能够正常使用。那我们再新添加一台PC并将这台PC接到FA0/1端口上面看看会是什么效果。

从这个图我们可以看见,PC3接在FA0/1接口上面,当PC3没有向其它网段发送数据包的时候一切正常,那么下面我们来发送一个

我们可以看出来,当交换机的FA0/1接口接PC0的时候,能够正常使用,但是当我的PC3接入到交换机的FA0/1上,当我发送数据个MAC地址,所以就执行将此接口shutdown掉,从上图我们也可以看见,PC3连接的FA0/1已经被shutdown了。

那么当有其它MAC地址的计算机接入一我们这个端口以后,该端口会自动shutdown,那么当shutdown以后的接口如何恢复呢?

注意以下来条命令不能在Cisco Packet Tracer 5.2中使用,这个软件里面现在还没有集成这几条命令。

Switch(config)#errdisable recovery interval ?

<30-86400> timer-interval(sec)

可以调整在30-86400秒,缺省是300秒。

这种方法只能对付下挂交换机的情况,不能对付下挂路由器的情况。

如果产生err-disable的原因是udld,下面有一条命令非常管用:

Switch#udld reset

No ports are disabled by UDLD.

同时,接口在被置为err-disable的时候,通常有一系列的日志产生,如下:

*Mar 15 15:47:19.984: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port FastEthernet0/47 with BPDU Guard enable sw1#

*Mar 15 15:47:19.984: %PM-4-ERR_DISABLE: bpduguard error detected on Fa0/47, putting Fa0/47 in err-disable state sw1#

*Mar 15 15:47:21.996: %LINK-3-UPDOWN: Interface FastEthernet0/47, changed state to down

收集这些日志也非常管用。

所以建议配置一个syslog server,收集log信息。

刚才在上面我们绑定的那个MAC地址是PC0的,我们现在查看一下交换机上面的MAC地址表看看:

Switch#show mac-address-table

Mac Address Table

-------------------------------------------

Vlan Mac Address Type Ports

---- ----------- -------- -----

1 0009.7c11.89e7 DYNAMIC Fa0/3 而这一条是动态学习到的

1 000a.41a9.79b0 DYNAMIC Fa0/

2 这条也是动态学习到的

1 00e0.a342.20e6 STATIC Fa0/1 这一个端口的MAC地址我们可以看见是静态指定的。

Switch#

但是针对Cisco Packet Tracer 5.2来说,我们不能直接使用no shutdown命令来启用,也不能使用我们上面的那条命令,那么我址接入到此端口的时候我们就将它设置不不转发数据并且上报网管平台。

Switch(config)#interface fastEthernet 0/1

Switch(config-if)#switchport port-security violation restrict

从上面我们可以看见,当设置为数据包不转发以后,我们从PC3上面还是ping不通我们的PC2,而我们的交换机只是不转发此数据包

那么我们又出现一个新的问题?我们不可能一个端口只绑定一个MAC地址吧!那么我们如何给一个端口绑定多个MAC地址通行呢?SW1(config)#interface fastethernet 0/1

Switch(config-if)#Switch port-security maximum 3设置绑定多少个MAC地址,而这里我设置的是3条

Switch(config-if)#Switchport port-security max-address ***第一条的MAC地址。

Switch(config-if)#Switchport port-security mac-address ***第二条的MAC地址。

Switch(config-if)#Switchport port-security max-address ***第三条的MAC地址。

但是这个设置手工绑定多条MAC地址的命令在这里没有,所以这个也不能使用。

但是在这里如果我设置了maximum设置为100的话,那么不是我们手工需要绑定100条?而且我们还需要去收集这100个MAC地址它将接入到此端口的MAC地址自动绑定到这个MAC地址中呢?

SW1(config)#interface fastethernet 0/1

Switch(config-if)#Switch port-security maximum 3设置绑定多少个MAC地址,而这里我设置的是3条

Switch(config-if)#switchport port-security mac-address sticky这条命令就是将前三个接入到这个端口的计算机的MAC地那么我们再来试试看呢?

Switch(config)#interface fastEthernet 0/2

Switch(config-if)#switchport mode access

Switch(config-if)#switchport port-security

Switch(config-if)#switchport port-security mac-address sticky

我们使用接入到交换机端口FA0/2这个接口的计算机发送一点数据包来看看。

现在来在交换机上面来查看一下MAC地址表。

这个表是没有发达数据包之前的。我们可以看见还是动态学习到的。

Switch#show mac-address-table

Mac Address Table

-------------------------------------------

Vlan Mac Address Type Ports

---- ----------- -------- -----

1 0009.7c11.89e7 DYNAMIC Fa0/3

1 000a.41a9.79b0 DYNAMIC Fa0/2

1 00e0.a342.20e6 STATIC Fa0/1

Switch#

而下面的是我们命令了动态学习的到第一台通过这个端口发送数据包的那台计算机的MAC地址。而自动变成静态绑定的。

Switch#show mac-address-table

Mac Address Table

-------------------------------------------

Vlan Mac Address Type Ports

---- ----------- -------- -----

1 0009.7c11.89e7 DYNAMIC Fa0/3

1 000a.41a9.79b0 STATIC Fa0/2

1 00e0.a342.20e6 STATIC Fa0/1

Switch#

看看,这样是不是就解决了我们手工去绑定MAC地址那些烦琐的事件了。这样是不是给我们减轻了很大的工作量。

下面这条命令是查看端口安全的,以及每一个端口

Switch#show port-security

Secure Port MaxSecureAddr CurrentAddr SecurityViolation Security Action

(Count) (Count) (Count)

--------------------------------------------------------------------

Fa0/1 1 1 3 Restrict

Fa0/2 1 1 0 Shutdown

----------------------------------------------------------------------

Switch#

从上面我们可以看出FA0/1端口有3条违反我们策略的。指行的是Restrict。而Fa0/2没有违反我们的策略,如果说现有呢就执

以上就是我们基于MAC地址的限制。我想这个功能对于大家在实际工程中应用的还是比较广泛。我们用来做端口安全的还有一种方而这里使用这个软件不能做基于交换机的802.1x认证。那么那天用到真机以后我再将这方面的内容发送出来!

这里只是解决了Mac Flooding Attack现在由于时间太晚了,剩下的明天继续。

2.

MAC地址泛洪攻击

1,2层交换机是基于MAC地址去转发数据帧的。

2,转发过程中依靠对CAM表的查询来确定正确的转发接口。

3,一旦在查询过程中无法找到相关目的MAC对应的条目,此数据帧将作为广播帧来处理。

4,CAM表的容量有限,只能储存不多的条目,当CAM表记录的MAC地址达到上限后,新的条目将不会

添加到CAM表中。

基于以上原理,我们会发现一个非常有趣的现象。某台PC不断发送去往未知目的地的数据帧,且每个包

的源MAC地址都不同,当这样的数据包发送的速度足够快之后,快到在刷新时间内将交换机的CAM表

迅速填满。CAM表被这些伪造的MAC地址占据,真实的MA C地址条目却无法进入CAM表。那么任何

一个经过交换机的正常单播数据帧都会以广播帧的形式来处理。如下图所示

上传的图像

Windows中获取MAC地址的几种方法

Windows中获取MAC地址的几种方法 1.NDIS(DDK)通过驱动程序获取MAC地址 ndis规范中说明,网卡驱动程序支持ioctl_ndis_query_stats接口 参数如下: OID_802_3_PERMANENT_ADDRESS :物理地址 OID_802_3_CURRENT_ADDRESS :mac地址 于是我们的方法就得到了。 首先,看看注册表,找一找网卡有几块,分别是什么设备名。 具体位置和os有关,2000下在hlm\software\microsoft\windows nt\current version\networkcards。 然后createfile(devicename,...)注意,要用linkname,因此 还要加上"////.//device//". 接着 deviceiocontrol(hmac,IOCTL_NDIS_QUERY_STA TS, OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS...) 具体的情况可以参看ddk下的 OID_802_3_CURRENT_ADDRESS条目 https://www.doczj.com/doc/3112942951.html,API-2得到MAC (MSDN推荐方法) #include //#include #include #include #include typedef struct _ASTA T_ { ADAPTER_STA TUS adapt; NAME_BUFFER NameBuff [30]; }ASTA T, * PASTA T; ASTA T Adapter; int main (void)

获取以太网卡的MAC地址(附源代码)

2、C#编程要点 Microsoft提供的WMI(Windows Management Instrumentation)中提供了一个Win32_NetworkAdapterConfiguration的类,定义了获取MAC地址的方法,因此只要构造一个定义为Win32_NetworkAdapter Configuration的WMI类,从中取出MAC地址的值即可。在C#中管理WMI主要使用ManagementClass类。编写程序过程要注意以下两个要点。 1)、命名空间的添加 由于System.Management的动态链接库不是C#中默认加载的,所以要添加System.Management的命名空间前要添加System.Management.dll链接库。依次选择:“项目”→“添加引用”→“.NET”菜单栏,加入System.Management。确认添加了动态链接库后添加命名空间: usingSystem.Management; 2)、MAC地址的获取 根据前面的介绍,要构造一个ManagementClass类管理定义为Win32_NetworkAdapter Configuration的WMI类,然后将ManagementClass类中的所有变量的值返回给属于ManagementObjectCollection类的变量,ManagementObjectCollection类用于表示WMI实例的不同集合,将不同集合中的各个MAC地址读出,就可获得多网卡的MAC地址。 构造ManagementClass,函数原型如下: public ManagementClass(string path); 参数:path表示WMI的路径。 要返回ManagementClass所有实例的集合,使用GetInstances(),函数原型如下: public ManagementObjectCollectionGetInstances(); 例如:获得本机上多网卡的MAC地址: ManagementClass mc; //定义一个ManagementClass类 //将ManagementClass类变量定义为Win32_NetworkAdapter Configuration,以便获得//网络信息 mc=new ManagementClass(” Win32_NetworkAdapterConfiguration”); //使用ManagementObjectCollection记录mc中的所有信息,包括多个网卡信息 ManagementObjectCollectionmoc=mc. GetInstances(); //取得ManagementObjectCollection中的不同网卡配置信息,判断如果该网卡可用就//去读取MAC地址 foreach(ManagementObjectmo in moc) { if(mo[“IPEnabled”].ToString()= =”True”) Console.WriteLine(”MAC address”+mo[“MacAddress”].ToString()); } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Management; namespace ConsoleApplication3

通过客户端ip获取mac地址

public class MacUtils { /** * 通过ip获取mac地址 * @param ipAddress 客户端ip * @return mac地址 */ public static String getMACAddressByIp(String ipAddress) { String str = "", macAddress = ""; try { Process pp = Runtime.getRuntime().exec("arp -a " + ipAddress); InputStreamReader ir = new InputStreamReader(pp.getInputStream(), "gbk"); BufferedReader br = new BufferedReader(ir); while ((str = br.readLine()) != null) { if (str.indexOf(ipAddress) > 1) { str = str.trim(); macAddress = str.substring(str.indexOf(" "), str.length()); macAddress = macAddress.trim(); macAddress = macAddress.substring(0,17); break; } } pp.destroy(); br.close(); ir.close(); } catch (Exception ex) { return "Can't Get MAC Address!"; }

JAVA实现获取MAC地址

用纯JAVA语言编程读取MAC地址的实现 本文介绍如何在WindowXP/NT/2000环境中,编写纯Java程序,执行外部命令IPCONFIG,并通过分析该命令的输入流而获得本机的MAC地址的编程方法。 1 引言 用Java编写的程序,可以很方便地运行在各种平台的环境。但在实际的开发过程中,有时不得不涉及一些底层的编程。比如为了防止软件盗用,我们希望软件只能在指定计算机上运行,所以需要程序读取该机区分于其它计算机的硬件特征,如MAC地址等。作为一种跨平台语言,给Java语言提出了挑战。本文正是针对该问题,提出一种直接用纯Java语言,读去MAC地址的编程方法。 我们知道,在每一个Java应用程序中都存在着一个与其运行环境相联系的Runtime对象。该对象可执行外部命令、查可用内存等。而多数操作系统都提供有查询该机MAC地址的命令。如在Microsoft的操作系统中,命令IPCONFIG等。本文的思路是在程序中运行一个外部命令,将该命令的运行结果作为一个流(Stream),读取并分析之,进而实现获取MAC地址的目的。 2 Runtime类 在每一个Java 应用程序里面,都有惟一的一个Runtime 对象。通过这个Runtime 对象,应用程序可以与其运行环境发生相互作用。 一般不实例化一个Runtime对象。但是可以通过调用静态方法Runtime.getRuntime( )而获得对当前Runtime对象的引用。Runtime 类的大多数方法是实例方法。 Runtime 对象的作用主要有:执行外部命令;返回空闲内存;运行垃圾回收器;加载动态库等。 Applets和其他不可信赖的程序由于没有引起一个安全异常(SecurityException)而不能调用任何的Runtime方法。 下面的例子演示了怎样使用Runtime 对象运行一个外部命令。 以下是引用片段: : Process process = Runtime.getRuntime().exec("cmd.exe /c dir"); process.waitFor(); : Runtime.getRuntime()返回当前应用程序的Runtime对象,该对象的exec()方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。第二条语句的目的是等待子进程完成后再往下执行。

取得系统中网卡MAC地址的三种方法

取得系统中网卡MAC地址的三种方法 第一种方法使用Microsoft的Netbios API。这是一套通过Winsock提供底层网络支持的命令。使用Netbios的最大缺点是您必须在系统中安装了Netbios 服务(如果您在windows网络中启用了文件共享的话,这就不是问题了)。除此此 外,这种方法又快又准确。 Netbios API只包括了一个函数,就叫做Netbios。这个函数使用网络控制块(network control block)结构作为参数,这个结构告诉函数要做什么。结构的定义如下: typedef struct _NCB { UCHAR ncb_command; UCHAR ncb_retcode; UCHAR ncb_lsn; UCHAR ncb_num; PUCHAR ncb_buffer; WORD ncb_length; UCHAR ncb_callname[NCBNAMSZ]; UCHAR ncb_name[NCBNAMSZ]; UCHAR ncb_rto; UCHAR ncb_sto; void (CALLBACK *ncb_post) (struct _NCB *); UCHAR ncb_lana_num; UCHAR ncb_cmd_cplt; #ifdef _WIN64 UCHAR ncb_reserve[18]; #else UCHAR ncb_reserve[10]; #endif HANDLE ncb_event; } NCB, *PNCB; 重点在于ncb_command 成员。这个成员告诉Netbios该作什么。我们使用三个命令来探测MAC地址。他们在MSDN的定义如下: 命令描述: NCBENUM Windows NT/2000: 列举系统中网卡的数量。使用此命令后,ncb_buffer 成员指向由LANA_ENUM结构填充的缓冲区。 NCBENUM 不是标准的 NetBIOS 3.0 命令。 NCBRESET 重置网卡。网卡在接受新的NCB命令之前必须重置。 NCBASTAT 接受本地或远程接口卡的状态。使用此命令后,ncb_buffer成员指向由ADAPTER_STATUS结构填充的缓冲区,随后是NAME_BUFFER结构的数组。

获取以太网卡的MAC地址

获取以太网卡的MAC地址 【实验目的】 1、通过设计获取以太网卡物理地址的程序,初步掌握在应用层访问底层软硬件接口和属性的方法。 2、设计一个程序,使得能够获取本机安装的以太网卡的物理地址。 3、设计一个简单的应用程序,使得该程序只能在装有指定地址网卡的微机上运行。 【实验性质】 综合与设计性实验 【实验条件】 装有以胎网卡并配置网络协议的微机 【实验导读】 1、MAC地址MAC地址是每一个连接到LAN的端口或设备所需要的规范化的数据链 路层地址。MAC地址字长6B(注意也有2B的),由IEEE控制。在数据链路层,数据帧传输的寻址是依照网卡地址进行的。网卡地址可以采用局部地址或全局地址,以太网使用6B即48位的全局地址。对于共享型以太网,传输通过广播实现,各个网卡按照自己的物理地址接受属于自己的数据帧。而在交换式以太网,交换机通过逆向学习方式建立动态的MAC地址--端口映射表,根据该表进行数据帧的转发。当映射表中没有相应表项时再广播发送到各个端口。这种传输机制当然要求网卡MAC地址的唯一性。对一些应用程序来说,获取MAC地址有时是必要的。 【实验内容】 1、Linux编程要点 在Linux下编写获取本机网卡地址的程序,比较简单的方法是利用套接口(socket)和IO接口(ioctl)函数来获取网卡信息,需要引用如下文件: #include #include #include #include #include socket函数的原型是: int socket(int domain,int type, int protocol); 本函数有以下3个输入参数: domain参数:表示所使用的协议族; type参数:表示套接口的类型; protocol参数:表示所使用的协议族中某个特定的协议。 如果函数调用成功,套接口的描述符(非负整数)就作为函数的返回值,假如返回值为-1,就表明有错误发生。 利用socket函数来获取网卡MAC信息时,domain参数取值AF_INET,表示采用internet 协议族;type参数指定为SOCK_DGRAM,表示采用数据报类型套接口,protocol参数在这种组合下只有唯一选择,故用0填充。

获取手机的mac地址的简单实现

获取手机的mac地址的简单实现 public static String getMacAddress(Context context) { // 获取mac地址: String macAddress = "000000000000"; try { WifiManager wifiMgr = (WifiManager) context .getSystemService(Context.WIFI_SERVICE); WifiInfo info = (null == wifiMgr ? null : wifiMgr .getConnectionInfo()); if (null != info) { if (!TextUtils.isEmpty(info.getMacAddress())) macAddress = info.getMacAddress().replace(":", ""); else return macAddress; } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();

return macAddress; } return macAddress; } 注:添加权限 方法二: public String getLocalMacAddress() { WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); WifiInfo info = wifi.getConnectionInfo(); return info.getMacAddress(); }

获取局域网IP和MAC地址的方法

取得IP的方法很多,比如"局域网查看工具",我推荐用“局域网花名册”网上随便搜索一下就有了。 取得MAC地址的方法:WIN+R,输入CMD,用"NBTSTAT -A IP地址" 查看。不过,我试过好像这能查看自己的ip和mac,如下 C:\Documents and Settings\hike>nbtstat -A 211.69.244.171 本地连接: Node IpAddress: [211.69.244.171] Scope Id: [] NetBIOS Remote Machine Name Table Name Type Status --------------------------------------------- 9D15D457A66C432<00> UNIQUE Registered 9D15D457A66C432<20> UNIQUE Registered WORKGROUP <00> GROUP Registered MAC Address = 00-E0-4A-01-BE-9C 如果查看别人的会显示: C:\Documents and Settings\hike>nbtstat -A 211.69.244.188 本地连接: Node IpAddress: [211.69.244.171] Scope Id: [] Host not found. 取得自己电脑IP与MAC的方法:WIN+R,输入CMD,用"IPCONFIG /ALL" 查看,还有一个快速查看mac的命令:“getmac”,也挺方便的。 下面是我强烈推荐的查看别人ip和mac的命令: 先用ping,ping通每一台机器,然后用arp -a 可列出所有刚才ping通的机器的网卡号。

获取mac地址

Public class MacUtils{ //这个方法运行时间太长 public static String callCmd(String[] cmd) { String result = ""; String line = ""; try { Process proc = Runtime.getRuntime().exec(cmd); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(is); while ((line = br.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } return result; } /** * @param cmd 第一个命令 * @param another 第二个命令 * @return第二个命令的执行结果 */ public static String callCmd(String[] cmd, String[] another) { String result = "";

String line = ""; try { Runtime rt = Runtime.getRuntime(); Process proc = rt.exec(cmd); proc.waitFor(); // 已经执行完第一个命令,准备执行第二个命令 proc = rt.exec(another); InputStreamReader is = new InputStreamReader(proc.getInputStream()); BufferedReader br = new BufferedReader(is); while ((line = br.readLine()) != null) { result += line; } } catch (Exception e) { e.printStackTrace(); } return result; } /** * * @param ip 目标ip,一般在局域网内 * @param sourceString 命令处理的结果字符串 * @param macSeparator mac分隔符号 * @return mac地址,用上面的分隔符号表示

获取网卡的MAC地址

#include #include #include #include #include #pragma comment(lib,"netapi32.lib") int getMAC(char * mac) { NCB ncb; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; }ASTAT,*PASTAT; ASTAT Adapter; typedef struct _LANA_ENUM { UCHAR length; UCHAR lana[MAX_LANA]; }LANA_ENUM; LANA_ENUM lana_enum; UCHAR uRetCode; memset(&ncb, 0, sizeof(ncb)); memset(&lana_enum, 0, sizeof(lana_enum)); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (unsigned char *)&lana_enum; ncb.ncb_length = sizeof(LANA_ENUM); uRetCode = Netbios(&ncb); if(uRetCode != NRC_GOODRET) return uRetCode; for(int lana=0; lana

如何获得本机MAC地址

如何获得本机MAC地址(网卡地址) 世界上每一台计算机都有唯一的MAC地址与其对应,MAC地址是计算机的身份标示,找出MAC地址可以实现IP地址与MAC地址的绑定,防止IP地址被盗用。 方法一: 条件:计算机装载网卡驱动 第一步:鼠标点击“开始”->“运行”,图1所示 图 1 第二步:在图1中,点击“运行(R)...”,出现运行窗口,在“打开”命令行中输入cmd,如图2所示: 图 2 第三步:在图2中,点击“确定”按钮,出现命令窗口,在命令窗口中键入命令:ipconfig /all,回车,显示图3

图 3 第四步:请您记录下图3红圈中显示的本机MAC地址(网卡地址),去掉“-”符号,字母用小写,即0005.5d72.ac05 注:MAC地址由“0、1、2、3、4、5、6、7、8、9”和小写字母“a、b、c、d、e、f”组成,共12位 方法二:快捷方式 条件:计算机连接外部网络 第一步:鼠标点击“我的电脑”->“网上邻居”,图1所示 第二步:鼠标点击“网上邻居”后,如图点击“查看网络连接”或是“更改适配器的设置”。

第三步:双击“本地连接”(或右击“本地连接”,选择状态)。 第四步:在如图的“本地连接状态”中选择“支持”

第五步:如图选择点击“详细信息”,出现的“实际地址”(有效地址) 就是所要查找的“MAC地址”,将其记录,请您记录下图3红圈中显示的本机MAC地址(网卡地址),去掉“-”符号,字母用小写,即000c.6e65.8ac8 注:MAC地址由“0、1、2、3、4、5、6、7、8、9”和小写字母“a、b、c、d、e、f”组成,共12位

交换机获取MAC地址命令

交换机获取MAC地址命令 NAME H3C [MODEL] NAME 3928 USERNAME weihai147 PASSWORD huawei@147 [CMD] MACCMD display mac-address [/CMD] [CMD] EXTCMD quit [/CMD] [/MODEL] [/MANUFACTURE] NAME 华为5328 USERNAME weihai147 PASSWORD huawei@147 display mac-address NAME 3328 USERNAME weihai147 PASSWORD huawei@147 display mac-address NAME 2326 USERNAME weihai147 PASSWORD huawei@147 display mac-address NAME 2309 USERNAME weihai147 PASSWORD huawei@147 MACCMD display mac-address EXTCMD quit [/CMD] [/MODEL] [MODEL] [MANUFACTURE]

NAME 烽火 [MODEL] NAME 3628 USERNAME admin PASSWORD 12345 [CMD] MACCMD show mac-address [/CMD] [CMD] EXTCMD quit NAME 2100 USERNAME admin PASSWORD 12345 [CMD] MACCMD show interface dynamic-mac [/MODEL] [MODEL] NAME 2108 USERNAME admin 密码PASSWORD 12345 [CMD] MACCMD show interface dynamic-mac [/CMD] [CMD] EXTCMD quit Show run 查看vlan ip Show version/查看交换机软硬件版本 Show clock/查看交换机运行时间 Show cpu statistic/产看交换机cpu负载率 Show interface /查看交换机端口状态,双工模式,速率。 Show interface <端口号>/查看交换机某端口所在vlan,pvid值,限速等等。 Show vlan/查看交换机上所有的vlan

获取MAC地址和IP地址的程序设计

获取MAC地址和IP地址的程序设计 通信0402班学号:0905040225 姓名:张玉海指导老师: 王国才 【设计目标】 通过设计程序能获取本计算机的MAC地址和IP地址并显示。 【设计原理和方法】 本程序设计包含两个部分:一、获取本机IP地址;二、获取本机MAC地址。我是通过VB编程实现的。 其中,为了获取本机的IP地址,要使用WinSock库,WinSock API是Microsoft Windows 的网络程序接口。应用程序在使用WinSock API之前,必须调用WSAstartup函数,只有调用函数成功返回(表示应用程序与WinSock库成功的简历其连接),应用程序才可以调用其他Windows Socketers .DLL中的函数。当程序将要结束时,又必须调用WSACleanup函数可以结束Windows Socketers .DLL的使用。WinSock规范定义了几个数据库的例程。其中我们要用到gethostname和gethostbyname两个函数来得到IP地址。gethostname可以获得主机名, gethostbyname函数能够从主机名得到对应的“主机”(由名字和地址标识),函数唯一的参数name就是前面调用gethostname函数得到的主机名,二返回值是一个hostent结构,他可以标识一个“主机”列表,hostent的最后一个分量hAddrList中,就可以得到与主机名对应的一个或多个IP地址,hAddrList是一个列表,通过它就可以得到所有的IP地址。 MAC地址也叫物理地址、硬件地址或链路地址,此程序设计的获取MAC地址是通过NetBIOS编程实现的。其中,要用到网络编程接口中的一个重要的概念,那就是LANA编号(LAN适配器编号,LANadaprer),每张物理网卡都会分配一个独一无二的LANA编号。要想调用NetBIOS API函数,需要链接系统的NETAPI.DLL文件NetBIOS API包含的内容其实分全场简单,因为实际上NetBIOS API只是一个函数NetBios ,在Visual Basic中可以这样引入: Private Declare Function Netbios Lib "netapi32.dll" (pncb As NET_CONTROL_BLOCK) As Byte 函数中唯一的参数pncb是一个指向某个网络控制块(NET_CONTROL_BLOCK)的指针,在那个NET_CONTROL_BLOCK结构中,包含了为执行一个NetBIOS命令,相应的NetBios函数需要用的的前部信息。NetBIOS提供了几个命令专门负责收集网络参数的命令,其中包括名字查找命令和适配器状态命令,利用适配器状态命令可以获得本地计算机及其LANA编号的有关信息,这就是查知其的MAC地址的一条可行路径。其中在网络适配器状态命令的ADAPTER_STA TUS结构中我们最为关心的就是adapter_address字段,它标识的就是网卡的MAC地址。

查看本机和局域网pc的MAC地址的常用方法

如何查看局域网内其他计算机的MAC地址和IP 方法1:首先要知道那个计算机的某个信息。如果知道计算机名的话,可以PING 计算机名,这样就会知道IP,然后再用 NBTSTAT -a IP,就能知道物理地址。如果知道IP的话,直接用nbtstat -a IP,就能知道所有的。 方法2:DOS命令批量统计局域网内各台电脑的IP地址和其相对应的MAC地址,这样的好处是可以便捷、准确的控制管理每台电脑,发现某台电脑中毒或者数据流量异常能及时排查、封网。 能实现这种功能的工具在网上有很多,例如:超级网管(SuperLANadmin)等等,喜欢的朋友可以自己搜索一下。在这里我主要谈的是调用本机DOS命令来实现上述结果,毕竟我们不可能天天把工具带在身边。 地址解析协议(ARP)用于实现IP地址到网络接口硬件地址的映射,该命令只有在安装了 TCP/IP 协议之后才可用。当某主机要向以太网中另一台主机发送IP数据时,它首先根据目的主机的IP地址在ARP高速缓存中查询相应的以太网地址,ARP高速缓存是主机维护的一个IP地址到相应的以太网地址的映射表。如果查到匹配的结点,则相应的以太网地址被写入以太网帧首部,数据包被加入到输入到输出列队等待发送。如果查询失败,ARP会先保留等待发送的IP数据包,然后广播一个询问目的主机硬件地址的ARP报文,等收到回答后再把IP数据包发送出去。 命令如下:运行cmd.exe后执行: for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.1.%i arp -a 回车,一只烟的功夫就会看到收集好列表。 (注意:把192.168.1 IP地址替换成你所在局域网的IP地址) FOR对一组文件逐一运行一条命令。该命令可用在批处理文件中,也可命令提示符下直接调用。 语法:FOR在批处理程序中的使用语法如下: FOR %%变量 IN (集合) DO 命令 [命令参数] FOR在命令提示符下的使用语法如下: FOR %变量 IN (集合) DO 命令 [ 参数: %%变量或%变量 代表一个可替换的变量。FOR命令将用指定的一组文件中的每一个文本字符串来替换%%变量(或%变量),直到此命令(在命令参数中指定的)处理完所有的文件为止。 用%%变量来执行一批处理程序中的FOR命令。用%变量来执行命令提示符下的FOR命令。 集合 指定一个或多个要用特定命令对其进行处理的文件或文本字符串。圆括号必须得有。 命令 指定要对一组文件中每一文件进行处理的命令。 FOR─注解 使用关键字IN及DO IN和DO并不是参数,但FOR命令中要求这两个关键字。如果省略了这两个关键字, 则MS-DOS将显示一错误信息。 使用可替代变量 除了数字0到9之外,你可把任何字符用作变量,以避免与批处理参数%0到%9的混淆。对简单的批处理程序来说,象%%F这样的一个单一字符就足够了。在复杂的批处理程序中,你可把多个值用于变量以区分不同的可替换变量。然而,在同一命令行上不能嵌套(增加)多个FOR命令。指定一组文件集参数可代表一组文件或几组文件。你可用通配符(*及?)来指定一文件集。下面是合法的文件集: (*.doc) (*.doc *.txt *.me) (jan*.doc jan*.rpt feb*.doc feb*.rpt) (ar??1991.* ap??1991.*) 当你使用FOR命令时,集中的第一个值将代替%%变量(或%变量),而为了处理此值MS-DOS将执行指定的命令;此过程一直持续进行,直到MS-DOS将对应于集中的值(或多值)的所有文件(或多组文件)处理完毕为止。FOR─例子

C#如何获得设备Mac地址

C#如何获得设备Mac地址 利用dns类和WMI规范获取IP及MAC地址 在C#编程中,要获取主机名和主机IP地址,是比较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址. 示例: [c-sharp]view plaincopy 1.string strHostName = Dns.GetHostName(); //得到本机的主机名 2.IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IP 3.string strAddr = ipEntry.AddressList[0].ToString(); //假设本地主机为单网卡 在这段代码中使用了两个类,一个是Dns类,另一个为IPHostEntry类,二者都存在于命名空间https://www.doczj.com/doc/3112942951.html,中. Dns类主要是从域名系统(DNS)中检索关于特定主机的信息,上面的代码第一行就从本地的DNS中检索出本地主机名. IPHostEntry类则将一个域名系统或主机名与一组IP地址相关联,它与DNS类一起使用,用于获取主机的IP 地址组. 要获取远程主机的IP地址,其方法也是大同小异. 在获取了IP地址后,如果还需要取得网卡的MAC地址,就需要进一步探究了. 这里又分两种情况,一是本机MAC地址,二是远程主机MAC地址.二者的获取是完全不同的. 在获取本机的MAC地址时,可以使用WMI规范,通过SELECT语句提取MAC地址.在.NET框架中,WMI规范的实现定义在System.Management命名空间中. ManagementObjectSearcher类用于根据指定的查询检索管理对象的集合ManagementObjectCollection类为管理对象的集合,下例中由检索对象返回管理对象集合赋值给它. 示例: [c-sharp]view plaincopy 1.ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_Network AdapterConfiguration") ; 2.ManagementObjectCollection queryCollection = query.Get(); 3.foreach( ManagementObject mo in queryCollection ) 4.{ 5. if(mo["IPEnabled"].ToString() == "True") 6. mac = mo["MacAddress"].ToString(); 7.}

获取mac地址的几种方法

方法一:通过NetBIOS [Netbios is not supported on Windows Vista, Windows Server 2008, and subsequent versions of the operating system] #include #pragma comment(lib, "Netapi32.lib") namespace { bool GetAdapterInfo(int adapterNum, std::string& macOUT) { NCB Ncb; memset(&Ncb, 0, sizeof(Ncb)); Ncb.ncb_command = NCBRESET; // 重置网卡,以便我们可以查询 Ncb.ncb_lana_num = adapterNum; if (Netbios(&Ncb) != NRC_GOODRET) return false; // 准备取得接口卡的状态块 memset(&Ncb, sizeof(Ncb), 0); Ncb.ncb_command = NCBASTAT; Ncb.ncb_lana_num = adapterNum; strcpy((char *) Ncb.ncb_callname, "*"); struct ASTAT { ADAPTER_STATUS adapt; NAME_BUFFER nameBuff[30]; }adapter; memset(&adapter,sizeof(adapter), 0); Ncb.ncb_buffer = (unsigned char *)&adapter; Ncb.ncb_length = sizeof(adapter); if (Netbios(&Ncb) != 0) return false; char acMAC[32]; sprintf(acMAC, "%02X-%02X-%02X-%02X-%02X-%02X", int (adapter.adapt.adapter_address[0]), int (adapter.adapt.adapter_address[1]), int (adapter.adapt.adapter_address[2]), int (adapter.adapt.adapter_address[3]),

相关主题
文本预览
相关文档 最新文档