如何捕获以太网数据包 ?(200分)

  • 主题发起人 meckyhan
  • 开始时间

liling 我用我全部的分跟你换:)~
guoyanli@163.net
 
liling 给我一份好吗??

gaosheng@china.com
 
to liling:
me too .
<a href="mailto:hotty@shtdu.edu.cn">whpjyj</a>
 
cc to me,chen_ke@263.net
 
to liling
m 2
adam_love@263.net
分一定会给的,
 
To Liling

I am a beginner.
Please send me that too. (andyp@263.net)
Thank you.
 
IPMAN是一个对vpacket.vxd应用的软件,vpacket.vxd的实质是windows系统中
ndis3层上应用的范例,vpacket有源码,目前IPMAN所带的vpacket.vxd是支持
windows95/98,在源码中填加有关NT的权限控制,就可以在NT中使用。

有兴趣的人可以下载vpacket.zip中含有C的源代码。

search "Packet Driver" in yahoo,可以找到有关的资料。
 
liling:
我很穷,可以做善事吗?
g622@263.net
 
像这种Sniffer在Unix和Linux下面都是Open Source
的,IPMan是清华BBSHacker版上的Open Source,
主要是要用到vpacket.vxd.Unix系统下面的书可以看
<<Unix Network Programming>>26章。像Sterm0.99版
本还可以监看到同一网段上面的别人telnet的所有东
西呢。连细节都不用你写了。

win2000已经推出了,在win2000下面有API可以调用
直接接收网络内部的所有包,像vpacket.vxd就要消
失了,具体的API调用可以参见MSDN1999.10和MSDN2000.1
版本。或者是<<Windows网络编程技术>>上面也有。

不过说真的。这种东西只能sniffer到同一个share hub
上面的东西,没有什么用处的。
 
Win2k中有Network Monitor 可实现你的要求。
 
SNIFFER原理

袁哥 < yuange@163.net >
<< http://www.isbase.com/ >>
大家经常讨论SNIFFER,觉得还是很多人没有真正理解SNIFFER,所以把我的一点理解写出来大家共享。
先讲讲HUB的工作原理吧。由于以太网等很多网络(常见共享HUB连接的内部网)是基于总线方式,
物理上是广播的,就是一个机器发给另一个机器的数据,共享HUB先收到然后把它接收到的数据再发给别
的(来的那个口不发了)每一个口,所以在共享HUB下面同一网段的所有机器的网卡都能接收到数据。交换
式HUB的内部单片程序能记住每个口的MAC地址,以后就该哪个机器接收就发往哪个口,而不是像共享HUB那
样发给所有的口,所以交换HUB下只有该接收数据的机器的网卡能接收到数据,当然广播包还是发往所有口。
显然共享HUB的工作模式使得两个机器传输数据的时候别的口也占用了,所以共享HUB决定了同一网段同一时
间只能有两个机器进行数据通信,而交换HUB两个机器传输数据的时候别的口没有占用,所以别的口之间也可
以同时传输。这就是共享HUB与交换HUB不同的两个地方,共享HUB是同一时间只能一个机器发数据并且所有机
器都可以接收,只要不是广播数据交换HUB同一时间可以有对机器进行数据传输并且数据是私有的。

再讲讲网卡的工作原理。网卡收到传输来的数据,网卡内的单片程序先接收数据头的目的MAC地址,根据
计算机上的网卡驱动程序设置的接收模式判断该不该接收,认为该接收就接收后产生中断信号通知CPU,认为
不该接收就丢掉不管,所以不该接收的数据网卡就截断了,计算机根本就不知道。CPU得到中断信号产生中断,
操作系统就根据网卡的驱动程序设置的网卡中断程序地址调用驱动程序接收数据,驱动程序接收数据后放入
信号堆栈让操作系统处理。

有了这HUB、网卡的工作原理就可以讲SNIFFER了。首先,要知道要SNIFFER的东西必须是要物理信号你能收
到的东西。显然只要通知网卡接收其收到的所有包(一般叫作乱模式),在共享HUB下就能接收到这个网段的
所有包,但是交换HUB下就只能是自己的包加上广播包。知道了原理那就好办。要想在交换HUB下接收别人的
包,那就要让其发往你的机器所在口。交换HUB记住一个口的MAC是通过接收到来至于那个口的数据后记住其
源MAC,就像一个机器的IP与MAC对应的ARP列表,交换HUB维护一个物理口(就是HUB上的网线插口,这而的所
有HUB口都是指这)与MAC的表,所以可以欺骗交换HUB的。那样你发一个包设置源MAC是你想接收的机器的MAC,
那么交换HUB就把你机器的网线插的物理口与那个MAC对应起来了,以后发给那个MAC的包就发往你的网线插口
了,也就是你的网卡可以SNIFFER到了。注意这物理口与MAC的表与机器的ARP表一样是动态刷新的,那机器发包
后交换HUB就又记住他的口了,所以实际上是两个在争,这只能应用在只要收听少量包就可以的场合,或者干脆
你弄死要冒牌的机器。还有内部网嘛基于IP的通信你可以用ARP欺骗别人机器让其发给你的机器就可以了,如果
要想不影响原来两方的通信,可以欺骗两方,让其都发给你的机器你的机器再转发,就是做中间人,这用ARP加
上编程很容易实现。还有现在很多设备支持远程管理,有很多交换HUB可以设置一个口监听别的口,不过这就要
管理权限了。

拨号用户嘛就是拨号服务器接收到包根据IP分析是哪个拨号用户的包,可能也是通过查找分配拨号用户的IP
与拨号电话线的一个列表,然后就发往那个拨号用户的电话线,所以其相当于交换HUB,但这儿是用的IP,交换
HUB是用的MAC,所以拨号用户能接收到自己的包。相应的要想接收别的包就得欺骗拨号服务器,当然这不是交换
HUB那么好欺骗,因为显然拨号服务器的IP与电话线的列表不是交换HUB那么维护的,可以看能不能破了拨号服务
器改其驱动让其所有包都发给你,显然不太可能了。:(

下面是3COM网卡驱动程序,结合此程序讲讲网卡的原理,你可以对照程序理解。可能有的网卡有些不一样,
但大致原理一样,所以理解很多东西不能完全照搬。

一般网卡有个网卡地址MAC,这地址网卡厂家得申请,每个厂家得到一段地址,不同厂家不同就像IP地址的分
配一样,然后用这段地址分配给其生产的每个网卡一个地址。一般说来网卡厂家保证每个网卡地址不同,实际上
网卡地址一般不是放在网卡内部程序里,因为网卡内程序一般都是固化的,相同网卡所有网卡的程序全部一样,
还有很多网卡可以配置支持很多方式,所以一般网卡都带一个EEPROM存储器,网卡地址MAC就放这里面。其实网
卡接收包有几种方式,接收指定MAC地址的包、广播包、组播包、所有的包等,可以对其编程。通常网卡驱动程
序设置的是接收指定MAC地址的包和广播包,如果设置了接收所有的包,就是我们常说的用于SNIFFER的乱模式。
网卡内单片接收指定MAC地址的包的MAC也不是内部程序直接通过EEPROM的数据得到,而是驱动程序通过读E2PROM
得到MAC,再把这MAC告诉网卡的MAC寄存器,网卡的内部程序通过MAC寄存器得到的,并且以此为标准。所以只要
改驱动程序把你想要的MAC告诉MAC寄存器那么就得到你想要的MAC了。

一、关于MAC:
1。 for (i = 0; i < 3; i++)
phys_addr = htons(read_eeprom(ioaddr, i));
读EEPROM中的MAC,有差不多的两个地方,可能是ISA、PCI总线网卡的差别,每次读出来的是字(两个字节)。

static ushort read_eeprom(short ioaddr, int index)
{
outw(EEPROM_READ + index, ioaddr + 10);
/* Pause for at least 162 us. for the read to take place. */
udelay (500);
return inw(ioaddr + 12);
}

这是读EEPROM的数据的函数调用,看这很可能有可以写EEPROM数据的可能,就是E2PROM里面的MAC数据可以改写,
原来很多网卡有设置程序可以指定其MAC地址的,所以。。。

2。 memcpy(dev->dev_addr, phys_addr, sizeof(phys_addr));
EEPROM中读出来的MAC地址拷贝到DEV_ADDR中。
3。 for (i = 0; i < 6; i++)
outb(dev->dev_addr, ioaddr + i);
MAC写入MAC寄存器中,网卡是以写入MAC寄存器的内容为标准,实际上与网卡EEPROM数据中的MAC无关。还有发
包的时候与源MAC无关,就和现在的IP包发包的时候的源IP可以随便填一样,只是接收包的时候网卡通过MAC寄存
器内容和接收模式判断该不该接收。当然别人接收包后回复一般都是把收到的包的源MAC当目的MAC,所以你发包的
源MAC是假的话可能也收不到回复包。
还有要改MAC只要这儿的DEV_ADDR为你想要的MAC就可以,这儿可以从一个文件读入MAC地址或者WINDOWS那样从
注册表里面读取MAC内容,这就要看驱动程序额外提供的接口了。

二、关于接收模式:
enum RxFilter {
RxStation = 1, RxMulticast = 2, RxBroadcast = 4, RxProm = 8 };
是定义的接收模式。

SetRxFilter = 16<<11,
是定义的设置接收模式的命令

outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
是设置接收模式,加上RxMulticast还是RxProm应该就是乱模式了。

 
还不结案。
 
接受答案了.
 
to kill-k, 你好

能说说怎么从eeprom中读取MAC吗?
 
to liling:stony@sjtu.edu.cn
ths
 
用winpcap吧,想截什么就能截什么,包括整个局域网!!!
下载地址http://winpcap.polito.it

源代码是公开的
 
顶部