我有一个依赖于OPENGL.DLL的dll。但是,Windows附带OpenGL32.dll。我想在dll二进制文件中更改此依赖项名称,以便它查找OpenGL32.dll。我尝试在VS的二进制编辑器中打开它,但我似乎不能让名字更长。我可以将其更改为OpenDD.dll,但我无法添加它。我怎么能这样做?
如果我将其编辑为类似OpenGLAA或OpenGLJU,则可以正常工作,但更改为OpenGL32会导致它说.dll cound not found
答案 0 :(得分:4)
您可能想尝试创建一个名为OPENGL.DLL的“转发DLL”,它只是转发到OpenGL32.dll:
Raymond Chen的“真正转发的导出函数”文章:http://blogs.msdn.com/b/oldnewthing/archive/2006/07/19/671238.aspx
MSDN Magazine,2002年3月,“深入研究Win32可移植可执行文件格式,第2部分”:http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
Microsoft System Journal,1996年9月:http://www.microsoft.com/msj/archive/S202B.aspx
当然,这假设API具有相同的签名。如果没有,那么你可以编写一个包含正确的API签名的包装器OPENGL.DLL,然后转向调用OpenGL32.dll函数。如果有很多功能,这可能是一项繁琐的工作,但如果API存在差异,则需要有一些东西来处理这些差异。
答案 1 :(得分:3)
用英语解释如何在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名称的新位置有点hackish,但有分配 PE中的一个安全区域会变得更加复杂。
答案 2 :(得分:2)
您可以尝试制作OpenGL32.DLL的副本,将其命名为OPENGL.DLL,而不是编辑引用它的二进制文件。
OPENGL.DLL和OpenGL32.DLL似乎是不同的版本,因此你将无法将一个交换为另一个版本。
答案 3 :(得分:1)
不要对.dll进行十六进制编辑,只需链接到正确版本的opengl即可。来自http://www.opengl.org/resources/faq/technical/gettingstarted.htm#0010:
如果您看到诸如opengl.lib之类的文件 和glut.lib,这些是SGI的 Microsoft不支持的库 视窗。不应该使用它们。至 使用硬件加速, 建议使用Microsoft库。 More info on the SGI libraries can be found here。 始终链接 所有Microsoft库(例如, glu32.lib,glut32.lib和 opengl32.lib)或所有SGI库 (例如,glu.lib,glut.lib和 opengl.lib)。你不能使用 微软的组合 libarires和SGI库。但是, 你可以安装两套库 在同一个系统上。如果你使用SGI .lib文件,你需要的 安装的相应.dll文件 你的系统文件夹。 (即,链接 反对opengl.lib要求 opengl.dll是在运行时安装的。)
答案 4 :(得分:0)
您可以将依赖项设置为适合的某个名称,然后按该名称创建另一个DLL,将所有相关名称转发给opengl32.dll。从指向OpenGL32.DLL的调用的纯技术角度来看,应该没有问题(除了它继续需要您可能希望避免的外部DLL之外)。如果你真的需要直接将依赖项更改为OpenGL32.dll,那将是非常重要的。出于大多数实际目的,您需要复制链接器首先生成可执行文件的大部分内容 - 这在理论上是可行的,但称之为非平凡是严重的轻描淡写。
答案 5 :(得分:0)
呃,不要为了你的目的重命名系统DLL。
如果您执行了任何操作,请将其复制到.EXE文件夹并将其重命名为OpenGLMYHACKEDVERSION.dll。这样,对于寻找REAL系统的其他应用程序来说,这将是不可能的.dll使用它的“你的”版本。