c++ - 如何防止特定的 DLL 加载到我的进程中

标签 c++ qt winapi dll loadlibrary

我想我已经对此进行了相当彻底的研究,但我还没有找到可接受的答案。首先是大纲:Windows 8.1、Visual Studio 2013。不过,我认为这些并不重要。

问题如下。我正在编写的应用程序使用了 A.dll。我们使用在 HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers 下安装了上下文菜单处理程序控件的第三方供应商产品(备份程序,但这并不重要)。假设此路径为 c:\Program Files\Vendor\control.dll。

现在,问题是当我的程序打开一个文件选择器对话框时(它是一个使用 QFileDialog 然后使用标准 Windows 的 Qt 程序),加载该控件以提供上下文相关的右键单击功能。此控件依赖于不同版本的“A.dll”,当加载 control.dll 时,我的程序立即崩溃。

我不需要这个额外的功能。我想做的是阻止这个特定的 dll (control.dll) 在我的进程中加载​​。在面向对象的世界中,我会简单地重载 LoadLibrary(),检查这个特定的 DLL,然后调用标准的 DLL。然而这似乎并不可行。

有没有简单的方法来做到这一点?

谢谢! 丹

最佳答案

要防止加载 vendor.dll,您可以在以下 Win32API 函数 LoadLibraryLoadLibraryEx 上使用 Hook ,它们负责动态加载加载 DLL,也用于加载 shell 扩展。该钩子(Hook)实际上是 LoadLibrary 函数代码处的汇编代码,它重定向(跳转)到您自己定义的函数。在此函数中,您可以拦截对正在加载的 vendor.dll 的任何调用,并只返回 0,这表示无法加载该库。

一些示例代码如何使用 MinHook library 来处理它:

HMODULE WINAPI LoadLibraryA_check(_In_ LPCTSTR lpFileName)
{
  if (isInWhiteList(lpFileName))
    return loadLibraryA_Original(lpFileName);
  else 
  {
    // Pretend that the module was not found by returning
    // 126 (0x7E): "The specified module could not be found."
    SetLastError(ERROR_MOD_NOT_FOUND);         
    return NULL;
  }
}

bool installWhitelistFilter()
{
  // Initialize MinHook.
  if (MH_Initialize() != MH_OK)
    return false;

  if (MH_CreateHook(&LoadLibraryA, &LoadLibraryA_check, 
      reinterpret_cast<LPVOID*>(&loadLibraryA_Original)) != MH_OK)
    return false;

  if (MH_EnableHook(&LoadLibraryA) != MH_OK)
    return false;

  // same for LoadLibraryW, LoadLibraryExW, LoadLibraryExA

  return true;
}

关于c++ - 如何防止特定的 DLL 加载到我的进程中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32770778/

相关文章:

c++ - 链接类构造函数时的范围问题

c++ - 维数组 [Matrix] 练习的问题

c++ - 如何根据 Qt 中的图形形状仅使按钮的一部分对用户操作(单击/如何/等)使用react?

c++ - 如何从 QTreeView 中的项目获取索引

c - 无法使用 GCC/Mingw32 编译器在 C 中使用 "Alt+Space"发送虚拟 key "SendInput()"?

C++ Mingw32 CreateProcess() 失败,错误代码 2 : The system cannot find the file specified

c++ - C 结构大小不一致

c++ - QT中如何将文本转换为像素数组

c - 如何兼顾 FILE_SKIP_COMPLETION_PORT_ON_SUCCESS、IOCP 和清理

c# - 作为非托管应用程序的子窗口的 Windows 窗体