2010-08-05 18 views
1

我有一个DLL依赖于OPENGL.DLL。但是,Windows自带OpenGL32.dll。我想在dll二进制文件中改变这个依赖项名称,所以它改为查找OpenGL32.dll。我试图在VS的二进制编辑器中打开它,但我似乎无法使名称更长。我可以例如将其更改为OpenDD.dll,但我不能添加到它。我怎么能这样做?十六进制编辑dll以更改依赖项名称?

如果我编辑它要像OpenGLAA或OpenGLJU这个工作,但改为OpenGL32导致它说的.dll cound找不到

+0

OPENGL.DLL和OpenGL32.dll似乎不太可能互换。它们可能是不同的版本。 – 2010-08-05 23:45:28

+0

不,我已经尝试过它,它的工作 – jmasterx 2010-08-05 23:47:02

+0

你似乎是自相矛盾的。听起来好像你在说你可以编辑二进制文件来将“OPENGL.DLL”(10字节)改为例如“OpenDD.dll”(10字节),但是你不能将它改为“OpenGL32.dll “(12字节)。但是,你自相矛盾地说:“如果我将它编辑为像OpenGLAA或OpenGLJU那样工作”。那它是哪一个? – 2010-08-06 00:00:50

回答

2

它有点难以用英文解释如何在PE (有相当多的间接和RVA级别)中更改导入的dll名称,但意外地有 ,我有一个可用于东西的库像那样。 只有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名称的新位置是有点hackish的,但随着 配置在PE的安全区域会变得更加复杂, 。

+0

下载链接现在不可用,并且您提供的演示源无法编译。请修复下载链接。谢谢。 – tbago 2016-03-16 13:37:55

+0

固定,对不起... – Shelwien 2016-08-22 04:52:09

2

你可以尝试做OPENGL32.DLL的副本,并将其命名为opengl.dll文件而不是编辑引用它的二进制文件。

OPENGL.DLL和OpenGL32.DLL似乎是不同的版本,因此您将无法为另一个交换一个。

+0

不,它的工作原理,我想将其更改为Opengl32,以避免将OPENGL.dll与我的应用程序一起运输 – jmasterx 2010-08-05 23:49:27

0

您可以将依赖项设置为适合的名称,然后通过该名称创建另一个将所有相关名称转发给opengl32.dll的DLL。从纯粹的技术角度来看OpenGL32.DLL的调用,应该没有问题(除了它仍然需要一个你可能更喜欢避免的外部DLL)。如果你真的需要直接改变OpenGL32.dll,这将是非常平凡的。对于大多数实际的目的,您需要复制大部分链接器制作可执行文件的工作 - 这在理论上是可行的,但将其称为非平凡是一个严重的轻描淡写。

+0

但它工作,并且此解决方案创建另一个dll依赖项并避免依赖项是我的要点:p – jmasterx 2010-08-05 23:53:20

+0

@Jex :见编辑。真正的问题是如何以及为什么你首先生产依赖于'opengl.dll'的东西。 – 2010-08-06 00:04:11

4

你可能想创建一个“转发DLL”实验命名opengl.dll文件,简单地转发到OPENGL32.DLL:

当然,这个假设的API具有相同的签名。如果没有,那么你可以编写一个包含正确的API签名的包装程序OPENGL.DLL,然后转向调用OpenGL32.dll函数。如果有很多功能,这可能是一项乏味的任务,但如果API有差异,则需要在那里处理这些差异。

1

不要十六进制编辑您的.dll,只需链接到正确版本的opengl。从http://www.opengl.org/resources/faq/technical/gettingstarted.htm#0010

如果你看到的文件,如opengl.lib 和glut.lib,这些都是SGI的 微软的Windows 不支持库。他们不应该使用。要使用硬件加速功能,建议使用 Microsoft库。 More info on the SGI libraries can be found here始终用 要么所有微软库(例如, glu32.lib,glut32.lib和 opengl32.lib)或所有SGI库 (例如,glu.lib,glut.lib和 opengl.lib)联系起来。您不能使用 libarires和SGI库的 组合。但是,您可以在同一个系统上安装两套库 。如果您使用SGI的 .lib文件,则需要在您的系统文件夹中安装 相应的.dll文件,该文件安装在 中。 (即,将 链接到opengl.lib需要在运行时安装 opengl.dll)。

+0

我的问题是glu32崩溃,而glu不 – jmasterx 2010-08-06 00:07:16

+0

@Jex,什么是崩溃? Callstack等? – MSN 2010-08-06 16:35:28

0

呃,永远不要重命名为您的目的系统DLL。

如果您做任何事情,请将其复制到您的.EXE文件夹并将其重命名为OpenGLMYHACKEDVERSION.dll。这样,对于另一个寻找REAL系统.dll的应用程序来说,使用它的“你的”版本将是不可能的。