#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进行网络抓包与特定包过滤》 在网络监控、数据分析和故障排查等领域,网络抓包工具起着至关重要的作用。本文将详细探讨如何利用C#库SharpPcap来实现网络数据包的捕获,并针对特定IP地址的UDP包进行...
经过对现有网络安全技术...存在很多类似的地方,如包过滤防火墙系统、基于规则匹配的IDS系统及流量分 析系统等等,都是基于规则进行检测的系统;而且,这些不同的应用系统匹配的 对象都是一致的,匹配对象为IP数据包。
总结,"yuandaima.rar"中的源代码很可能是实现包过滤功能的程序,它能够捕获并分析网络数据包,帮助用户监控和控制网络流量,提高网络安全性,同时提供故障排查的手段。理解包过滤和网络数据包的工作原理对于任何IT...
基于中间层驱动的个人防火墙实现,包括ndis实现的框架,对网络包过滤的实现。
**H3C ACL包过滤基础配置案例详解** 在H3C网络设备中,访问控制列表(ACL)是一种重要的网络安全和流量管理工具,用于定义网络流量的过滤规则。本文档将详细讲解一个基于H3C设备的ACL包过滤基础配置案例,适用于H3...
包过滤技术是防火墙技术的技术核心,本文主要介绍在Linux内核中实现IP包过滤的基本流程,同时对IP伪装和网络地址转换(NAT)的实现作简要的介绍。
Cisco路由器包过滤的配置是指通过 Access Control List(访问控制列表)来控制和过滤网络流量的方法。该配置可以实现路由器和网络的安全控制,保护网络免受恶意攻击和非法访问。 访问控制列表(Access Control List...
移动网络安全final project,基于包过滤防火墙的实现。MFC界面,VC6.0开发环境。
本文将详细讲解如何使用Python调用tcpdump进行抓包过滤,并提供了一个简单的示例代码。 tcpdump是一个强大的网络封包分析软件,它可以实时捕获网络中的数据包并进行分析。在Python中调用tcpdump,主要是通过`...
基于应用层包过滤的个人防火墙研究与实现,李峰,,本文通过介绍如何运用应用层包过滤技术实现个人防火墙,深入地剖析了网络封包截获的几种方式,并重点介绍了通过NDIS Hook Driver实现��
防火墙是一种保护网络的行之有效的安全机制 是保护区的一道安全防线它能够将保护区以外的非法入侵及访问拒之门外对于资金少又有科研人员的单位可采用源代码开放的免费的Linux netfilter/iptables 构建防火墙.
X00060100 第27章 用访问控制列表实现包过滤 本章节主要介绍了使用访问控制列表(ACL)实现包过滤的技术。ACL 是一种网络安全技术,用于控制网络设备对某些访问或某些数据的能力。通过 ACL,可以对数据包进行识别,...
本人对网络栈的分析是基于早期版本(Linux 1.2.13),在明确了网络栈架构的前提下,上升一步分析高级版本内核中的Netfilter防火墙实现原理,然后进行模块或内核编程,开发一款基于包过滤的个人防火墙。 包过滤防火墙...
主要研究如何通过基于Windows操作系统内核的包过滤防火墙系统来实现网络安全 防护。基于操作系统内核的包过滤防火墙系统是基于网络层实现的包过滤防火墙系统.该系统要求 能够对所有进出计算机的IP数据包进行灵活...
### 高级网络人才培训专家-X00060100 第27章 用访问控制列表实现包过滤 #### 知识点概览 - **访问控制列表(ACL)概念** - **ACL包过滤原理** - **ACL分类及其应用** - **配置ACL包过滤** - **ACL包过滤配置应用...
防火墙是一种保护网络的行之有效的安全机制 是保护区的一道安全防线它能够将保护区以外的非法入侵及访问拒之门外对于资金少又有科研人员的单位可采用源代码开放的免费的Linux netfilter/iptables 构建防火墙.
基于内容的IP 包过滤技术涉及到操作系统的内核。文章分析了W indow s 内核态的网络编程接口, 讨论了W indow s 系统中包过滤的编程实现技术。
Linux下的Libpcap源码分析及包过滤机制是一个重要的网络编程技术领域,涉及到网络数据包的捕获、过滤和处理。本文档对Libpcap源码进行了分析,并对包过滤机制进行了深入的讨论。 一、Libpcap源码分析 Libpcap是一...