我们有一个在内部生成的DLL,并且我们拥有相关联的stub的静态LIB。
我们还有一个EXE,它使用静态链接到DLL的LIB文件(即不是手动使用LoadLibrary)的简单方法使用这个DLL。
当我们部署EXE时,我们希望DLL文件名由于模糊的原因而被更改(根据客户的要求)。
我们如何做到这一点,使我们的EXE仍然自动发现DLL?
我已经尝试重命名DLL和LIB文件(在它们被构建到其正常名称之后),然后将EXE项目设置更改为与重命名的LIB链接。这在运行时失败,因为我猜这个DLL的名字被烧录到LIB文件中,而不是简单地通过链接器来代替“.lib”和“.dll”来猜测。
一般来说,我们不想将这个混淆应用于DLL的所有用途,所以我们希望保留当前的DLL项目输出文件。
我希望有一种方法可以编辑DLL的LIB文件,并用其他东西替换DLL文件的硬编码名称。在这种情况下,这可以完全在EXE项目中完成(可能作为预构建步骤)。
更新:我发现延迟加载不起作用,因为我的DLL包含导出的C类。
见this article。
有什么办法吗
使用LIB工具(包含在visual studio中)可以从def文件生成一个lib文件。因为你的dll源码不包含一个def文件,你必须先创建一个。您可以使用dumpbin来协助您。例如:dumpbin / exports ws2_32.dll
在输出中可以看到导出的函数的名称。现在创建一个这样的def文件:
LIBRARY WS2_32 EXPORTS accept @1 bind @2 closesocket @3 connect @4
@number是dumpbin输出中的序数
使用LIB / MACHINE:x86 /def:ws2_32.def来转换lib文件。
现在,您可以轻松修改def文件,并在每次重命名dll时生成一个新的libfile。
您可以使用dumpbin来验证libfile:dumpbin / exports ws2_32.lib。你应该得到与原始的lib文件相同的输出。