我有一个依赖于OPENGL.DLL的DLL。但是,Windows附带OpenGL32.dll。我想在dll二进制文件中更改此依赖项名称,以便它改为查找OpenGL32.dll。我试着在VS的二进制编辑器中打开它,但我似乎不能使名称更长。例如,我可以将其更改为OpenDD.dll,但我不能添加到它。我怎么能这么做?如果我编辑它像OpenGLAA或OpenGLJU这工程,但改变到OpenGL32的结果,它说.dll cound找不到
njthzxwz1#
用英语解释如何在PE中更改导入的dll名称有点困难(有相当多的间接和RVAs级别),但意外的是,我有一个库可以用于类似的东西。PE32只。下面是您可以使用的实用程序:用途:http://nishi.dreamhosters.com/dllrepl_v0.rar(带源代码)。它是这样工作的:(UpdateImports()执行此操作)
struct PE_Hdr1 : PE_Hdr { void UpdateImports( char* s1, char* s2 ) { int c,i,j; int p = 0; uint ofs = 0x50; printf( "Redirecting <%s> to <%s>\n", s1, s2 ); // store the target dll name to some place in MZ header memcpy( &exedata[ofs], s2, strlen(s2)+1 ); uint idtrva = tbl[1].VA; PE_IDRec* idt = (PE_IDRec*)&exedata[ RVA2Ofs(idtrva) ]; for( i=0; i<nIDRec; i++ ) { char* dllname = (char*)&exedata[ RVA2Ofs( idt[i].DLLName ) ]; printf( "dllname=<%s>", dllname ); if( stricmp( dllname, s1 )==0 ) { printf( " -> <%s>", s2 ); idt[i].DLLName = ofs; } printf( "\n" ); } } }; // Usage: dllrepl file.exe file_out.exe msvcrt.dll msvcrt32.dll int main( int argc, char** argv ) { if( argc<5 ) return 1; FILE* f = fopen( argv[1], "rb" ); if( f==0 ) return 1; FILE* g = fopen( argv[2], "wb" ); if( g==0 ) return 1; MZ_Hdr mz; PE_Hdr pe; PE_Open( mz, pe, f ); ((PE_Hdr1&)pe).UpdateImports( argv[3], argv[4] ); fwrite( pe.exedata, 1,pe.exesize, g ); }
dll名称的新位置有点古怪,但在PE中分配安全区域会变得更加复杂。
gorkyyrv2#
您可能想尝试创建一个名为OPENGL.DLL的“转发DLL”,它只是转发到OpenGL32.dll:
当然,这假设API具有相同的签名。如果没有,那么您可以编写一个具有正确API签名的 Package 器OPENGL.DLL,然后调用OpenGL 32.dll函数。如果有很多函数,这可能是一项乏味的任务,但如果API中存在差异,则需要有一些东西来处理这些差异。
afdcj2ne3#
您可以尝试创建一个OpenGL32.DLL的副本,将其命名为OPENGL.DLL,而不是编辑引用它的二进制文件。看起来OPENGL.DLL和OpenGL32.DLL可能是不同的版本,因此您将无法将其中一个交换为另一个。
5jvtdoz24#
不要十六进制编辑你的.dll,只要链接到opengl的正确版本。来自http://www.opengl.org/resources/faq/technical/gettingstarted.htm#0010:如果您看到像opengl.lib和glut.lib这样的文件,则这些是SGI不支持的Microsoft Windows库。它们不应该被使用。若要使用硬件加速,建议使用Microsoft库。关于SGI库的更多信息可以在这里找到。**始终与所有Microsoft库(例如,glu32.lib、p32.lib和opengl32.lib)或所有SGI库(例如,glu.lib、glut.lib和opengl.lib)链接。您不能同时使用Microsoft libarires和SGI库。**但是,您可以在同一系统上安装这两组库。如果您使用SGI的.lib文件,则需要在系统文件夹中安装相应的.dll文件。(即,链接opengl.lib需要在运行时安装opengl.dll)。
x6yk4ghg5#
您可以将依赖项设置为适合的名称,然后使用该名称创建另一个DLL,将所有相关名称转发到opengl32.dll。从纯粹的技术Angular 来看,将调用定向到OpenGL32.DLL应该没有问题(除了它仍然需要一个外部DLL之外,您可能更愿意避免)。如果您真的需要直接将依赖项更改为OpenGL32.dll,这将是非常重要的。对于大多数实际的目的,您首先需要复制链接器为生成可执行文件所做的大部分工作--这在理论上是可能的,但是称之为非平凡是严重的轻描淡写。
8wtpewkr6#
永远不要为你的目的重命名一个系统DLL。如果你做了任何事情,把它复制到你的.EXE文件夹,并把它重命名为类似OpenGLMYHACKEDVERSION.dll的东西。这样,另一个寻找真实的system .dll的应用程序就不可能使用“你的”版本。
6条答案
按热度按时间njthzxwz1#
用英语解释如何在PE中更改导入的dll名称有点困难(有相当多的间接和RVAs级别),但意外的是,我有一个库可以用于类似的东西。PE32只。
下面是您可以使用的实用程序:用途:http://nishi.dreamhosters.com/dllrepl_v0.rar(带源代码)。它是这样工作的:(UpdateImports()执行此操作)
dll名称的新位置有点古怪,但在PE中分配安全区域会变得更加复杂。
gorkyyrv2#
您可能想尝试创建一个名为OPENGL.DLL的“转发DLL”,它只是转发到OpenGL32.dll:
当然,这假设API具有相同的签名。如果没有,那么您可以编写一个具有正确API签名的 Package 器OPENGL.DLL,然后调用OpenGL 32.dll函数。如果有很多函数,这可能是一项乏味的任务,但如果API中存在差异,则需要有一些东西来处理这些差异。
afdcj2ne3#
您可以尝试创建一个OpenGL32.DLL的副本,将其命名为OPENGL.DLL,而不是编辑引用它的二进制文件。
看起来OPENGL.DLL和OpenGL32.DLL可能是不同的版本,因此您将无法将其中一个交换为另一个。
5jvtdoz24#
不要十六进制编辑你的.dll,只要链接到opengl的正确版本。来自http://www.opengl.org/resources/faq/technical/gettingstarted.htm#0010:
如果您看到像opengl.lib和glut.lib这样的文件,则这些是SGI不支持的Microsoft Windows库。它们不应该被使用。若要使用硬件加速,建议使用Microsoft库。关于SGI库的更多信息可以在这里找到。**始终与所有Microsoft库(例如,glu32.lib、p32.lib和opengl32.lib)或所有SGI库(例如,glu.lib、glut.lib和opengl.lib)链接。您不能同时使用Microsoft libarires和SGI库。**但是,您可以在同一系统上安装这两组库。如果您使用SGI的.lib文件,则需要在系统文件夹中安装相应的.dll文件。(即,链接opengl.lib需要在运行时安装opengl.dll)。
x6yk4ghg5#
您可以将依赖项设置为适合的名称,然后使用该名称创建另一个DLL,将所有相关名称转发到opengl32.dll。从纯粹的技术Angular 来看,将调用定向到OpenGL32.DLL应该没有问题(除了它仍然需要一个外部DLL之外,您可能更愿意避免)。如果您真的需要直接将依赖项更改为OpenGL32.dll,这将是非常重要的。对于大多数实际的目的,您首先需要复制链接器为生成可执行文件所做的大部分工作--这在理论上是可能的,但是称之为非平凡是严重的轻描淡写。
8wtpewkr6#
永远不要为你的目的重命名一个系统DLL。
如果你做了任何事情,把它复制到你的.EXE文件夹,并把它重命名为类似OpenGLMYHACKEDVERSION.dll的东西。这样,另一个寻找真实的system .dll的应用程序就不可能使用“你的”版本。