当前位置: 首页 > news >正文

应用层读取wfp防火墙阻断记录

前言

之前的文档中,描写了如何对WFP防火墙进行操作[链接在此],这篇文档中,描述如何获取WFP防火墙进行阻断的操作记录。

需要注意的坑点

  • 使用FWPM_NET_EVENT_TYPE获取防火墙日志时,需要注意,只有丢弃和内核丢弃,以及几个错误信息是所有操作系统都可用,其它类型无法应用到所有操作系统。所以我们一般不会使用FWPM_NET_EVENT_TYPE来获取防火墙的放行日志。如果有需要读取放行日志的话,可以查询安全日志5156的方式进行(下次专门写文档来描述常用的三种读取方式)。
  • 使用主动读取的方式,在极个别系统上可能存在少量内存泄露(在保障所有内存都按照MSDN的要求释放的基础上,24小时有几十K的级别,没有仔细进行过日志条数的量化。有明白的也请指教)
  • 订阅的方式仅支持win7/2008 R2以上操作系统,建议使用loadlibrary动态加载,避免模块在vista或2008(SP2)操作系统上整体运行失败。

读取阻断日志(方案一:主动读取)

阻断日志即防火墙返回FWP_ACTION_BLOCK动作的记录信息,读取流程大体上分为:创建枚举句柄、执行枚举、释放枚举句柄简单的三步。

创建枚举句柄

DWORD FwpmNetEventCreateEnumHandle0( HANDLE engineHandle, const FWPM_NET_EVENT_ENUM_TEMPLATE0 *enumTemplate, HANDLE *enumHandle );
  • 输入参数:
    • engineHandle:防火墙句柄,前一章提到过,使用FwpmEngineOpen0打开
    • enumTemplate:枚举的限制条件,常用的是枚举起止时间,也可以设置网络条件以供筛选。
    • enumHandle:输出函数,用于输出枚举句柄
  • 输出参数:
    • 成功返回0,错误时返回WFP Error Codes

执行枚举操作

DWORD FwpmNetEventEnum0( HANDLE engineHandle, HANDLE enumHandle, UINT32 numEntriesRequested, FWPM_NET_EVENT0 ***entries, UINT32 *numEntriesReturned );
  • 输入参数:
    • engineHandle:防火墙句柄,FwpmEngineOpen0打开
    • enumHandle:枚举句柄,由上一步创建
    • numEnteiesRequested:本次想要枚举的最大数量,如果想要一次性返回所有,可以传-1(0xffffffff)
    • entries:用于输出事件数组,需要使用FwpmFreeMemory0释放
    • numEntriesReturned:用于输出事件数目,用于枚举entries
  • 输出参数:
    • 成功返回0,错误时返回WFP Error Codes

释放枚举句柄

DWORD FwpmNetEventDestroyEnumHandle0( HANDLE engineHandle, HANDLE enumHandle );
  • 输入参数:
    • 没啥好说的,两个句柄,参照上面
  • 输出参数:
    • 同上

相关函数1:启用防火墙事件采集

默认防火墙事件采集就是处于开启状态,因此不调用这个函数在大多数系统上可以正常进行事件读取。但是也发现过某些系统需要调用后才可以进行事件读取,建议还是增加此函数的调用

DWORD FwpmEngineSetOption0( HANDLE engineHandle, FWPM_ENGINE_OPTION option, const FWP_VALUE0 *newValue );
  • 输入参数
    • engineHandle:防火墙句柄,由FwpmEngineOpen0打开
    • 需要设置的参数,这个地方可以设置的类型还是蛮多的,可以参考
    • 设置参数对应的值,当option为FWPM_ENGINE_COLLECT_NET_EVENTS时,newValue为1则代表启用。
  • 输出参数
    • 成功返回ERROR_SUCCESS, 失败返回 WFP Error Codes

参考代码

void enumDemoCode()
{FWPM_SESSION0 session = { 0 };ZeroMemory(&session, sizeof(session));session.displayData.name = demoSession;session.txnWaitTimeoutInMSec = INFINITE;session.flags = FWPM_SESSION_FLAG_DYNAMIC;HANDLE hEngine = NULL;DWORD dwResult = FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, &session, &hEngine);if (dwResult != ERROR_SUCCESS || hEngine == NULL){std::cout << "FwpmEngineOpen0 Failed. ec:" << GetLastError() << std::endl;return;}FWP_VALUE0 inValue = {FWP_EMPTY};inValue.type = FWP_UINT32;inValue.uint32 = 1;FwpmEngineSetOption0(hEngine, FWPM_ENGINE_COLLECT_NET_EVENTS, &inValue);FWPM_NET_EVENT_ENUM_TEMPLATE0 enumTemplate = {0};SYSTEMTIME nowSystemTime;ZeroMemory(&nowSystemTime, sizeof(nowSystemTime));GetLocalTime(&nowSystemTime);FILETIME nowFileTime;ZeroMemory(&nowFileTime, sizeof(nowFileTime));if (SystemTimeToFileTime(&nowSystemTime, &nowFileTime)){enumTemplate.endTime.dwLowDateTime = nowFileTime.dwLowDateTime;enumTemplate.endTime.dwHighDateTime = nowFileTime.dwHighDateTime;}enumTemplate.startTime.dwHighDateTime = 0;enumTemplate.startTime.dwLowDateTime = 0;enumTemplate.numFilterConditions = 0;HANDLE hEnumHandle = NULL;dwResult = FwpmNetEventCreateEnumHandle0(hEngine, &enumTemplate, &hEnumHandle);if (dwResult != ERROR_SUCCESS || hEnumHandle == NULL){std::cout << "Create Enum Handle Failed, ec:" << GetLastError() << std::endl;FwpmEngineClose0(hEngine);hEngine = NULL;return;}FWPM_NET_EVENT0** netEvents = NULL;UINT32 uEventNumber = 0;dwResult = FwpmNetEventEnum0(hEngine, hEnumHandle, INFINITE, &netEvents, &uEventNumber);if (uEventNumber > 0){for (int eventPos = 0; eventPos < uEventNumber; eventPos++){FWPM_NET_EVENT0* sigEvent = netEvents[eventPos];if (sigEvent->type != FWPM_NET_EVENT_TYPE_CLASSIFY_DROP){continue;}if (sigEvent->header.ipVersion == FWP_IP_VERSION_V4){std::wstring wstrLocalIp = ip2str(sigEvent->header.localAddrV4);std::wstring wstrRemoteIp = ip2str(sigEvent->header.remoteAddrV4);std::wstring wstrProtocol;switch (sigEvent->header.ipProtocol){case 1:wstrProtocol = L"ICMP";break;case 6:wstrProtocol = L"TCP";break;case 17:wstrProtocol = L"UDP";break;default:wstrProtocol = L"Other:";wstrProtocol.append(std::to_wstring(sigEvent->header.ipProtocol));break;}std::wcout << wstrLocalIp << "[" << sigEvent->header.localPort << "] ==> " << wstrRemoteIp << "[" << sigEvent->header.remotePort << "] protocol:" << wstrProtocol << std::endl;}}}if (netEvents){FwpmFreeMemory0((void**)&netEvents);netEvents = NULL;}if (hEnumHandle){FwpmNetEventDestroyEnumHandle0(hEngine, hEnumHandle);hEnumHandle = NULL;}if (hEngine){FwpmEngineClose0(hEngine);hEngine = NULL;}return;
}

执行结果
在这里插入图片描述

读取阻断日志(方案二:事件订阅)

使用事件订阅的方式在防火墙中读取日志,只需要开启和取消事件订阅即可

启动事件订阅

DWORD FwpmNetEventSubscribe0( HANDLE engineHandle, const FWPM_NET_EVENT_SUBSCRIPTION0 *subscription,FWPM_NET_EVENT_CALLBACK0 callback, void *context, HANDLE *eventsHandle );
  • 输入参数
    • engineHandle:防火墙句柄,由FwpmEngineOpen0打开
    • subscription:需要订阅的通知类型
    • callback:订阅的回调
    • context:自定义指针,原封不动传递导callback函数
    • eventsHandle:订阅句柄,在FwpmNetEventUnsubscribe0中取消订阅
  • 输出参数
    • 成功返回ERROR_SUCCESS, 失败返回 WFP Error Codes

取消事件订阅

DWORD FwpmNetEventUnsubscribe0( HANDLE engineHandle, HANDLE eventsHandle );
  • 输入参数
    • engineHandle:防火墙句柄,由FwpmEngineOpen0打开
    • eventsHandle:订阅句柄,由FwpmNetEventSubscribe0返回
  • 输出参数
    • 成功返回ERROR_SUCCESS, 失败返回 WFP Error Codes

回调函数定义

void CALLBACK FuncFwpmNetEventCallback0(PVOID FwContext, FWPM_NET_EVENT1* FwEvent)
  • 输入参数
    • FwContext:自定义指针,FwpmNetEventSubscribe0函数的context指针
    • FwEvent:订阅的事件
  • 输出参数

参考代码

void CALLBACK FuncFwpmNetEventCallback0(_Inout_ PVOID FwContext, _In_ const FWPM_NET_EVENT1* FwEvent)
{if (FwEvent == NULL){return;}if (FwEvent->header.ipVersion == FWP_IP_VERSION_V4){std::wstring wstrLocalIp = ip2str(FwEvent->header.localAddrV4);std::wstring wstrRemoteIp = ip2str(FwEvent->header.remoteAddrV4);std::wstring wstrProtocol;switch (FwEvent->header.ipProtocol){case 1:wstrProtocol = L"ICMP";break;case 6:wstrProtocol = L"TCP";break;case 17:wstrProtocol = L"UDP";break;default:wstrProtocol = L"Other:";wstrProtocol.append(std::to_wstring(FwEvent->header.ipProtocol));break;}std::wcout << wstrLocalIp << "[" << FwEvent->header.localPort << "] ==> " << wstrRemoteIp << "[" << FwEvent->header.remotePort << "] protocol:" << wstrProtocol << std::endl;}return;
}void subscribeEvents()
{FWPM_SESSION0 session = { 0 };ZeroMemory(&session, sizeof(session));session.displayData.name = demoSession;session.txnWaitTimeoutInMSec = INFINITE;session.flags = FWPM_SESSION_FLAG_DYNAMIC;HANDLE hEngine = NULL;DWORD dwResult = FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, &session, &hEngine);if (dwResult != ERROR_SUCCESS || hEngine == NULL){std::cout << "FwpmEngineOpen0 Failed. ec:" << GetLastError() << std::endl;return;}FWP_VALUE0 inValue = { FWP_EMPTY };inValue.type = FWP_UINT32;inValue.uint32 = 1;FwpmEngineSetOption0(hEngine, FWPM_ENGINE_COLLECT_NET_EVENTS, &inValue);HANDLE hSubScribeHandle = NULL;FWPM_NET_EVENT_ENUM_TEMPLATE0 eventTemplate = { 0 };eventTemplate.numFilterConditions = 0;FWPM_NET_EVENT_SUBSCRIPTION0 subscription = { 0 };subscription.enumTemplate = &eventTemplate;subscription.sessionKey = session.sessionKey;FwpmNetEventSubscribe0(hEngine, &subscription, FuncFwpmNetEventCallback0, NULL, &hSubScribeHandle);std::cout << "Event Subscribe Started....." << std::endl;getchar();FwpmNetEventUnsubscribe0(hEngine, hSubScribeHandle);if (hEngine){FwpmEngineClose0(hEngine);hEngine = NULL;}
}

运行效果
在这里插入图片描述

相关文章:

应用层读取wfp防火墙阻断记录

前言 之前的文档中&#xff0c;描写了如何对WFP防火墙进行操作[链接在此]&#xff0c;这篇文档中&#xff0c;描述如何获取WFP防火墙进行阻断的操作记录。 需要注意的坑点 使用FWPM_NET_EVENT_TYPE获取防火墙日志时&#xff0c;需要注意&#xff0c;只有丢弃和内核丢弃&…...

web基础和tomcat的安装,部署jpress应用

目录 1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 【1】定义区别 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览…...

idea git命令使用

这个标签标识单签分支&#xff1a;&#xff08;标签图标&#xff09; 标识关联分支&#xff1a;&#xff08;五角星&#xff09; 本地切换分支&#xff1a;如当前分支是dev ,git branch 显示的是dev ,然后通过 git checkout -b release 切换到release分支 git checkout re…...

软件测试技术之单元测试—工程师 Style 的测试方法

什么是单元测试&#xff1f; Wikipedia 对单元测试的定义&#xff1a; 在计算机编程中&#xff0c;单元测试&#xff08;Unit Testing&#xff09;又称为模块测试&#xff0c;是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。 在实际…...

C#学习....

1.基础 //引用命名空间using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;//项目名或者命名空间 namespace _01_MY_First_Demo {//Program类class Program{//程序的主入口或者Main函数static void Main(S…...

C语言暑假刷题冲刺篇——day2

目录 一、选择题 二、编程题 &#x1f388;个人主页&#xff1a;库库的里昂 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏✨收录专栏&#xff1a;C语言每日一练 ✨其他专栏&#xff1a;代码小游戏C语言初阶&#x1f91d;希望作者的文章能对你…...

springcloud3 hystrix实现服务降级的案例配置2

一 服务降级的说明 1.1 服务降级说明 "服务器忙&#xff0c;请稍后在试"不让客户达等待&#xff0c;立即返回一个友好的提示。 1.2 服务降级的触发情况 1.程序运行异常&#xff1b; 2.超时&#xff1b; 3.服务熔断触发服务降级&#xff1b;4 .线程池/信号量打…...

第 3 章 稀疏数组和队列(1)

3.1 稀疏 sparsearray 数组 3.1.1先看一个实际的需求 编写的五子棋程序中&#xff0c;有存盘退出和续上盘的功能。 分析问题: 因为该二维数组的很多值是默认值 0.因此记录了很多没有意义的数据.->稀疏数组 3.1.2基本介绍 当一个数组中大部分元素为 0&#xff0c;或者为同…...

7-10 奇偶分家

分数 10 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 给定N个正整数&#xff0c;请统计奇数和偶数各有多少个&#xff1f; 输入格式&#xff1a; 输入第一行给出一个正整N&#xff08;≤1000&#xff09;&#xff1b;第2行给出N个非负整数&#xff0c;以空格分隔。 输…...

使用词向量以数学方式查找具有相似含义的单词

摄影&#xff1a;Nika Charakova 一、说明 简而言之&#xff0c;词向量只不过是表示自然语言词含义的一系列实数。这项技术是有用的NLP功能的重要推动力&#xff0c;使机器能够“理解”人类语言。本文讨论如何使用词向量以编程方式计算文本的语义相似性&#xff0c;例如&#x…...

opencv实现以图搜图

这里写目录标题 1. 步骤1.1 导入OpenCV库&#xff1a;1.2 加载图像1.3 提取特征1.4 匹配特征1.5 显示结果 2. 完整代码3. 测试图片及效果 1. 步骤 1.1 导入OpenCV库&#xff1a; 在您的C代码中&#xff0c;首先需要导入OpenCV库。您可以使用以下语句导入核心模块&#xff1a;…...

爬虫工作中代理失效了怎么处理?

Hey&#xff01;亲爱的爬虫小伙伴们&#xff0c;是不是经常在爬虫的工作中遇到代理IP失效的问题&#xff1f;别着急&#xff0c;今天我来分享一些应对代理失效的妙招&#xff01;这些方法简单易行&#xff0c;让你爬虫顺利进行. 一、为什么代理会失效&#xff1f; 在爬虫过程…...

使用虚拟环境conda安装不同版本的cuda,cudnn,pytorch

背景&#xff1a;在学习深度学习时&#xff0c;我们不可避免的需要跑多个神经网络&#xff0c;而不同的神经网络环境都不一样&#xff0c;所以必须要使用到虚拟环境(如conda)去做环境隔离&#xff0c;安装属于自己的环境。在这环境中&#xff0c;大多神经网络都必须要用到cuda&…...

【24择校指南】华东师范大学计算机考研考情分析

华东师范大学(B) 考研难度&#xff08;☆☆☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分数人数统计&#xff09;、院校概况、23考试科目、23复试详情、各科目及专业考情分析。 正文2563字&#xff0c;预计阅读&#xff1a;3分钟。 2023考情概况…...

什么是LAXCUS分布式操作系统?

相较Linux、Windows&#xff0c;Laxcus是同时在多台计算机上运行的操作系统&#xff0c;处理大规模、高并发、高性能业务&#xff0c;其特点是资源共享和任务并行&#xff0c;并实现【数存算管】超融合一体化。环境中的资源&#xff1a;CPU、GPU、内存、硬盘、网络&#xff0c;…...

Redis数据结构——链表list

链表是一种常用的数据结构&#xff0c;提供了顺序访问的方式&#xff0c;而且高效地增删操作。 Redis中广泛使用了链表&#xff0c;例如&#xff1a;列表的底层实现之一就是链表。 在Redis中&#xff0c;链表分为两部分&#xff1a;链表信息 链表节点。 链表节点用来表示链表…...

[自学记录06|*百人计划]Gamma矫正与线性工作流

一、前言 Gamma矫正其实也属于我前面落下的一块内容&#xff0c;打算把它补上&#xff0c;其它的没补是因为我之前写的GAMES101笔记里已经涵盖了&#xff0c;而Gamma矫正在101里面确实没提到&#xff0c;于是打算把它补上&#xff0c;这块内容并不难&#xff0c;但是想通透的理…...

【数据结构】二叉树链式结构的实现及其常见操作

目录 1.手搓二叉树 2.二叉树的遍历 2.1前序、中序以及后序遍历 2.2二叉树的层序遍历 3.二叉树的常见操作 3.1求二叉树节点数量 3.2求二叉树叶子节点数量 3.3求二叉树第k层节点个数 3.3求二叉树的深度 3.4二叉树查找值为x的节点 4.二叉树的销毁 1.手搓二叉树 在学习…...

从零实战SLAM-第九课(后端优化)

在七月算法报的班&#xff0c;老师讲的蛮好。好记性不如烂笔头&#xff0c;关键内容还是记录一下吧&#xff0c;课程入口&#xff0c;感兴趣的同学可以学习一下。 --------------------------------------------------------------------------------------------------------…...

Python Opencv实践 - 图像金字塔

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/pomeranian.png", cv.IMREAD_COLOR) print(img.shape)#图像上采样 #cv.pyrUp(src, dstNone, dstsizeNone, borderTypeNone) #参考资料&#xff1a;https://blo…...

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过BGAPI SDK设置相机的固定帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在BGAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过BGAPI SDK设置相机固定帧…...

计算机竞赛 python+大数据校园卡数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于yolov5的深度学习车牌识别系统实现 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&am…...

DNNGP模型解读-early stopping 和 batch normalization的使用

一、考虑的因素&#xff08;仅代表个人观点&#xff09; 1.首先我们看到他的这篇文章所考虑的不同方面从而做出的不同改进&#xff0c;首先考虑到了对于基因组预测的深度学习方法的设计 &#xff0c;我们设计出来这个方法就是为了基因组预测而使用&#xff0c;这也是主要目的&…...

【目标检测】目标检测 相关学习笔记

目标检测算法 PASCALVOC2012数据集 挑战赛主要分为 图像分类 目标检测 目标分割 动作识别 数据集分为四个大类 交通&#xff08;飞机 船 公交车 摩托车&#xff09; 住房&#xff08;杯子 椅子 餐桌 沙发&#xff09; 动物&#xff08;鸟 猫 奶牛 狗 马 羊&#xff09; 其他&a…...

面试攻略,Java 基础面试 100 问(十六)

反射使用步骤(获取Class对象、调用对象方法) 获取想要操作的类的Class对象&#xff0c;他是反射的核心&#xff0c;通过Class对象我们可以任意调用类的方法。 调用 Class 类中的方法&#xff0c;既就是反射的使用阶段。 使用反射 API 来操作这些信息。 什么是 java 序列化&…...

章节5:脚本注入网页-XSS

章节5&#xff1a;脚本注入网页-XSS XSS &#xff1a;Cross Site Script 恶意攻击者利用web页面的漏洞&#xff0c;插入一些恶意代码&#xff0c;当用户访问页面的时候&#xff0c;代码就会执行&#xff0c;这个时候就达到了攻击的目的。 JavaScript、Java、VBScript、Activ…...

ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031)

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) 二、CVE-2017-15031 一、ATF(TF-A)安全通告 TFV-5 (CVE-2017-15031) Title 未初始化或保存/恢复PMCR_EL0可能会泄露安全世界的时间信息 CVE ID CVE-2017-1503…...

迅捷视频工具箱:多功能音视频处理软件

这是一款以视频剪辑、视频转换、屏幕录像等特色功能为主&#xff0c;同时附带有视频压缩、视频分割、视频合并等常用视频处理功能为主的视频编辑软件。该软件操作简单易用&#xff0c;即使没有视频处理经验的用户也可以轻松上手。将视频添加到工具箱对应功能后&#xff0c;简单…...

linux--fork()详解

fork() 参考链接&#xff1a;链接 进程控制原语包括&#xff1a;进程的建立、进程的撤销、进程的等待和进程的唤醒。 fork&#xff0c;在英语用译为叉子&#xff0c;形状像Y&#xff0c;反过来就如下图&#xff1a; 就是本来只有一个进行app,然后它调用了fork()函数&#xf…...

go_并发编程(1)

go并发编程 一、 并发介绍1&#xff0c;进程和线程2&#xff0c;并发和并行3&#xff0c;协程和线程4&#xff0c;goroutine 二、 Goroutine1&#xff0c;使用goroutine1&#xff09;启动单个goroutine2&#xff09;启动多个goroutine 2&#xff0c;goroutine与线程3&#xff0…...