荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: jjk (UNIX+C+XML+?? 傻了?), 信区: Linux
标  题: 漫谈网卡地址(转寄)
发信站: 荔园晨风BBS站 (Mon Apr 22 19:45:13 2002), 转信

【 以下文字转载自 jjk 的信箱 】
【 原文由 jjk.bbs@apue.dhs.org 所发表 】
发信人: tl (tl), 信区: UKP
标  题: 漫谈网卡地址
发信站: UNIX编程 (2002年04月18日19:19:02 星期四), 站内信件

作者:huyuguang
版面:SysInternals
站点:BBS白云黄鹤站

补遗之一:漫谈网卡地址(1)
要谈到混杂模式,就要先谈点和地址有关的东西
网卡地址这个概念有点混淆不清。因为实际上有两个地址,mac地址
和物理地址。一般说网卡地址我是指物理地址,不知道别人怎么看。
物理地址指的是网卡上的存放地址的ROM里的地址。mac地址是这块
卡工作的时候用的地址。一般情况下这两个地址是一样的。所以都
混用了。网卡工作的时候,一个以太网帧60到1514(不包括crc),
帧的crc是网卡自动加的。前导码是自动加的。网卡目的地址和源地址
是驱动程序加的。所以
实际上网卡工作的时候用什么地址作为工作地址完全
是由驱动程序决定的。
因此,我们完全可以在不改变网卡的物理地址的情况下用软件方法
改变具体的网卡的工作地址。具体的实现不同OS是不同的。
有些os也许需要你重写网卡driver。不过对于9x和nt来说,事情变得
非常简单。ndis3/4/5规范的netcard driver要求driver支持如下注册表
项:networkaddress,具体地址和os相关。至少我知道2000和nt4是不同
的。2000下在HKLM\System\CurrentControlSet\Control\Class\{4d36e972…}\00xx
nt4我不太记得了,好像是service\netcard-driver里。9x的就更不记得了。
(我一直用的2000)。有兴趣的可以看一看ddk,察看ndisreadnetworkaddress。

具体过程是如何的呢?2000ddk里有ne2000的sample,
可以看一看。结果就发现驱动程序初始化的时候调用了ndisreadconfigrue
察看了networkaddress的值,如果不是全0,就用该地址作为工作地址。不然,
就通过io操作得到物理地址,作为工作地址。
这样,就可以简单的通过操作注册表修改工作地址了。于是........
第1,可以肆无忌弹的盗用ip,
第2,可以破一些垃圾加密软件...
关于加密,还要多说两句。很多软件是通过网卡地址加密的,这里面有两种不同。
有些做的比较好的是通过物理地址加密。有些是通过工作地址加密。
通过工作地址加密的像通过guidgen,netbios等方法得到的地址都是mac地址。
一般都可以用该方法破解。通过物理地址加密的有点难破,但是也不是没有
办法。讲到这里,我发现我应该先讲一讲如何得到物理地址和mac地址。
于是,进入第二篇.......

--

补遗之一:漫谈网卡地址(2)

得到物理地址的方法对于不同的网卡是不同的,不过都是操作io端口,端口的具体
地址要看具体芯片的说明书。加密软件要得到物理地址,不能用这个方法。
一般来说,是在核心态用NDISREQUEST来得到的。这里提供一个应用层的方法。
要扯到NDISREQUEST,就要扯远了,还是打住吧...
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_STATS,
OID_802_3_PERMANENT_ADDRESS/OID_802_3_CURRENT_ADDRESS...)
具体的情况可以参看ddk下的
OID_802_3_CURRENT_ADDRESS条目。
于是我们就得到了mac地址和物理地址。

--

补遗之一:漫谈网卡地址(3)


注意,虽然网卡支持NDISREQUEST,里面有个参数
可以是SET_XXX,但是并不支持
动态的修改网卡地址。以前我不知道,看到这个特性
兴奋的不行,做了好几天,死机无数次之后,实在是
大惑不解,问了一个老外才知道ndis根本就不支持,
其实仔细看一下NE2000的SAMPLE也就知道了,可就是
浮躁,没仔细看,faint...

--
补遗之二:漫谈网卡的混杂模式
一个计算机网络适配器缺省工作时仅仅能捕获到那些
目的地址是本适配器MAC地址(对于以太网适配器来说,
在绝大多数情况下就是物理地址。)的数据帧,这就减
少了网络适配器驱动程序的负荷,有助于提高性能。当
希望捕获数据时,不能仅仅捕获目的地址是本适配器MAC
地址的数据帧,应该捕获所有经过该适配器的数据帧。
方法是设置网络适配器的接收模式,可以通过向适配器的
端口上写控制字,使得适配器工作在混杂模式下,这样适配
器能够捕捉到网络中通过它的所有数据帧,并把数据帧交给
驱动程序。具体实现由于各个操作系统的内核和网络系统结构
不同,有很大的差异。
对于9X/NT来说,都是在核心态里调用NDISREQUEST,设置网卡
工作模式为混杂模式的。NDISREQUEST是由MINIPORT DRIVER
的MINIPORTSETINFORMATION响应的。至于网卡的MINIPORT如何
响应,说来实在话长,在这里只要知道在核心态,先调用
ndisopenadapter得到ndishandle,再调用ndisrequest就行了。

因为前几天到泰山去玩,没有写什么东西,也为了这个版的繁荣,
一口气写了这么多,费了我整整一个下午的时间。faint.....

--


--

    欲慰韶华携吴钩,剑雪刀霜遣风流。
    一蓑烟雨平生事,道无狂嚣亦无愁!

※ 来源:·UNIX编程 apue.dhs.org·[FROM: 211.101.140.97] --
※ 转寄:·UNIX编程 apue.dhs.org·[FROM: 210.39.3.50]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.146]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店