不是一个非常好的问题,对不起。
我有一个程序需要在从资源管理器打开文件时发出警报(即调用 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 中充满了垃圾值,因此(据我所知)无法检索任何导入函数的条目。
看起来代码隧道是挂钩的唯一方法。