kernel32是否总是从System32加载?

  • 将System32(或SysWOW64,如果您正在使用32位应用程序进行测试)将kernel32.dll复制到包含EXE文件的目录中
  • 运行EXE文件
  • 进程监视器显示它甚至不打算首先检查kernel32.dll的本地文件夹
  • 这似乎与我一直认为是DLL的默认行为相矛盾,那就是先从本地应用程序目录加载,如果它没有从PATH环境变量加载。 但是,对于某些DLL(如ntdll或kernel32),Windows总是首先检查System32。 这是预期的行为? 它可以被覆盖吗?

    (我意识到重写这将是不好的做法,但想知道它是否真的可行,科学!)


    Windows中的KnownDLLs功能可以帮助加载常见DLL,但它也会强制列表中的所有DLL从system32加载。

    最重要的是,kernel32.dll和ntdll.dll在大多数版本的Windows中都有特殊的处理,并且在CreateProcess内部尽早加载,因为usermode进程的真正入口位于其中一个模块中。

    您可以使用.local和清单重定向来覆盖其中的一些。


    经过更多研究后,我发现某些DLL如kernel32.dll或user32.dll不能被正常覆盖的原因是因为它们是已知的DLL - Windows有一个像这些常用的DLL列表,它们自动默认为System32版本,而比首先检查应用程序的文件夹的默认行为。

    如果您想要解决此问题,例如制作代理DLL,则需要在应用程序目录中包含两个文件:applicationName.exe.local和applicationName.exe.manifest,其中applicationName是您的EXE文件的名称。

    这些需要是清单文件的内容:

    <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
        <assemblyIdentity version="1.0.0.0" name="redirector" type="win32" />
        <file name="kernel32.dll" />
    </assembly>
    

    assemblyIdentity标签旨在提供有关应用程序版本号和名称的信息,但我们基本上可以忽略它。 重要的部分是指定要在本地加载的文件的文件标签。 将kernel32.dll替换为您想在本地加载的DLL。

    此外,Windows只会在重新启动时或在EXE文件被修改时刷新.manifest文件的内容,因此您可以在某个十六进制编辑器中打开EXE文件,擦除第一个字符并将其添加回并保存...等。刷新清单文件。 如果你清单文件似乎被忽略,这样做。

  • 在Windows 2000及更低版本中,添加.local文件足以说服它加载kernel32.dll的本地版本。
  • 在Windows XP及更高版本中,您需要使用.manifest文件。
  • 应用程序可能嵌入一个.manifest文件。 在这种情况下,您可以使用Stud_PE等工具删除资源。
  • 链接地址: http://www.djcxy.com/p/44477.html

    上一篇: Does kernel32 always load from System32?

    下一篇: Unable to find an entry point named '' in DLL 'cvextern'