更改导入的Dll名称?

更改导入的Dll名称?,dll,portable-executable,Dll,Portable Executable,在可移植可执行文件中,我们可以通过编辑PE文件更改导入的dll名称, 在这里,我更改了一个导入的应用程序exe的dll名称,那一次它正常地更改了…例如advapi32.dll到^dvapi32.dll,所以这里system32或任何其他路径位置没有^dvapi32.dll..这次我只是将真正的advapi32.dll更改为^dvapi32.dll并放入应用程序目录,这一次它的工作很好…但是当我尝试使用ntdll&gdi32.dll时,它不受支持,我无法解决问题,请帮助我解决问题..谢谢。像gdi

在可移植可执行文件中,我们可以通过编辑PE文件更改导入的dll名称,
在这里,我更改了一个导入的应用程序exe的dll名称,那一次它正常地更改了…例如advapi32.dll到^dvapi32.dll,所以这里system32或任何其他路径位置没有^dvapi32.dll..这次我只是将真正的advapi32.dll更改为^dvapi32.dll并放入应用程序目录,这一次它的工作很好…但是当我尝试使用ntdll&gdi32.dll时,它不受支持,我无法解决问题,请帮助我解决问题..谢谢。

像gdi32.dll这样的系统dll会在Windows启动时加载到内存中,因为它们提供基本的Windows操作系统功能(在本例中是图形功能)。某些DLL是使用固定的ImageBase构建的(怀疑这适用于最基本的系统DLL,例如KERNEL32、GDI32.DLL、USER32.DLL),复制和重命名此类DLL并引用它们将不起作用,除非在PE标头中修改它们的ImageBase

出现这种情况是因为它们将尝试将自己加载到ImageBase指定的内存中,但失败了,因为特定的内存位置已被内存中的原始DLL占用,并且它们的固定ImageBase阻止它们在其他内存位置加载。没有固定ImageBase的DLL将由Windows重新定位,以使用另一个内存位置,并且运行时不会出现问题

如果DLL副本的ImageBase更改为其他值,则具有固定ImageBase的DLL将正常工作,前提是ImageBase指向的内存位置未被占用


虽然我在记事本副本上成功地测试了这种方法,然后在Windows XP上更改了DLL副本的导入DLL名称和ImageBase,但我强烈反对以这种方式篡改导入和篡改Windows系统DLL

只是好奇,为什么您需要更改导入的名称,因为这些是属于Windows操作系统本身的DLL。您的应用程序是否使用Windows dll的修改版本?roys,在pe中,我们可以更改导入的dll名称,然后我们在单独的文件中写入与system32中相同的名称,只有名称会更改,那么为什么不支持?roys先生,很抱歉再次打扰您,我没有使用Windows dll的修改版本,但是我想将系统dll重定向到我的本地副本中,除了dll的名称更改之外,还有其他任何更改,告诉我你是正确的。基本上这不是一个好主意,我想知道关于pe的一些研究的任何方式。非常感谢你提供的宝贵信息……如果我更改名称更改dll的imagebase,这个应用程序很好用……是吗?是的。使用StudPE@这样的PE编辑器编辑DLL的ImageBase要容易得多,但可以使用十六进制编辑器来完成。好吧,我还有一个疑问,那就是如何预测系统DLL未占用的位置?我随机将GDI32从77F10000改为74F10000。由于Windows dll的默认映像库在不同的操作系统版本中会发生变化,因此您必须仔细阅读正在使用的特定操作系统的内部结构。虽然只更改导入的dll名称,但需要将导入描述符绑定为零,如果我在win-server2008中的loadlibrary返回句柄零中更改映像库,任何我们必须知道系统dll未占用位置的方法…你能为我测试一个条件吗,在gdi32.dll存在的任何exe中,只需更改导入dll(gdi32.dll)的第一个字母,并将其应用到应用程序目录中,然后简单地运行exe。结果如何,不需要更改imagebase。。。