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 控制台的消息?