荔园在线

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

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


发信人: bstone (无心伤害), 信区: Hacker
标  题: 网卡与sniffer(袁哥)
发信站: BBS 荔园晨风站 (Fri Mar 17 21:00:57 2000), 站内信件

发信人: cloudsky (小四), 信区: Security
标  题: 网卡与sniffer(袁哥)
发信站: 武汉白云黄鹤站 (Thu Mar  9 11:34:23 2000), 站内信件

标题:SNIFFER的一点知识

大家经常讨论SNIFFER,觉得还是很多人没有真正理解SNIFFER,所以把我的
一点理解写出来大家共享。
首先,要SNIFFER的东西必须是要物理信号你能收到的东西。由于很多网络
(常见HUB连接的内部网)是基于总线方式,物理上是广播的,就是一个机器
发给另一个机器的数据,HUB把它接收到的数据再发给别的(来的那个口不发了)
每一个口,所以所有的机器的网卡都能接收到,只是网卡内的程
序(卡内的单片程序)判断其该不该接收,认为该接收就接收后通知CPU(产生中断),
网卡的驱动程序通过中断程序接收后放入堆栈让计算机处理。但交换式
HUB(内部单片程序)能记住每个口的MAC地址,以后就该哪个机器接收就发往
哪个口,当然广播包还是发网所有口。所以嘛,只要通知网卡接收其收到的所有
包(一般叫作乱模式),在HUB下就能接收到这个网段的所有包,但是交换HUB下就
只能是自己的包加上广播包。知道了原理那就好办。要想在交换HUB下接收别
人的包,那就要让其发往你的机器所在口。交换HUB记住一个口的MAC是通过接收
到来至于那个口的数据后记住其源MAC(就像一个机器的IP与MAC对应的ARP列表),
所以可以欺骗交换HUB的,还有内部网嘛你可以用ARP欺骗别人机器让其发给你的
机器就可以了。显然这样可能能听少量机器的包,要想听所有的包就还是比较困难了。
拨号用户嘛就是拨号服务器接收到包分析是哪个拨号用户的包(当时拨号用户的IP
拨号用户嘛就是拨号服务器接收到包分析是哪个拨号用户的包(当时拨号用户的IP
判断),然后就发往那个拨号用户的电话线,所以其相当于交换HUB,但这而是用
的IP,内部网是用的MAC,所以拨号用户能接收到自己的包。相应的要想接收别的
包就得欺骗拨号服务器,当然这不是交换HUB那么好欺骗,看能不
能破了拨号服务器改其驱动让其所有包都发给你,显然不太可能了。:(

下面是3COM网卡驱动程序,结合此程序讲讲网卡的原理。可能有的网卡有些不一
样,但大致原理一样,所以理解很多东西不能完全照搬。
一般网卡有个网卡地址MAC,这地址网卡厂家得申请,每个厂家得到一段地址(不
同厂家不同,就像IP地址分配一样),然后用这段地址分配给其生产的每个网卡一
个地址。一般说来网卡厂家保证每个网卡地址不同,实际上网卡地址一般不是放在
网卡内部程序里,因为网卡内程序一般都是固化的,同一种网卡所有网卡的程
序全部一样,还有很多网卡可以配置支持很多方式,所以一般网卡都带一个EEPROM存
储器,网卡地址MAC等配置数据就放这里面。
其实网卡接受包有几种方式,接收指定MAC地址的包、广播包、所有的包,可以对其
编程,而其MAC地址也不是内部程序直接通过EEPROM的数据得到,而是驱动程序通过
读E2PROM得到MAC,再把这MAC告诉网卡的MAC寄存器,网卡的内部程序通过MAC寄存
器得到的,并且以此为标准。所以只要改驱动程序把你想要的MAC告诉MAC寄存器那
么就得到你想要的MAC了。

一、关于MAC:

1。for (i = 0; i < 3; i++)
1。for (i = 0; i < 3; i++)
   phys_addr[i] = 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[i], ioaddr + i);
   MAC写入MAC寄存器中,网卡就是以这为标准,所以要改MAC只要这儿的DEV_ADDR是你
        outb(dev->dev_addr[i], ioaddr + i);
   想要的MAC就可以,注意前面是3个字的变量,这儿是使用6个字节。

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

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

outw(SetRxFilter | RxStation | RxBroadcast, ioaddr + EL3_CMD);
是设置接收模式,加上RxMulticast还是RxProm应该就是乱模式了。
--
            我问飘逝的风:来迟了?
            风感慨:是的,他们已经宣战。
            我问苏醒的大地:还有希望么?
            大地揉了揉眼睛:还有,还有无数代的少年。
            我问长空中的英魂:你们相信?
            英魂带着笑意离去:相信,希望还在。

※ 来源:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: 203.207.226.124]

--
☆ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: bbs@192.168.28.23]


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

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