0

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

4

1 回答 1

1

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

发生这种情况是因为它们将尝试将自己加载到 ImageBase 指定的内存中并失败,因为特定的内存位置已经被内存中的原始 DLL 占用,并且它们的固定 ImageBase 阻止它们加载到其他内存位置。没有固定 ImageBase 的 DLL 将被 Windows 重新定位以使用另一个内存位置并正常运行。

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

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

于 2010-04-23T07:19:31.833 回答