gpt4 book ai didi

c++ - 将 PID 缓存到端口映射 Windows 的安全方法

转载 作者:可可西里 更新时间:2023-11-01 10:21:30 31 4
gpt4 key购买 nike

我正在使用 WinDivert通过 Windows 上的透明代理管道连接(TCP 和 UDP)。它的工作原理是使用 GETTcpTable2 等函数进行端口到 pid 查找,然后检查 PID 是否匹配或不匹配代理或其任何子进程的 PID。如果它们不匹配,它们将通过代理转发,如果它们匹配,数据包将保持不变。

我的问题是,是否有一种安全的方法或安全的持续时间可以让我“缓存”该端口到 pid 查找的结果?每当我有大量数据包流过时,比如说在 youtube 上观看视频,使用 WinDivert 的代码突然占用了我所有的 CPU,我假设这是因为对收到的每个数据包进行 TcpTable2 查找。我可以看到 UDP 并没有真正安全的持续时间,我可以假设它是绑定(bind)到端口的同一个进程,但这对 TCP 来说可能吗?

最佳答案

作为对 Luis 评论的补充,我认为缓存端口到 pid 查找的应用程序也可以保留进程的句柄(只需通过 OpenProcess 获取它) ).问题是,如果与进程关联的资源在关闭所有句柄之前没有被释放。这是正常的,因为在您拥有进程的有效句柄之前,您可以查询系统以获取各种信息,例如已用内存或时间。因此,您应该定期查看缓存进程是否已终止,以从缓存中清除条目并关闭句柄。

作为替代方案,您可以只保留其他信息,例如进程的开始时间,可通过 GetProcessTimes 访问。在缓存中查找进程 ID 时,您打开进程并控制其启动时间。如果没问题,就是正确的进程,如果没有,进程 ID 已被重用,您应该从缓存中清除该条目。

第一种方法应该更有效,因为你不必为每个数据包重新打开进程,但你必须更严格地识别终止进程以释放资源,也许使用一个线程会使用 所有进程句柄上的 WaitForMultipleObjectsEx 将在进程终止时立即发出警报。

第二种方式应该更容易实现。

关于c++ - 将 PID 缓存到端口映射 Windows 的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27842328/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com