我想保护我的 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() 也影响这个库?
这是不可能的。以下行使 cgo 进行编译时编译:
#cgo LDFLAGS: -L . -lmylib
这样,内核就会在运行时加载 mylib,甚至在执行 func main() 中的任何代码之前。因此,如果像这里一样在编译时链接库,则无法在加载库之前执行SetDefaultDllDirectories()。
给有同样问题的人解决的提示: