C++ 十六进制编辑dll以更改依赖项名称?

C++ 十六进制编辑dll以更改依赖项名称?,c++,c,dll,C++,C,Dll,我有一个依赖于OPENGL.dll的dll。但是,Windows附带了OpenGL32.dll。我想在dll二进制文件中更改此依赖项名称,以便它改为查找OpenGL32.dll。我试着在VS的二进制编辑器中打开它,但我似乎无法使名称变长。例如,我可以将它更改为OpenDD.dll,但我不能添加到它。我怎么能这样做 如果我将其编辑为类似于OpenGLAA或OpenGLJU,则此操作有效,但更改为OpenGL32会导致其显示“找不到.dll”您可以尝试制作OpenGL32.dll的副本,将其命名为O

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


如果我将其编辑为类似于OpenGLAA或OpenGLJU,则此操作有效,但更改为OpenGL32会导致其显示“找不到.dll”

您可以尝试制作OpenGL32.dll的副本,将其命名为OPENGL.dll,而不是编辑引用它的二进制文件


看起来OPENGL.DLL和OpenGL32.DLL可能是不同的版本,因此您无法将一个替换为另一个。

您可以尝试制作OpenGL32.DLL的副本,将其命名为OPENGL.DLL,而不是编辑引用它的二进制文件


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

您可以将依赖项设置为适合的名称,然后使用该名称创建另一个DLL,将所有相关名称转发给OpenGL32.DLL。从直接调用OpenGL32.DLL的纯技术角度来看,应该没有问题(除了它仍然需要一个您可能更愿意避免的外部DLL这一事实)。如果您真的需要将依赖项直接更改为OpenGL32.dll,那么这将非常重要。出于最实际的目的,您首先需要复制链接器的大部分功能来生成可执行文件——这在理论上是可能的,但称之为非琐碎是一种严重的轻描淡写。

您可以将依赖项设置为合适的名称,然后用该名称创建另一个DLL,将所有相关名称转发到opengl32.DLL。从直接调用OpenGL32.DLL的纯技术角度来看,应该没有问题(除了它仍然需要一个您可能更愿意避免的外部DLL这一事实)。如果您真的需要将依赖项直接更改为OpenGL32.dll,那么这将非常重要。出于最实际的目的,您首先需要复制链接器生成可执行文件所做的大部分工作——这在理论上是可能的,但称之为非琐碎是一种严重的轻描淡写。

您可能想尝试创建一个名为OPENGL.DLL的“转发DLL”,它只转发到OpenGL32.DLL:

  • Raymond Chen的“真正是货代的导出功能”文章:

  • MSDN杂志,2002年3月,“深入研究Win32可移植可执行文件格式,第2部分”:

  • 微软系统杂志,1996年9月:


当然,这假设API具有相同的签名。如果没有,那么您可以编写一个具有正确API签名的包装器OPENGL.DLL,然后调用OpenGL32.DLL函数。如果有很多函数,这可能是一项乏味的任务,但如果API中存在差异,则需要一些东西来处理这些差异。

您可能想尝试创建一个名为OPENGL.DLL的“转发DLL”,它只转发到OpenGL32.DLL:

  • Raymond Chen的“真正是货代的导出功能”文章:

  • MSDN杂志,2002年3月,“深入研究Win32可移植可执行文件格式,第2部分”:

  • 微软系统杂志,1996年9月:


当然,这假设API具有相同的签名。如果没有,那么您可以编写一个具有正确API签名的包装器OPENGL.DLL,然后调用OpenGL32.DLL函数。如果有很多函数,这可能是一项乏味的任务,但如果API中存在差异,则需要一些东西来处理这些差异。

不要对.dll进行十六进制编辑,只需链接到正确版本的opengl即可。发件人:

如果您看到opengl.lib之类的文件 和glut.lib,这些是SGI的 Microsoft不支持的库 窗户。它们不应该被使用。到 使用硬件加速 建议使用Microsoft库。 . 始终链接到 所有Microsoft库(例如。, glu32.lib、glut32.lib和 或所有SGI库 (例如,glu.lib、glut.lib和 lib)。你不能使用 两者的结合 图书馆和SGI图书馆。但是, 您可以安装这两组库 在同一个系统上。如果你使用SGI的 .lib文件,您将需要 安装在中的相应.dll文件 您的系统文件夹。(即链接) 针对opengl.lib,需要 opengl.dll在运行时安装)


不要对.dll进行十六进制编辑,只需链接到opengl的正确版本即可。发件人:

如果您看到opengl.lib之类的文件 和glut.lib,这些是SGI的 Microsoft不支持的库 窗户。它们不应该被使用。到 使用硬件加速 建议使用Microsoft库。 . 始终链接到 所有Microsoft库(例如。, glu32.lib、glut32.lib和 或所有SGI库 (例如,glu.lib、glut.lib和 lib)。你不能使用 两者的结合 图书馆和SGI图书馆。但是, 您可以安装这两组库 在同一个系统上。如果你使用SGI的 .lib文件,您将需要 安装在中的相应.dll文件 您的系统文件夹。(即链接) 针对opengl.lib,需要 opengl.dll在运行时安装)


千万不要为了你的目的而重命名系统DLL


如果要执行任何操作,请将其复制到.EXE文件夹,并将其重命名为类似OpenGLMYHACKEDVERSION.dll的名称。这样,另一个寻找真正system.dll的应用程序就不可能使用它的“您的”版本。

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

如果
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 );

}