C语言 用十六进制编辑动态链接库来改变依赖项名称?

lvjbypge  于 2023-10-16  发布在  其他
关注(0)|答案(6)|浏览(115)

我有一个依赖于OPENGL.DLL的DLL。但是,Windows附带OpenGL32.dll。我想在dll二进制文件中更改此依赖项名称,以便它改为查找OpenGL32.dll。我试着在VS的二进制编辑器中打开它,但我似乎不能使名称更长。例如,我可以将其更改为OpenDD.dll,但我不能添加到它。我怎么能这么做?
如果我编辑它像OpenGLAA或OpenGLJU这工程,但改变到OpenGL32的结果,它说.dll cound找不到

njthzxwz

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中分配安全区域会变得更加复杂。

gorkyyrv

gorkyyrv2#

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

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

afdcj2ne

afdcj2ne3#

您可以尝试创建一个OpenGL32.DLL的副本,将其命名为OPENGL.DLL,而不是编辑引用它的二进制文件。
看起来OPENGL.DLL和OpenGL32.DLL可能是不同的版本,因此您将无法将其中一个交换为另一个。

5jvtdoz2

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)。

x6yk4ghg

x6yk4ghg5#

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

8wtpewkr

8wtpewkr6#

永远不要为你的目的重命名一个系统DLL。
如果你做了任何事情,把它复制到你的.EXE文件夹,并把它重命名为类似OpenGLMYHACKEDVERSION.dll的东西。这样,另一个寻找真实的system .dll的应用程序就不可能使用“你的”版本。

相关问题