`

网络包过滤的实现

阅读更多

#include  < stdlib.h >
#include 
< Iphlpapi.h >
#include 
< Fltdefs.h >

#pragma comment(lib, 
" Iphlpapi.lib " )

const   int  XDICT_PORT  =   11113 ;

unsigned 
long  CharToIp( const   char   * sIp)
{
    
int  octets[ 4 ];
    
int  i;
    
const   char   *  auxCad  =  sIp;
    unsigned 
long  lIp  =   0 ;
    
    
// we extract each octet of the ip address
    
// atoi will get characters until it found a non numeric character(in our case '.')
     for (i  =   0 ; i  <   4 ; i ++ )
    {
        octets[i] 
=  atoi(auxCad);

        
if (octets[i]  <   0   ||  octets[i]  >   255 )
            
return   0 ;

        lIp 
|=  (octets[i]  <<  (i * 8 ));

        
// update auxCad to point to the next octet
        auxCad  =  strchr(auxCad,  ' . ' );

        
if (auxCad  ==  NULL  &&  i != 3 )
            
return   - 1 ;

        auxCad
++ ;
    }
    
return  lIp;
}

int  APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     
int        nCmdShow)
{
    
// first get adapter info
    PIP_ADAPTER_INFO pAdapterInfo  =  NULL,tmp;
    unsigned 
long  len  =   0 ;
     GetAdaptersInfo(pAdapterInfo,
& len);
    pAdapterInfo 
=  (PIP_ADAPTER_INFO) malloc (len);
    DWORD result 
=  GetAdaptersInfo(pAdapterInfo,  & len);
    
if (result != ERROR_SUCCESS)
    {
        MessageBox(NULL,
" Fail to call GetAdaptersInfo " , " ERROR " ,MB_OK);
        
return   - 1 ;
    }

    
// create filters interface
    INTERFACE_HANDLE hInterface  =  NULL;
    result 
=  PfCreateInterface( 0 ,PF_ACTION_FORWARD,PF_ACTION_FORWARD,FALSE,TRUE, & hInterface);
    
if (result != NO_ERROR)
    {
        MessageBox(NULL,
" Fail to call PfCreateInterface " , " ERROR " ,MB_OK);
        
return   - 1 ;
    }

    
// add the filter to adapter
    unsigned  long  dmp  =   0 ;
    PF_FILTER_DESCRIPTOR ipFlt;
    ipFlt.dwFilterFlags     
=   0 ;
    ipFlt.dwRule            
=   0 ;
    ipFlt.pfatType          
=  PF_IPV4;
    ipFlt.dwProtocol        
=  FILTER_PROTO_UDP;
    ipFlt.fLateBound        
=   0 ;
    ipFlt.wSrcPort          
=   0 ;
    ipFlt.wSrcPortHighRange 
=   0 ;
    ipFlt.wDstPort          
=  XDICT_PORT;
    ipFlt.wDstPortHighRange 
=  XDICT_PORT;
    ipFlt.SrcAddr 
=  (PBYTE) & dmp ;
    ipFlt.SrcMask 
=  (PBYTE) & dmp;
    ipFlt.DstAddr 
=  (PBYTE) & dmp;
    ipFlt.DstMask 
=  (PBYTE) & dmp;

    
// bind
    IP_ADDR_STRING  * localIp;
    
for (tmp = pAdapterInfo;tmp  !=  NULL;tmp = tmp -> Next)
    {
            
//  each ip of a adapter
             for (localIp =& tmp -> IpAddressList;localIp != NULL;localIp = localIp -> Next)
            {
                unsigned 
long  ul  =  CharToIp(localIp -> IpAddress.String);
                PBYTE lIp 
=  (PBYTE) & ul;
                PfBindInterfaceToIPAddress(hInterface, PF_IPV4, lIp);
            }
    }

    result 
=  PfAddFiltersToInterface(hInterface, 1 , & ipFlt, 1 , & ipFlt,NULL);
    
if (result != NO_ERROR)
    {
        MessageBox(NULL,
" Fail to call PfAddFiltersToInterface " , " ERROR " ,MB_OK);
        
return   - 1 ;
    }

    
// start XDict
    STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory( 
& si,  sizeof (si) );
    si.cb 
=   sizeof (si);
    ZeroMemory( 
& pi,  sizeof (pi) );
    ::CreateProcess(NULL,
" XDICT.exe " ,
        NULL,             
//  Process handle not inheritable. 
        NULL,              //  Thread handle not inheritable. 
        FALSE,             //  Set handle inheritance to FALSE. 
         0 ,                 //  No creation flags. 
        NULL,              //  Use parent's environment block. 
        NULL,              //  Use parent's starting directory. 
         & si,               //  Pointer to STARTUPINFO structure.
         & pi );             //  Pointer to PROCESS_INFORMATION structure.

    
//  Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );
    
//  Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );


    
// remove filter
     for (tmp = pAdapterInfo;tmp  !=  NULL;tmp = tmp -> Next)
    {
        result 
=  PfRemoveFiltersFromInterface(hInterface, 1 , & ipFlt, 1 , & ipFlt);
        
if (result != NO_ERROR)
        {
            MessageBox(NULL,
" Fail to call PfRemoveFiltersFromInterface " , " ERROR " ,MB_OK);
            
return   - 1 ;
        }
    }
    PfUnBindInterface(hInterface); 
    PfDeleteInterface(hInterface);

    
// free
    free(pAdapterInfo);
    
return   0 ;
}

使用的API有
GetAdapaterInfo --- 取得网卡的信息,如ip
PfCreateInterface ----Create一个Filter Interface
PfBindInterfaceToIPAddress ----绑定Filter Interface到IP
PfAddFiltersToInterface ----增加Filter到Interface
PfRemoveFiltersFromInterface ---Remove Filter
PfUnBindInterface---取消绑定到ip
PfDeleteInterface---删除Filter Interface

分享到:
评论

相关推荐

    包过滤主机防火墙技术的研究

    求,对包过滤防火墙这一传统的防火墙体系结构进行了分析与改 进,提出一种充分利用现有技术与实验条件的包过滤防火墙系统 的设计方案,即在保留传统网络边界防火墙的同时,设计一种驻 留在内部网络终端的主机防火墙...

    SharpPcap实现网络抓包及过滤特定包

    《利用SharpPcap进行网络抓包与特定包过滤》 在网络监控、数据分析和故障排查等领域,网络抓包工具起着至关重要的作用。本文将详细探讨如何利用C#库SharpPcap来实现网络数据包的捕获,并针对特定IP地址的UDP包进行...

    基于网络处理器安全应用通用平台的包过滤防火墙的设计与实现

    经过对现有网络安全技术...存在很多类似的地方,如包过滤防火墙系统、基于规则匹配的IDS系统及流量分 析系统等等,都是基于规则进行检测的系统;而且,这些不同的应用系统匹配的 对象都是一致的,匹配对象为IP数据包。

    yuandaima.rar_包过滤_网络数据包

    总结,"yuandaima.rar"中的源代码很可能是实现包过滤功能的程序,它能够捕获并分析网络数据包,帮助用户监控和控制网络流量,提高网络安全性,同时提供故障排查的手段。理解包过滤和网络数据包的工作原理对于任何IT...

    基于ndis的包过滤实现firewall

    基于中间层驱动的个人防火墙实现,包括ndis实现的框架,对网络包过滤的实现。

    H3C_ACL包过滤基础配置案例

    **H3C ACL包过滤基础配置案例详解** 在H3C网络设备中,访问控制列表(ACL)是一种重要的网络安全和流量管理工具,用于定义网络流量的过滤规则。本文档将详细讲解一个基于H3C设备的ACL包过滤基础配置案例,适用于H3...

    Linux操作系统中IP包过滤的具体实现

    包过滤技术是防火墙技术的技术核心,本文主要介绍在Linux内核中实现IP包过滤的基本流程,同时对IP伪装和网络地址转换(NAT)的实现作简要的介绍。

    Cisco路由器包过滤的配置.pdf

    Cisco路由器包过滤的配置是指通过 Access Control List(访问控制列表)来控制和过滤网络流量的方法。该配置可以实现路由器和网络的安全控制,保护网络免受恶意攻击和非法访问。 访问控制列表(Access Control List...

    FinalProject基于包过滤的防火墙

    移动网络安全final project,基于包过滤防火墙的实现。MFC界面,VC6.0开发环境。

    python调用tcpdump抓包过滤的方法

    本文将详细讲解如何使用Python调用tcpdump进行抓包过滤,并提供了一个简单的示例代码。 tcpdump是一个强大的网络封包分析软件,它可以实时捕获网络中的数据包并进行分析。在Python中调用tcpdump,主要是通过`...

    论文研究-基于应用层包过滤的个人防火墙研究与实现 .pdf

    基于应用层包过滤的个人防火墙研究与实现,李峰,,本文通过介绍如何运用应用层包过滤技术实现个人防火墙,深入地剖析了网络封包截获的几种方式,并重点介绍了通过NDIS Hook Driver实现��

    基于LINUX包过滤防火墙的设计与实现

    防火墙是一种保护网络的行之有效的安全机制 是保护区的一道安全防线它能够将保护区以外的非法入侵及访问拒之门外对于资金少又有科研人员的单位可采用源代码开放的免费的Linux netfilter/iptables 构建防火墙.

    X00060100 第27章 用访问控制列表实现包过滤

    X00060100 第27章 用访问控制列表实现包过滤 本章节主要介绍了使用访问控制列表(ACL)实现包过滤的技术。ACL 是一种网络安全技术,用于控制网络设备对某些访问或某些数据的能力。通过 ACL,可以对数据包进行识别,...

    Linux内核--基于Netfilter的内核级包过滤防火墙实现.doc

    本人对网络栈的分析是基于早期版本(Linux 1.2.13),在明确了网络栈架构的前提下,上升一步分析高级版本内核中的Netfilter防火墙实现原理,然后进行模块或内核编程,开发一款基于包过滤的个人防火墙。 包过滤防火墙...

    防火墙的过滤算法

    主要研究如何通过基于Windows操作系统内核的包过滤防火墙系统来实现网络安全 防护。基于操作系统内核的包过滤防火墙系统是基于网络层实现的包过滤防火墙系统.该系统要求 能够对所有进出计算机的IP数据包进行灵活...

    高级网络人才培训专家-X00060100 第27章 用访问控制列表实现包过滤

    ### 高级网络人才培训专家-X00060100 第27章 用访问控制列表实现包过滤 #### 知识点概览 - **访问控制列表(ACL)概念** - **ACL包过滤原理** - **ACL分类及其应用** - **配置ACL包过滤** - **ACL包过滤配置应用...

    包过滤防火墙的设计与实现

    防火墙是一种保护网络的行之有效的安全机制 是保护区的一道安全防线它能够将保护区以外的非法入侵及访问拒之门外对于资金少又有科研人员的单位可采用源代码开放的免费的Linux netfilter/iptables 构建防火墙.

    基于IP包内容的Windows包过滤技术的实现

    基于内容的IP 包过滤技术涉及到操作系统的内核。文章分析了W indow s 内核态的网络编程接口, 讨论了W indow s 系统中包过滤的编程实现技术。

    Linux下Libpcap源码分析及包过滤机制(4).doc

    Linux下的Libpcap源码分析及包过滤机制是一个重要的网络编程技术领域,涉及到网络数据包的捕获、过滤和处理。本文档对Libpcap源码进行了分析,并对包过滤机制进行了深入的讨论。 一、Libpcap源码分析 Libpcap是一...

Global site tag (gtag.js) - Google Analytics