我有一个DLL依赖于OPENGL.DLL。但是,Windows自带OpenGL32.dll。我想在dll二进制文件中改变这个依赖项名称,所以它改为查找OpenGL32.dll。我试图在VS的二进制编辑器中打开它,但我似乎无法使名称更长。我可以例如将其更改为OpenDD.dll,但我不能添加到它。我怎么能这样做?十六进制编辑dll以更改依赖项名称?
如果我编辑它要像OpenGLAA或OpenGLJU这个工作,但改为OpenGL32导致它说的.dll cound找不到
我有一个DLL依赖于OPENGL.DLL。但是,Windows自带OpenGL32.dll。我想在dll二进制文件中改变这个依赖项名称,所以它改为查找OpenGL32.dll。我试图在VS的二进制编辑器中打开它,但我似乎无法使名称更长。我可以例如将其更改为OpenDD.dll,但我不能添加到它。我怎么能这样做?十六进制编辑dll以更改依赖项名称?
如果我编辑它要像OpenGLAA或OpenGLJU这个工作,但改为OpenGL32导致它说的.dll cound找不到
它有点难以用英文解释如何在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的安全区域会变得更加复杂, 。
你可以尝试做OPENGL32.DLL的副本,并将其命名为opengl.dll文件而不是编辑引用它的二进制文件。
OPENGL.DLL和OpenGL32.DLL似乎是不同的版本,因此您将无法为另一个交换一个。
不,它的工作原理,我想将其更改为Opengl32,以避免将OPENGL.dll与我的应用程序一起运输 – jmasterx 2010-08-05 23:49:27
您可以将依赖项设置为适合的名称,然后通过该名称创建另一个将所有相关名称转发给opengl32.dll的DLL。从纯粹的技术角度来看OpenGL32.DLL的调用,应该没有问题(除了它仍然需要一个你可能更喜欢避免的外部DLL)。如果你真的需要直接改变OpenGL32.dll,这将是非常平凡的。对于大多数实际的目的,您需要复制大部分链接器制作可执行文件的工作 - 这在理论上是可行的,但将其称为非平凡是一个严重的轻描淡写。
但它工作,并且此解决方案创建另一个dll依赖项并避免依赖项是我的要点:p – jmasterx 2010-08-05 23:53:20
@Jex :见编辑。真正的问题是如何以及为什么你首先生产依赖于'opengl.dll'的东西。 – 2010-08-06 00:04:11
你可能想创建一个“转发DLL”实验命名opengl.dll文件,简单地转发到OPENGL32.DLL:
Raymond Chen的“导出功能,这些功能真的转发器”的文章:http://blogs.msdn.com/b/oldnewthing/archive/2006/07/19/671238.aspx
MSDN杂志,2002年3月, “在深入查找到的Win32可移植可执行文件格式,第2部分”:http://msdn.microsoft.com/en-us/magazine/cc301808.aspx
微软系统杂志,S EPT 1996:http://www.microsoft.com/msj/archive/S202B.aspx
当然,这个假设的API具有相同的签名。如果没有,那么你可以编写一个包含正确的API签名的包装程序OPENGL.DLL,然后转向调用OpenGL32.dll函数。如果有很多功能,这可能是一项乏味的任务,但如果API有差异,则需要在那里处理这些差异。
不要十六进制编辑您的.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)。
呃,永远不要重命名为您的目的系统DLL。
如果您做任何事情,请将其复制到您的.EXE文件夹并将其重命名为OpenGLMYHACKEDVERSION.dll。这样,对于另一个寻找REAL系统.dll的应用程序来说,使用它的“你的”版本将是不可能的。
OPENGL.DLL和OpenGL32.dll似乎不太可能互换。它们可能是不同的版本。 – 2010-08-05 23:45:28
不,我已经尝试过它,它的工作 – jmasterx 2010-08-05 23:47:02
你似乎是自相矛盾的。听起来好像你在说你可以编辑二进制文件来将“OPENGL.DLL”(10字节)改为例如“OpenDD.dll”(10字节),但是你不能将它改为“OpenGL32.dll “(12字节)。但是,你自相矛盾地说:“如果我将它编辑为像OpenGLAA或OpenGLJU那样工作”。那它是哪一个? – 2010-08-06 00:00:50