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

winnuke winnuke 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
在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;
}
...全文

相关推荐

Python批量转换文件编码格式

需要将工作目录下的文件进行转码,开始的编码是GBK的,需要将其转换为utf-8的。文件较多,手动转换肯定不行,用Python写个脚本来实现。

weixin_38626179

python实现文件批量编码转换及注意事项

本文通过实例代码给大家介绍了python实现文件批量编码转换及注意事项,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧

weixin_38663029

如何利用python批量转换文件编码?例如,txt文件由UTF-16LE转为UTF-8……

如何利用python批量转换文件编码?例如,txt文件由UTF-16LE转为UTF-8…… 问题重现:往往利用python处理数据时,都会遇到文件编码格式不对,那么如何批量转换呢,下面直接上代码! 实例:整个文件夹的txt文件由UTF-16LE转为UTF-8 # coding utf-8 import os import chardet # 获得所有txt文件的路径,传入文件所在文件夹路径 def find_all_file&#40;path: str&#41; -> str: for root, dirs, files in os.walk(path): for f in files

weixin_38670391

Keil乱码解决方案[项目代码]

本文详细介绍了如何解决CubeMX生成的代码在Keil中出现乱码的问题。首先分析了乱码产生的原因,即Keil V6编译器仅支持UTF-8编码,而旧版工程可能使用GB2312编码。接着提供了三种解决方案:1) 在Keil配置中直接修改编码为UTF-8;2) 使用Notepad++手动转换单个文件的编码;3) 使用Python脚本批量转换工程目录下的所有C、H和TXT文件编码。文章还提供了打包好的EXE工具下载链接,方便用户直接使用。最后提醒用户该工具可以递归处理子目录,但不要在根目录运行以避免耗时过长。

resnet7explorer

MobaXterm批量导入会话[项目代码]

本文详细介绍了如何通过脚本批量导入MobaXterm会话,解决中文乱码问题。首先需要创建Excel表格并写入服务器信息,然后将其复制到list.txt文件中。接着修改脚本中的登录用户和目录名称等变量,执行脚本后会生成MobaXterm_Sessions.mxtsessions文件。最后将该文件下载到本地并导入MobaXterm即可完成批量会话添加。文中还提供了完整的脚本内容,包括格式转换和编码处理步骤,确保中文显示正常。

jjj34438
评论 3
收藏 已收藏
分享
返回顶部
winnuke
网络编程 18,356 成员 64,161 内容