此仓库可让你轻松生成可用于侧加载/代理加载的 Nim DLL。 如果你不太了解什么是 DLL 侧加载,可以看看这篇博客文章。
将你想要代理的合法 DLL(或多个 DLL)放入此仓库的 build 目录,然后运行 make。
这将在 out 目录中生成两个 .dll:
如果侧加载成功,你应该会看到一个消息框弹出和/或一个文件被写入桌面。
要实际“武器化”有效载荷,你可以查看 OffensiveNim 仓库获取思路和现成的代码片段 :)。
dllproxy.nim 是代理 DLL,它将执行你的有效载荷并将合法函数调用代理到原始 DLLgen_def.py 解析原始 DLL 的导出表并生成一个模块定义(.def)文件。然后,在编译时将 .def 文件传递给链接器,以便代理合法函数调用。
NimMain参见这篇微软文章
注意此 .def 文件的最后一行:
EXPORTS
GetFileVersionInfoA=ZCnerzNI.GetFileVersionInfoA @1
GetFileVersionInfoByHandle=ZCnerzNI.GetFileVersionInfoByHandle @2
GetFileVersionInfoExA=ZCnerzNI.GetFileVersionInfoExA @3
GetFileVersionInfoExW=ZCnerzNI.GetFileVersionInfoExW @4
GetFileVersionInfoSizeA=ZCnerzNI.GetFileVersionInfoSizeA @5
GetFileVersionInfoSizeExA=ZCnerzNI.GetFileVersionInfoSizeExA @6
GetFileVersionInfoSizeExW=ZCnerzNI.GetFileVersionInfoSizeExW @7
GetFileVersionInfoSizeW=ZCnerzNI.GetFileVersionInfoSizeW @8
GetFileVersionInfoW=ZCnerzNI.GetFileVersionInfoW @9
VerFindFileA=ZCnerzNI.VerFindFileA @10
VerFindFileW=ZCnerzNI.VerFindFileW @11
VerInstallFileA=ZCnerzNI.VerInstallFileA @12
VerInstallFileW=ZCnerzNI.VerInstallFileW @13
VerLanguageNameA=ZCnerzNI.VerLanguageNameA @14
VerLanguageNameW=ZCnerzNI.VerLanguageNameW @15
VerQueryValueA=ZCnerzNI.VerQueryValueA @16
VerQueryValueW=ZCnerzNI.VerQueryValueW @17
NimMain @19 NONAME PRIVATE
这最后一行基本上告诉链接器移除 NimMain 函数的名称。编译 DLL 并将上述 .def 文件传递给链接器后,如果我们查看该 .dll 的导出表,会得到以下条目:
