我们有一个DLL,它是在内部产生的,并且我们有相关的存根静态库。
我们还有一个EXE,它使用静态链接到DLL的LIB文件的简单方法使用这个DLL(即,不是手动使用LoadLibrary)。
当我们部署EXE时,我们希望更改DLL文件名,因为混淆的原因(应客户的请求)。
,我们如何做到这一点,以便我们的EXE仍然自动地找到DLL?
我已经尝试重命名DLL和LIB文件(在将它们构建为正常名称之后),然后将EXE项目设置更改为与重命名的LIB链接。这在运行时会失败,因为我猜DLL的名称是在LIB文件中烘烤的,而不是简单地由链接器将".lib“替换为".dll”。
通常,我们不希望将这种混淆应用于DLL的所有使用,因此我们希望保持当前的DLL项目输出文件(如果它们是它们)。
我希望有一种方法,可以编辑DLL的LIB文件,并用其他东西替换DLL文件的硬编码名称。在这种情况下,这可以完全在EXE项目中完成(可能是构建前的步骤)。
更新:我发现延迟加载不起作用,因为我的DLL包含导出的C++类。见这篇文章。
还有别的选择吗?
发布于 2008-11-11 10:45:06
使用LIB工具(包含在visual studio中),您可以从def文件生成lib文件。如果您的dll源不包括def文件,则必须先创建一个。你可以用垃圾箱帮你。例如: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来生成库文件。
现在,您可以轻松地修改def文件,并在每次重命名dll时生成一个新的libfile。
您可以使用dumpbin:dumpbin /exports ws2_32.lib验证libfile。您应该获得与原始lib文件相同的输出。
发布于 2008-11-11 14:25:49
这里有一个很好的替代方法:延迟加载。
在构建应用程序时,将其与原始DLL名称链接(但将原始dll设置为延迟加载)。
然后根据客户请求部署重命名的DLL。
您的EXE将尝试使用原始名称而不是重命名版本来定位DLL,因此会失败,但是由于加载延迟,您可以拦截此失败并自己加载重命名版本,然后让本机windows加载程序解决所有问题,就好像什么都没有改变一样。
阅读文章链接器对延迟加载DLL的支持并查看延迟钩实例。
您的延迟挂钩可能如下所示:
FARPROC WINAPI delayHook( unsigned dliNotify, PDelayLoadInfo pdli )
{
switch( dliNotify )
{
case dliNotePreLoadLibrary:
if( strcmp( pdli->szDll, "origional.dll" ) == 0 )
return (FARPROC)LoadLibrary( "renamed.dll" );
break;
default:
return NULL;
}
return NULL;
}发布于 2018-02-25 00:52:16
https://stackoverflow.com/questions/280485
复制相似问题