关于利用windows提供的filtler接口来实现包过滤编程中的问题(30分)
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写个脚本来实现。
python实现文件批量编码转换及注意事项
本文通过实例代码给大家介绍了python实现文件批量编码转换及注意事项,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
如何利用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(path: str) -> str: for root, dirs, files in os.walk(path): for f in files
Keil乱码解决方案[项目代码]
本文详细介绍了如何解决CubeMX生成的代码在Keil中出现乱码的问题。首先分析了乱码产生的原因,即Keil V6编译器仅支持UTF-8编码,而旧版工程可能使用GB2312编码。接着提供了三种解决方案:1) 在Keil配置中直接修改编码为UTF-8;2) 使用Notepad++手动转换单个文件的编码;3) 使用Python脚本批量转换工程目录下的所有C、H和TXT文件编码。文章还提供了打包好的EXE工具下载链接,方便用户直接使用。最后提醒用户该工具可以递归处理子目录,但不要在根目录运行以避免耗时过长。
MobaXterm批量导入会话[项目代码]
本文详细介绍了如何通过脚本批量导入MobaXterm会话,解决中文乱码问题。首先需要创建Excel表格并写入服务器信息,然后将其复制到list.txt文件中。接着修改脚本中的登录用户和目录名称等变量,执行脚本后会生成MobaXterm_Sessions.mxtsessions文件。最后将该文件下载到本地并导入MobaXterm即可完成批量会话添加。文中还提供了完整的脚本内容,包括格式转换和编码处理步骤,确保中文显示正常。


网络编程
