记一次 .NET 某智能视觉软件 句柄爆高分析

一:背景

1. 讲故事

前几天高级调试训练营里的一位学员找到我,说他们的程序句柄爆高,经过自己分析之后发现是几百万的 process 句柄,截图如下:

说实话,第一眼看到有这么多的 process 句柄还是挺震惊的,在我的400+dump分析之旅中还是从未见过,这也给了我很大的好奇心,接下来我们就来分析下到底是何方神圣导致的问题。

二:WinDbg 分析

1. process 句柄真的爆高吗

dump分析的一个重要原则就是相信数据而不是人言,即使是我的学员。。。所以我让学员用 procdump 给我抓一个 minidump,我要亲自用 !handle 洞察 process 句柄个数,参考命令如下:

0:000> !handle 
...
Handle 000000000000c398
  Type          Process
Handle 000000000000c39c
  Type          Process
Handle 000000000000c3a0
  Type          Process
Handle 000000000000c3a4
  Type          Process
Handle 000000000000c3a8
  Type          Process
Handle 000000000000c3ac
  Type          Process
Handle 000000000000c3b0
  Type          Process
Handle 000000000000c3b4
  Type          Process
Handle 000000000000c3b8
  Type          Process
Handle 000000000000c3bc
...

由于process句柄太多,没法全部刷出来,不过从满篇的Process来看,确实是这样,接下来的问题是如何知道 process 句柄是谁创建的?

2. Process 句柄是谁创建的

哈哈,学员就是学员,精髓都学到了,知道这种问题应该用什么工具,对,就是 perfview,学员用 perfview 追踪了 3分钟多,有些人可能要问,这个时间是怎么看出来的,可以打开 TraceInfo 选项就知道了,截图如下:

有了 etl 文件之后,打开 Windows Handle Ref Count Stacks 选项卡,可以看到 3分多时间内 追踪到了 5756 个句柄,截图如下:

接下来就是双击 Handle Type Process 行,展开这 5756 个句柄详情,然后多次点击具体的句柄观察特征,结果发现大量的 process 的上游都挂了 halcon 的 ReadImage() 方法,截图如下:

从调用栈来看,ReadImage() 会涉及到文件IO,所以在内核层自然会和文件系统驱动 fltmgr.sys 打交道,但在调用栈的末端被一个 dcfafilter.sys 驱动给拦截了,从名字上来看不像是windows自带的,而且也正是它创建的 process 句柄,类似 OpenProcess 操作。

到这里我的疑心越来越重,让朋友到 C:\Windows\System32\drivers 目录中看下这个驱动是干什么的?是哪个程序引用着这个驱动。可以用类似的命令查看。

sc queryex type= driver
sc qc DCFAFilter

经过朋友的一顿猛如虎的操作,终于给找到了,原来是 ManageEngine Unified Endpoint Security - Agent 服务,截图如下;

拿着这个信息到网上一搜,我去,还真是第三方的运维监控软件,截图如下:

到这里就真相大白了,然来是 ManageEngine 捣的鬼。。。无语了。。。朋友关闭了这个服务之后,句柄恢复了正常,截图如下;

三:总结

我见过太多的安全软件导致程序出现各种故障,但那些都是在用户态层面进行的干扰,而这次生产故障是我第一次见到有安全软件在内核态干扰应用程序,长见识啦!

资源下载链接为: https://pan.quark.cn/s/9e7ef05254f8 在网页设计中,为图片添加文字是一种常见的需求,用于增强视觉效果或传达更多信息。本文将介绍两种常用的方法:一种是将图片设置为背景并添加文字;另一种是利用<span>标签结合CSS定位来实现。 这种方法通过CSS实现,将图片设置为一个容器(通常是<div>)的背景,然后在容器中添加文字。具体步骤如下: 创建一个包含文字的<div>元素: 使用CSS设置<div>的背景图片,并调整其尺寸以匹配图片大小: 如有需要,可使用background-position属性调整图片位置,确保文字显示在合适位置。这样,文字就会显示在图片之上。 另一种方法是将文字放在<span>标签内,并通过CSS绝对定位将其放置在图片上。步骤如下: 创建一个包含图片和<span>标签的<div>: 设置<div>为相对定位,以便内部元素可以相对于它进行绝对定位: 设置<span>为绝对定位,并通过调整top和left属性来确定文字在图片上的位置: 这种方法的优点是可以精确控制文字的位置,并且可以灵活调整文字的样式,如颜色和字体大小。 两种方法各有优势,可根据实际需求选择。在实际开发中,还可以结合JavaScript或jQuery动态添加文字,实现更复杂的交互效果。通过合理运用HTML和CSS,我们可以在图片上添加文字,创造出更具吸引力的视觉效果。
在四旋翼无人机的控制系统中,准确估计飞行姿态是非常关键的一环,它直接关系到飞行的稳定性和安全性。扩展卡尔曼滤波(EKF)算法因其在非线性系统估计中的优势,被广泛应用于无人机的姿态估计中。为了帮助你理解和实现这一过程,以下内容将结合《EKF在四旋翼无人机姿态估计中的应用与Matlab实现》这本资源来进行详细说明。 参考资源链接:[EKF在四旋翼无人机姿态估计中的应用与Matlab实现](https://wenku.csdn.net/doc/23xxnqxuw9?spm=1055.2569.3001.10343) 首先,EKF算法是卡尔曼滤波的一个变种,它通过引入雅可比矩阵对非线性函数进行线性化,以适应非线性系统模型。在无人机姿态估计中,EKF可以用来融合来自不同传感器(如加速度计、陀螺仪、磁力计等)的数据,以估计无人机的当前姿态。 Matlab作为科学计算和工程领域的常用工具,提供了一系列内置函数来支持EKF的实现。在实际编程中,你需要遵循以下步骤: 1. 定义状态模型:这包括无人机的动力学模型以及传感器的测量模型。在Matlab中,你可以使用函数句柄来表示这些模型。 2. 初始化状态估计和误差协方差矩阵:根据先验知识设定初始状态估计值和误差协方差矩阵的初值。 3. 进行预测和更新循环:在每个时间步,首先根据状态模型进行状态预测和误差协方差的预测;然后根据新的传感器测量数据,使用EKF的更新步骤来校正状态估计。 4. 参数化编程:为了提代码的灵活性和可重用性,可以采用Matlab的结构体和函数句柄来存储模型参数和状态估计,使得算法更加模块化。 在《EKF在四旋翼无人机姿态估计中的应用与Matlab实现》中,你将会找到上述步骤的具体实现示例,包括详细的代码和注释,以及如何进行参数化编程的指导。这将帮助你更好地理解EKF算法在姿态估计中的应用,并掌握如何使用Matlab实现这一过程。 完成这一过程后,你将能够根据四旋翼无人机的特定需要调整EKF算法,进行更为精确的姿态估计。为了进一步扩展你的知识和技能,建议你继续研究计算机视觉、目标检测模型、智能优化算法、神经网络预测等先进技术在无人机系统中的应用。 参考资源链接:[EKF在四旋翼无人机姿态估计中的应用与Matlab实现](https://wenku.csdn.net/doc/23xxnqxuw9?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值