【发布时间】:2010-12-18 09:50:06
【问题描述】:
这不是一个非常好的问题,抱歉。
我有一个程序需要在从资源管理器打开文件时发出警报(即调用 ShellExecute(A/W))。
不幸的是,微软删除了允许您在 Vista 及更高版本中挂钩这些事件的 COM 接口 (IShellExecuteHook),据说是因为旧代码可能会因更改而导致崩溃。有一种解决方法可以重新启用此功能,但它不再有效。
我进行了一些研究,看起来捕获对 ShellExecute 的调用的唯一方法是将调用重新路由到 shell32.dll。目前,我正在考虑将自己的 DLL 注入资源管理器进程,然后将 ShellExecute 的 IAT 条目复制到我的 DLL 中的某个地址分配中,最后修改 ShellExecute 的 IAT 条目以指向我的函数,这将通知打开文件的程序并跳转到我们之前存储的原始 ShellExecute 函数。
我最关心的是防病毒软件。他们会在乎我注射到 explorer 中吗?他们会关心我正在修改 IAT 吗?
另一个问题是这是否安全;浏览器的安全权限是否有可能(或相当可能)不允许通过 CreateRemoteThread 进行注入?如果是这样,有没有更好的方法来进行这种注入?
一般来说有没有更好的方法来做到这一点?
编辑:对于将来遇到此问题的任何人,explorer.exe 没有 shell32.dll 的 IAT;它有一个标头,但是 thunk 中充满了垃圾值,因此(据我所知)无法检索任何导入函数的条目。
看起来代码隧道是唯一的方法。
【问题讨论】:
-
由于似乎没有简单的解决方法,您可以解释一下您尝试以这种方式实现应用程序的哪些功能:也许有更简单的方法可以做到这一点。
-
我们将新下载的文件标记为未读。当用户打开文件时,我们希望将其标记为已读。没有可能的包罗万象来实现这一点,但我们希望尽可能准确。另一种方法是编写一个驱动程序来获取 CreateProcess 的通知并解析文件名的参数,但它不如钩子那么可取。
-
你没有提到是什么类型的文件,但是应用程序可能会在不涉及资源管理器的情况下打开文件。您能改为监控“查看器”应用吗?