Windows API:查找消息发送者的进程 (WM_COPYDATA)

Posted

技术标签:

【中文标题】Windows API:查找消息发送者的进程 (WM_COPYDATA)【英文标题】:Windows API: find process of message sender (WM_COPYDATA) 【发布时间】:2013-11-28 01:34:06 【问题描述】:

我创建了一个具有预定义协议的 SSH 代理(类似于 PuTTY 的 pageant.exe),身份验证请求通过 WM_COPYDATA 发送到代理窗口。

我现在想显示哪个进程请求了身份验证。 为此,我需要知道哪个进程发送了 WM_COPYDATA。

如上所述,我可以更改协议(例如,将进程 ID 与消息本身一起发送),因为它是预定义的。

【问题讨论】:

【参考方案1】:

您收到的wParam旨在发送消息的窗口的窗口句柄。 (不过,请参阅下面的注释。)

由此,您可以使用GetWindowThreadProcessID 获取进程ID,然后您可以将其用作GetProcessImageFileName 的输入来检索进程的名称。

注意:正如@RemyLeBeau 在下面的评论中指出的那样,这当然是基于提供的wParam 实际上是发送WM_COPYDATA 消息的窗口。发送WM_COPYDATA 本身并不强制要求。

如果不是,那你就不走运了;如果不是这样,我就无法回溯到实际发送消息的过程。您最多可以使用IsWindow 确认它是一个实际的窗口句柄,但它并不能确认它确实是发送消息的窗口。

【讨论】:

假设发件人符合在wParam字段中指定自己的HWND的要求。 SendMessage(WM_COPYDATA) 不强制执行此操作。尽管您可以通过使用IsWindow() 来确定@​​987654335@ 是否包含有效的HWND,但没有什么可以阻止恶意发件人指定其他人的HWND @Remy:当然它假设传入的HWND是发送消息的那个,这就是问题所问的。我知道没有其他方法可以在不正确的情况下检索请求的信息。不可能追溯到将欺诈性 HWND 值作为带有 WM_COPYDATA 消息的 wParam 发送的应用程序,是吗?不过,这是一个很好的观点;我已将其添加到我的答案中,并给予您适当的信用。 谢谢。这很可悲。我已经查看了 wParam,它始终为 0。这真的是我第一次听说有些东西不起作用...... 可能有另一个机会找到该进程,因为发件人创建了文件映射。我为此创建了一个新问题:***.com/questions/20296441/… @AbdulrahmanAljehani:它适用于任何带有HWND 作为数据的消息。没有多少消息,但WM_COPYDATA 不是唯一一个。如果您真的想检测恶意发件人,您可能必须将代码注入每个正在运行的进程以绕过SendMessage...() 系列函数,这样您就可以知道哪个进程将哪个消息发送到哪个HWND,在这种情况下WM_COPYDATA 中的 WM_COPYDATA 然后您将能够使用 GetCurrentProcessId()GetWindowThreadProcessId() 检查 wParam 参数中的 HWND 是否属于发送消息的进程。

以上是关于Windows API:查找消息发送者的进程 (WM_COPYDATA)的主要内容,如果未能解决你的问题,请参考以下文章

这是不是可以挂钩子进程发送到 Windows 控制台的消息?

win32api win32gui win32con 窗口句柄 发送消息 常用方法

C#进程间通信--API传递参数(SendMessage)

用C#调用Windows API向指定窗口发送按键消息

JACK XMPP 守护进程发送和接收消息

在电子中从 ipcMain 广播消息