如何保护自己免受加载到进程中的Shell DLL的侵害?

时间:2020-03-06 14:21:40  来源:igfitidea点击:

当我们使用通过GetOpenFileName()使用标准Windows"文件打开"对话框时,外壳程序将加载它显示文件列表所需的各种DLL,包括自定义文件。

在我的应用程序中,我发现TortoiseCVS用于在图标上绘制覆盖的DLL调用了GdiPlusShutdown(),因此在显示"文件打开"对话框后一段时间,TortoiseCVS DLL将被卸载,它将关闭GDI +我的图形功能将全部失败!

基本上我的应用程序可以随时加载任何旧的DLL,并开始对其状态进行随机处理,这似乎很糟糕。在我的情况下,解决方法非常简单,如果我发现GDI +已关闭,则只需重新启动它即可。但是,如果这发生在我无法调试的客户端计算机上,那么要弄清楚发生了什么事情就困难得多。

谁能提供任何见解?我该怎么做才能阻止这种情况的发生?

解决方案

我不得不处理戴尔戴在其机器上的废话,特别是wxVault。我的解决方案是"简单地"修补代码。使用DEP会有些棘手,但仍然可行。我们可以浏览一下Microsoft Detours,这是一种稍微结构化的方法。我们仍然会加载DLL,但至少可以停止它调用它不应该调用的函数。

有关Windows为什么具有如此糟糕的机制的信息,请阅读Raymond Chen的" Old New Thing"博客或者书籍。