截取别的机器Ping过来的ICMP包。

解决方案 »

  1.   

    Delphi6有个ICMP控件,不知道能不能截取
      

  2.   


    [摘要] 本文给出了一个基于web的、跨平台的校园网网络计费系统的初步设计与实 
        施方案,并给出系统的模块结构和功能的描述,同时详细地探讨了计费信息 
        获取子系统(底层数据报文截取及其接口)的分析、设计与实现。 
    [关键词]计费系统、底层数据报文截取、tcp/ip、ftp、数据报文、共享介质 
         信息流量、虚拟设备、vxd技术、数据采集、数据控制 
    一、引言       
       因特网以其信息传送方便、快捷、费用低廉,并且可以实现资源共享等诸多优点, 
    深受广大用户青睐。目前,我院已通过国家教科 
    网连入因特网,给我们的教学、科研带来极大的方便,同时也不可回避因特网服务的计 
    费问题。目前的网络虽然在速度上有了很大的提 
    高,但是随着网络用户数量的迅速增加和传输量的增加(比如图片和多媒体资料越来越 
    普遍),网络带宽仍然很紧张。对网络使用收取 
    合理的费用一方面可以维持网络的运行和发展,另一方面,也可以促使用户合理使用网 
    络资源。由于网络结构的多样性和计费规则的复 
    杂性,为此我们分析我院校园网的特点,在校园网网络的软硬件上提出了一种校园网的 
    网络计费系统的设计与实施方案。 
      作为计费信息系统的基础,计费信息的截取是系统整体的核心关键部分,该模块的 
    分析、设计与实现好坏直接影响着系统的设计与 
    实现和校园网的网络计费管理,本文对此进行详细的探讨和讨论。 
    二、系统设计和分析 
      国际上,计费管理负责监视和记录用户对网络资源的使用,并分配网络运行成本。 
    其主要功能有: 
    数据的采集(包括简单的统计功能),即从用于计费的设备(如计费路由器)中采集原 
    始数据,经过简单的统计后,放入数据库。 
    在数据采集的同时进行简单的统计是必要的。一个原因是原始数据量是非常大的,如果 
    全部记录下来,数据库往往不够;另一个原 
    因是对原始数据的查询统计非常费时间,因此需要在数据采集的同时进行简单的统计。 
      
    数据统计,即对数据库中的数据进行进一步的统计,如对某个时间段的某个ip地址区间 
    的流量统计。 
    流量分析,即结合数据库中的流量数据和其它有关信息,对流量作出分析。如非法用户 
    流量,对敏感站点的访问流量等。 
    计费信息查询,即根据用户管理模块提出的查询要求,通过权限检查,根据用户类型从 
    数据统计和流量分析模块中取得相应的查询 
    结果。 
    报表生成,即根据流量数据和收费规划,计算用户应交的费用,并生成报表。 
    计费规划的维护,即修改各种计费参数,如单价、免费网段设置等。 
      我院校园网的主干网络采用高速非共享介质的网络结构,但是院内各部门与外界的 
    互联均依赖共享介质,所以我们设计的校园网网络 
    计费系统正是建立在这一"关口"上。 
      在共享介质网络中,流经这一网络的任何数据包,均可由这一网段的任何一台主机 
    所截获。因此,把网络计费系统设计在与外界互联 
    的网段上,即可统计出校园内各部门与外界的所有通信量。 
      总体上,我们所设计的网络计费系统分为三部分,一是在win32平台上的线程对数据 
    包的截获,并且进行初步的整理,生成日志文件, 
    并加适当的控制,这是低层的服务程序,作为前台;而后台则是在windows nt server上 
    的数据库管理,用borland delphi 4.0开发,直接 
    取得第一部分截取程序生成的日志文件和通过ftp获取在linux服务器上其它服务生成的 
    日志文件,对其分析,统计出有效的数据信息,并至 
    于以bde驱动的数据库文件中。三是计费信息用户查询子系统,使得用户能在线通过权限 
    查询到自己各个时间段内的计费信息和费用情况, 
    有利于减轻网络管理员的工作负担。 
       具体情况如下: 
       ⑴、因特网采用的是tcp/ip协议,所以win32平台上的进程只要截获到所有的ip数据 
    包,就可以分析出所需要统计的计费信息。对于统 
    计信息分以下几种情况: 
        ftp:又分上传和下载,下载的数据报信息不用列入统计范围,上传则需要; 
        udp:数据报信息需要统计; 
        拨号上网:可以通过在路由器上生成的日志文件进行分析; 
        电子邮件:也可以通过windows nt server上的nescape邮件服务器留下的日 
             志文件进行统计,而不需要进行数据报的截获; 
       ⑵、后台的数据库信息管理通过由delphi开发的管理信息系统采集上述的数据信息 
    实现的,对ftp、udp、拨号上网和电子邮件的信息 
    进行再次整理、分析,统计出必要的数据存于数据库中,可供使用校园网服务的各部门 
    查询其费用情况之用。 
       ⑶、计费?息用户查询子系统,?户通过页面浏览器访问,提交请求反馈该?户使 
    用校园网信息服务的费用情况。查询子系统通过权 
    限(如身份认证)和查询条件查询数据库的数据,输出该用户的需求的信息。 
      系统计费依据 
      对于网络计费的信息而言,最根本的是ip地址、网络流量以及时间段。因此,系统 
    的计费依据就是ip的地址和流量,还有时间段的统 
    计,以此信息作为收费规则。 
       ㈠、ip地址  区分出校内和校外、国内和国外。由于因特网的网络地址管理都是 
    划分层次的,只要知道其隶属于哪一层次即可进行 
              」芾恚?
       ㈡、ip流量  区分出国内和国外的数据流量来统计; 
       ㈢、时间段  《杂 拨号上网的用户,不同的时间段有不同的收费规则; 
       ㈣、特殊的校内部门有其对应的计费依据。 
    三、计费信息获取子系统(底层数据报截取及其接口)的分析与设计 
    3.1 关于vxd技术 
      、?为什么要使用vxd技术 
          为了减轻服务器的负担,而我院校园网的主干网络采用高速非共享介质的 
    网络结构,但是院内各部门与外界的互联均依赖共享介 
        质,根据这一特点可用一台独立的计算机来处理计费工作以达到这一目的。这台 
    服务器的操作系统可以是linux也可以采用win32,但 
        win32具有易操作、可视化的的优点。虽然win32平台不支持对设备的直接存取, 
    但可以采用vxd技术来实现这一功能。 
      、?vxd在网卡上应用的关键技术 
        a. 载入vxd 
        #include handle hvxd; 
        hvxd = createfile("\\\\.\\vpacket.vxd", 
                  generic_read | generic_write, 
                  0, 
                  null, 
                  open_existing, 
                  file_attribute_normal | file_flag_overlapped | f 
    ile_flag_delete_on_close, null); 
                  if (hvxd == invalid_handle_value) 
                  return syserr; 
        b. 释放vxd 
        closehandle(hvxd); 
        c. 绑定vxd到网络接口卡 
        int bind(handle hvxd, byte* inbuffer) 
        { 
        handle hevent; 
        dword cbret; 
        overlapped ovlp = {0,0,0,0,0}; 
        int result; 
        int cbin = 5; 
        hevent = createevent(0, true, 0, null); 
        if (!hevent) 
        return syserr; 
        ovlp.hevent = hevent; //deviceiocontrol函数直接发送一个控制码给指定的 
    设备促使相应的设备去执行指定的操作 
        result = deviceiocontrol(hvxd, 
                    ioctl_protocol_bind, 
                    inbuffer, 
                    cbin, 
                    inbuffer, 
                    cbin, 
                    &cbret, 
                    &ovlp); 
        if (!result) 
          getoverlappedresult(hvxd, 
                    &ovlp, 
                    &cbret, 
                    true); 
        closehandle(hevent); 
        return ok; 
        } 
        d.读数据包 
        int rcvpacket(handle hvxd, byte* buffer, dword cbin) 
        { 
        handle hevent; 
        dword cbret = 0; 
        overlapped ovlp = {0,0,0,0,0}; 
        int result; 
        hevent = createevent(0, true, 0, null); 
        if (!hevent) 
        return syserr; 
        ovlp.hevent = hevent; 
        result = deviceiocontrol(hvxd, 
                    ioctl_protocol_read, 
                    buffer, 
                    cbin, 
                    buffer, 
                    cbin, 
                    &cbret, 
                    &ovlp); 
        if (!result) 
          getoverlappedresult(hvxd, 
                    &ovlp, 
                    &cbret, 
                    true); 
        closehandle(hevent); 
        return cbret; 
        } 
        e.送数据包 
         与ioctl_protocol_read相似,此时参数为ioctl_protocol_write  
      

  3.   

    3.2 截取部分的分析与设计 
      由于校园网网络计费系统分为三大部分,采用底层数据报文截取来提供计费管理的 
    信息依据,所以首先就要从相关的网络方面知识入手。 
      在计算机网络体系结构中,虽然tcp/ip体系结构不是国际标准,但占有非常重要的 
    地位。世界上第一个分组交换网是美国军方的实验网 
    arpanet,它的体系结构也采用分层次的结构。当初的arpanet现已发展成为世界上规模 
    最大的计算机网络internet,即因特网。在因特网所 
    使用的协议中,最著名的就是运输层的tcp传输控制协议和网络层的ip互连网协议。tcp 
    /ip体系结构已成为计算机网络的事实上的国际标准, 
    也称为工业标准。 又因为因特网采用的是tcp/ip协议(传输控制协议与互连网协议), 
    流经共享介质的网络任何的数据报文遵循着该协议, 
    所以win32操作系统平台上的数据报截取进程模块只要截获到所有的tcp/ip数据报,从其 
    报文的首部即可分析出所需的必要计费数据信息。 
      而对于网络计费系统的计费信息而言,最根本的是源ip地址、目的ip地址、源端口 
    、目的端口、tcp/ip数据报文的长度以及报文流经该 
    共享介质网段的时间。这些信息的获取就要采用tcp/ip协议,进行相应的处理。因此, 
    网络计费系统计费依据的获取就是ip的源、目的地址, 
    源、目的端口和tcp/ip数据报文长度,还有报文流经的时间这项重要信息的获取。 
      首先是分析tcp/ip网络体系下两个最主要的协议--互连网协议ip和传输控制协议的 
    数据报文格式开始,从协议报文最基本的字段信息中 
    提取出对计费管理有效的数据依据。 
    以下详细描述tcp/ip报文格式。 
    ip数据报文段的格式如下所示: 
    其中首部中几个重要字段的意义是: 
    总长度 占16bit,是指首部和数据之和的长度,单位为字节,在本文中又称之为流量, 
    数据报文的最大长度为65535字节, 
    这在当前是够用的 
    协议 占8bit,是指此数据报文所携带的运输层数据是使用何种协议,以便目的主机的 
    ip层知道应将此数据报文上交给哪 
    个进程,常用的协议和相应的协议字段值是: 
        udp(17)、tcp(6)、icmp(1)、gcp(3)、egp(8)、igp(9) 
        spf(89)以及iso的tp4(29) 
    源站点ip地址 占32bit,数据报文发送的主机地址 
    目的站点ip地址 占32bit,数据报文发送到的主机地址 
    数据 数据报文所携带的的数据信息 
    而相应的tcp数据报文段的格式如下所示: 
    其中首部中重要字段的意义是: 
    端口 tcp使用端口(port)进行寻址。在主机中往往有多个进程在运行,为区分哪个进程 
    在进行通信,就必须在运输层上设置 
       一些端口,一个端口是一个16bit的地址。对于一些常用的应用层服务,都各有一 
    个对应的端口号,这些端口号称为熟 
       知端口(wellknown port),数值为0~255。常用的熟知端口有:ftp(文件传输 
    协议)21、telnet(远程登录)23、 
       smtp(简单邮件传输协议)25、www(world wide web)80、pop3(邮局协议)1 
    10等。 
      从上述的两种数据报文的首部格式可见,要对截获的tcp/ip数据报进行必要的信息 
    提取,即将总长度、协议、源站点ip地址、 
    目的站点ip地址、源端口、目的端口这几个字段从数据报文中分离出来,再加上实时截 
    获时的系统时间,就可以构成一条较为完整 
    的计费信息记录,但是对此记录还需进一步的过滤处理,只有源站点ip地址和目的站点 
    ip地址至少二者之一为院内ip地址时,才能 
    真正算是构成完整的信息记录。 
      其次是如何进行tcp/ip数据报文的截获。由于计费信息的实时动态性,及win32操作 
    系统的普遍性、易操作和可视化等优点,所 
    以我们决定在win32平台上编写底层数据报截取模块,但是win32系统不提供底层设备的 
    直接操作,于是我们利用win32的编程特色,使 
    用虚拟设备驱动程序的技术,使win32系统对设备的控制如同对文件的操作,(前面已详细 
    描述了vxd技术)任何流经共享介质网段的数 
    据报文也必然会流经连接在共享介质网段上的计算机的设备(网卡),利用对虚拟设备 
    驱动程序的读写就能够轻易地操作该设备, 
    截获所有的tcp/ip数据报文。又因为在共享介质网段上流经的数据报文的流量是不可估 
    算的,所以采用线程技术的编程思想,就能较 
    好地处理数据报文的流量问题。 
      第三是底层数据报文截取和windows nt server上服务端计费管理部分的接口是通过 
    生成数据报文流量的日志文件进行沟通的。 
    tcp/ip数据报文的日志文件处理问题,也即截获有效的计费信息记录后,如何交给服务 
    端的管理应用程序进行进一步的数据处理。在 
    获得tcp/ip数据报文时分离出"总长度、源站点ip地址、目的站点ip地址、源端口、目的 
    端口"这几个重要的字段信息,并附加上当前 
    的系统时间,以一定的形式分隔作为一条记录存放在windows nt server系统的ftp服务 
    管理路径下的日志文件中或者指定的某一路径, 
    供windows nt server上的计费系统服务管理端下载处理或直接拷贝。当服务管理端的数 
    据处理模块使用ftp协议,将win32操作系统 
    下的数据报文流量日志下载或拷贝后,对其中未分析的记录进行处理:先将每一条记录 
    重新分割,还原为计费信息依据的几个重要字 
    段,然后导入到相应的库表中,同时对端口类型分类统计,根据ip地址表区分出校内外 
    、国内、国际的入流量和出流量;再对记录的 
    时间划分,根据收费规则表、节假日收费表和流量计算出相应的日、月信息费用(费用 
    是累计上去的),存储入库表,就完成了计费 
    系统的数据处理和计费功能。 
      从上可见,网络计费管理系统的核心关键部分就在于"数据报文的截获----分类、统 
    计、汇总相应的计费信息"两个子系统,前者 
    充分利用win32操作系统的特性和系统核心编进行数据报文的截取、后者采用数据库技术 
    对计费信息的进行系统管理,两者的处理是 
    相互独立的,但同时各自又有必然的联系。查询系统的虽然是一个独立的模块,但可以 
    看成计费处理信息的一部分。 
    计费信息截获子系统,该子系统模块的详细结构图如下所示: 
    3.3流量控制的原理分析和总体设计 
      在任何网络体系结构的层次中,控制都是必不可少的功能,但不同的层次有不同的 
    控制内容,不同层次之间的有不同的分工。 
    tcp/ip体系结构中ip层同osi/iso体系结构中的网络层相似,其控制功能包括:差错控制 
    、拥塞控制以及路径控制等。ip层作为tcp/ip 
    体系结构中至关重要的一层,其控制功能是最复杂的。ip层协议icmp,就是tcp/ip中传 
    递网络控制信息的主要手段。同时,icmp还提供 
    差错报告功能,可以利用它实现校园网的流量控制。 
      如同其他高层协议数据一样,icmp报文也是封装在ip数据报的数据部分中进行传输 
    的,如图所示。 
                                   ip数据报 icmp数 
    据的封装 
         “琲cmp报文的ip数据报报头"协议"域指出数据区内容为icmp报文。    
      icmp报文也分为头标和数据区两大部分,其中头标包含"类型"、"代码"和"校验和" 
    三个域。 
       icmp报文格式如图所示。 
       其中"类型"域是一个字节的整数,指出icmp报文的类型 
         "代码"域是也是一个字节的整数,提供关于报文类型的进一步信息 
         "校验和"域共两个字节长,提供整个icmp报文的校验和 
         "数据区"包含出错的数据报报头及该数据报前64比特数据。 
      类型域所代表的意义如下表: 
      我们知道,网关的主要功能是进行数据报寻径并转发数据报,网关寻径和转发数据 
    报并不总是能够成功的。在下述情况下, 
    网关便会发现信宿不可到达: ⑴信宿机硬件不在运行中(如故障、关机),⑵发送者指 
    定的信宿地址不存在,⑶网关不知道去 
    往信宿的路径。一旦发生以上情况,网关便会向信宿机发送"信宿不可到达"报文(如图 
    )并抛弃相应数据报。 
             icmp"信宿不可到达"报文格式 
       其中类型3即表示"信宿不可到达"报文。码域可取0-12共十三个值,进一步细分, 
    如表所示: 
      分析我院的网络体系结构,不难发现基于共享介质网络的很容易实现流量控制这一 
    功能,只要伪造一个icmp包即可达到干扰目 
    的。当收到ip包时(不包含icmp本身),分析其ip地址是否有效,如无效,则向信宿发 
    送一个差错控制报文(icmp)即可。在局域 
    网传输的速度远远高于广域网,所以这个差错控制报文(icmp)一定会比正确的信息快 
    得多,导致正确的信息被当作无效数据抛弃, 
    从而达到干扰的目的。这是关键的一个步骤,经过实验证明,使用码值0和1均可,因为 
    所谓"信宿"四个层次的概念,从大到小依次 
    为:网络、主机、协议、端口,因此采用1更合适。 
    四、系统结构和实现 
    4.1 系统的结构 
      校园网网络计费系统的设计是基于web、跨平台的,系统结构图如下所示: 
    4.2 系统的实现 
         网络计费系统在实现时分成三大模块:win32平台截获数据报的进程模块和wi 
    ndows nt server 4.0上的数据库信息管理模块 
    以及web信息查询模块。 
    ①、win32平台上截获数据报进程的子模块: 
        《料 程:负责截获流经共享介质的数据报,并存储在共享内存段中; 
        写线程:负责从共享内存段读出数据报,对其进行初步整理后,写入日志文件 
      
    ②、windows nt 上数据库信息管理的子模块: 
         》治鐾臣菩畔⒛?椋 通过ftp接收来自底层截获的计费信息、邮件服务器上的 
                 邮件日志和路由器上的拨号网络日志,同时进行分析、统 
    计出有效的计费数据,至于数据库当中; 
    ③、web信息查询模块:               」餐亟涌诓糠郑焊萦没У 请求,从计费?息数据库 
    中提取相关的收费信 
                 息并以html的形式返回给用户; 
                 html form部分:用户可以通过浏览器访问该页面,提交请 
    求反馈该用户使 
      
      

  4.   

    说实话
    Vxd我也没有搞过
    所以除了转载这篇文章
    别的芒也帮不上了
      

  5.   

    用sniffer啊。
    我用BCB写过一个。在CSDN的文档区可以找到SNIFFER的源码
      

  6.   

    很久没来。VXD用Delphi恐怕不行吧?我只要简单点,win2000下有socket可以直接调用,我能够收到ICMP包即可,只是小弟对C不熟,谁能给段Delphi的代码?(完整的,包括wsastartup()所有的函数)
    看来要春节后结贴了。
      

  7.   

    普通的ICMP套接字好像就可以听到所有的ICMP信包,但是由于一般的套接字类都是用自己的进程ID先筛选了一下,我认为只要建立原始的套接字就行了,不要用其他的已经安装好的类,不信的话去看WINDOWS网络编程里面的那个ICMP的程序,最后接收时是以进程ID为判断的
      

  8.   

    上面的分析
    主要目的:获得所有的网络信息。
    解决方案:1写一个驱动(VXD,假如在WIN2000下面还要写个WDM)用于监听原始包,)
     2然后在客户程序中进行各种调用(deviceiocontrol)
     3在客户程序中对封包进行各种分析。
      上面只给出了客户程序
    假如对于操作系统为NT的话,可能还有一种选择,因为有个套接字选项好像是recvall,意思就是收取所有的套接字消息,不过我也没用过。用INDY的ICMP控件可能也可以,不过要重载接收函数。哪位有时间去试试吧。取得窃听的ICMP只要分析ICMP的类型就可以了(一共好像是16种类型),在LINUX下面对ICMP还进行了限速(WINDOWS下面也应该实现了,因为这属于RFC里面的要求,用来防止ICMP风暴的),假如两个来自同样IP地址的ICMP之间的时间少于某个值的话,会被直接丢弃而不产生任何消息。
      

  9.   

    我已经做到修改发出包的源IP,现在我要做的是接收任一台机器发送过来的ICMP包,取得我需要的信息。
    我知道有一个socket,好象是什么 set...,可以设置原始套接字取得ICMP信息,我只需要在2000下使用,不需要太复杂(编写vxd之类的),谁能提供一段代码?(需要delphi的)500分给送上!