如何在cgo加载库之前调用SetDefaultDllDirectories?

问题描述 投票:0回答:1

我想保护我的 go 应用程序免受 dll 劫持。我加载的一些 DLL 很容易受到攻击,因此首先在本地路径 (./) 中查找系统 DLL(例如 winmm.dll)。为了防止这种情况,我首先在我的 main() 函数中调用它:

windows.SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32)

我可以看到这个工作正常,因为后来的一些 DLL 调用受到影响(我需要提供完整的本地路径)。

但是对于CGO加载的另一个库,似乎没有任何效果。因此,我假设 CGO 在执行我的 main() 函数之前导入并加载该库。我可以在 Process Explorer 中看到这一点,其中仍然在本地路径中搜索像 winmm.dll 这样的库。

我像这样在 CGO 中加载库:

#cgo LDFLAGS: -L . -lmylib
#include <string.h>
#include <stdlib.h>
#include <mylib.h>

有没有办法让我的 SetDefaultDllDirectories() 调用 main() 也影响这个库?

go dll cgo
1个回答
0
投票

这是不可能的。以下行使 cgo 进行编译时编译:

#cgo LDFLAGS: -L . -lmylib

这样,内核就会在运行时加载 mylib,甚至在执行 func main() 中的任何代码之前。因此,如果像这里一样在编译时链接库,则无法在加载库之前执行SetDefaultDllDirectories()

给有同样问题的人解决的提示:

  • 您可以使用 manifest 条目 强制从特定路径加载命名库。
  • 您可能需要要求库供应商为您提供一个使用 LoadLibraryEx() API 仅从系统路径加载系统库的版本。
© www.soinside.com 2019 - 2024. All rights reserved.