关于利用windows提供的filtler接口来实现包过滤编程中的问题(30分)

winnuke 2006-05-26 12:11:23
在msdn中搜到一个关于在用户层下就能实现对网络数据包进行拦截的一系列函数,他们分别如下:
HRESULT CreateInterface(
LPGUID pguidInterface,
BSTR bstrName,
LONG* pUserData,
LPUNKNOWN* ppInterface
);

DWORD PfBindInterfaceToIPAddress(
INTERFACE_HANDLE pInterface,
PFADDRESSTYPE pfatType,
PBYTE IPAddress
);

DWORD PfAddFiltersToInterface(
INTERFACE_HANDLE ih,
DWORD cInFilters,
PPF_FILTER_DESCRIPTOR pfiltIn,
DWORD cOutFilters,
PPF_FILTER_DESCRIPTOR pfiltOut,
PFILTER_HANDLE pfHandle
);

还有一个重要的结构体用来填充访问规则的,类似于ip安全策略中的设置源ip源端口掩码以及各种要拦截的协议等.其具体如下:
typedef struct _PF_FILTER_DESCRIPTOR {
DWORD dwFilterFlags;   
DWORD dwRule;
PFADDRESSTYPE pfatType;   
PBYTE SrcAddr;    
PBYTE SrcMask;
PBYTE DstAddr;
PBYTE DstMask;
DWORD dwProtocol;
DWORD fLateBound;
WORD wSrcPort;
WORD wDstPort;
WORD wSrcPortHighRange;
WORD wDstPortHighRange;
} PF_FILTER_DESCRIPTOR, *PPF_FILTER_DESCRIPTOR;


以及对应的资源释放api如下:
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);

思路是这样的:首先安装一个接口;
       然后把该接口绑定到一个ip地址;
       接着定义一个PF_FILTER_DESCRIPTOR结构,并在其中设置访问规则;
       然后把过滤器添加到前面的接口;
       实施拦截  (这里会有严重问题);
       移除过滤器;
       取消绑定接口;
       删除接口;

小弟自己写了段小程序,想拦截http协议(tcp 80),代码如下,但是有一个严重的问题是:无论我怎么设置访问规则,也就是对该结构体PF_FILTER_DESCRIPTOR无论怎么填充,程序都会拦截网络所有包,包括其他的一些icmp,udp包等.小弟百试不得其解,望论坛的高人指教,小弟感激不尽!
代码:
--------------------------------------------

#include <stdio.h>
#include <windows.h>
#include "Fltdefs.h"
#pragma comment(lib,"iphlpapi.lib")


int main(int argc, char* argv[])
{
DWORD dwErrorLook = NO_ERROR;
// 一个创建网络包过滤接口
INTERFACE_HANDLE hInterface;
PfCreateInterface(0,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
FALSE,
TRUE,
&hInterface);

// 绑定需要网络包过滤的IP地址
BYTE LocalIp[] = {10 , 43 , 125, 41 };

 //这里来设置对应的规则:包括起始ip,目标端口,源端口,掩码等等,无论怎么设置都不行
     BYTE ScrIp[] = {202, 181, 29 , 154};
BYTE ScrMask[] = {255, 255, 255, 0 };
WORD ScrPort = 80;
WORD ScrPortHighRange = 0;
BYTE TarIp[] = {10 , 43 , 125, 41 };
BYTE TarMask[] = {255, 0 , 0 , 0 };
WORD TarPort = 1;
WORD TarPortHighRange = 5000;


dwErrorLook = PfBindInterfaceToIPAddress(hInterface, PF_IPV4, LocalIp);
if( dwErrorLook != NO_ERROR)
{
printf("PfBindInterfaceToIPAddress error: %d\n", dwErrorLook);
PfDeleteInterface(hInterface);
return -1;
}

FILTER_HANDLE fHandle;
// 填充过滤包的规则结构
PF_FILTER_DESCRIPTOR inFilter;
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
inFilter.dwRule = 0; //一直添这个值
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
inFilter.SrcAddr = ScrIp; //设置来源IP地址
inFilter.SrcMask = ScrMask; //设置来源子网掩码
inFilter.wSrcPort = ScrPort; //任意来源端口
inFilter.wSrcPortHighRange = ScrPortHighRange;
inFilter.DstAddr = TarIp; //目标ip地址
inFilter.DstMask = TarMask;//目标子网掩码
inFilter.wDstPort = TarPort; //目标端口
inFilter.wDstPortHighRange = TarPortHighRange;
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
// 加入一个过滤接口
dwErrorLook = PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
if( dwErrorLook != NO_ERROR)
{
printf("PfAddFiltersToInterface error: %d\n", dwErrorLook);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
return -1;
}

getchar();

// 移除过滤接口
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
return 0;
}
...全文
257 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
winnuke 2006-05-27
  • 打赏
  • 举报
回复
请高手指教!
既然MS提供了这个编程接口,为什么却不能实现其功能呢....郁闷,我想搞清楚到第是怎么会事
winnuke 2006-05-26
  • 打赏
  • 举报
回复
anybody ????
这个问题捆饶我好久了,代码并不多,但是问题始终是程序运行后会拦截所有的包啊.

mynamelj 2006-05-26
  • 打赏
  • 举报
回复
mark
《概率论与数理统计》是理工科大学的一门重要基础课程,它结合了概率论的基本理论与统计学的方法,用于析和处理随机现象。第二版的完整版多媒体教学系统旨在通过丰富的教学资源和互动体验,帮助学生深入理解和掌握这门学科的核心概念。 一、概率论基础 概率论是研究随机事件及其规律性的数学理论,主要括以下几个关键概念: 1. 随机试验:概率论的研究对象,如掷骰子、抽卡等。 2. 样本空间:所有可能结果的集合。 3. 事件:样本空间的子集,代表某种特定的结果。 4. 概率:事件发生的可能性,通常介于0和1之间,表示为P(A)。 5. 条件概率:在已知某个事件发生的情况下,另一个事件发生的概率。 6. 乘法法则和加法法则:用于计算两个独立或不独立事件的概率。 二、概率布 1. 离散概率布:如二项布、泊松布、几何布、超几何布等,用于描述离散随机变量的布情况。 2. 连续概率布:如均匀布、正态布、指数布等,适用于连续随机变量。 三、统计学基础 1. 参数估计:通过样本数据估计总体参数,如均值、方差等。 2. 抽样布:统计量在多次重复抽样下的布情况。 3. 点估计和区间估计:给出参数的一个估计值或一个估计范围。 4. 假设检验:检验关于总体参数的假设是否成立,如t检验、卡方检验、F检验等。 5. 回归析:研究两个或多个变量间的关系,预测一个变量基于其他变量的值。 四、数理统计方法 1. 最大似然估计:寻找使样本数据出现概率最大的参数估计方法。 2. 矩估计:通过总体矩与样本矩的关系来估计参数。 3. 正态布的心极限定理:大量独立随机变量的和近似服从正态布,即使这些变量本身非正态。 4. 协方差和相关系数:衡量两个随机变量之间线性关系的强度和方向。 5. 方差析(ANOVA):比较多个组别间的均值差异。 五、多元统计析 1. 多元正态布:多维空间的正态布,常用于多元线性回归。 2. 判别析:根据已知类的样本数据,建立判别函数,对新数据进行类。 3. 聚类析:将相似数据组,揭示数据内在结构。 4. 主成析(PCA):降低数据维度,提取主要特征。 六、多媒体教学系统 该教学系统可能含以下组成部: 1. 视频讲座:专家讲解理论和例题,直观展示概念。 2. 动画演示:动态模拟随机过程,帮助理解概率模型。 3. 交互式练习:提供习题和答案,实时反馈学习效果。 4. 实验教程:设计数学实验,让学生亲手操作,加深理解。 5. 电子教材:含文字、图表、案例等丰富内容,便于自主学习。 通过这个多媒体教学系统,学生不仅可以学习到概率论与数理统计的理论知识,还能通过实践应用和互动学习,提升解决实际问题的能力。

18,358

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧