【问题标题】:Does kernel32 always load from System32?kernel32 是否总是从 System32 加载?
【发布时间】:2017-03-30 16:51:55
【问题描述】:
  • 将 kernel32.dll 从 System32(或 SysWOW64,如果您使用 32 位应用程序进行测试)复制到包含您的 EXE 文件的目录
  • 运行EXE文件
  • Process Monitor 显示它甚至不需要先检查本地文件夹中的 kernel32.dll

这似乎与我一直认为的 DLL 的默认行为相矛盾,即首先从本地应用程序目录加载,如果不存在则从 PATH 环境变量加载。但是,对于某些 DLL,如 ntdll 或 kernel32,Windows 似乎总是首先检查 System32。这是预期的行为吗?可以覆盖吗?

(我知道覆盖这将是不好的做法,但想知道它是否真的可能,对于科学来说!)

【问题讨论】:

  • 32 位应用程序实际上将 system32 重定向到 32 位对应项,因此它甚至不会尝试加载 64 位 DLL 作为首选。
  • 这些 DLL 几乎已经被缓存了,从另一个地方加载并不好。系统关键 DLL 将始终从默认路径注入。
  • 我知道 Windows 会在必要时将 System32 重定向到 SysWOW64,这不是我要问的。我也知道重写这些 DLL 是不好的做法,但我仍然想知道是否有可能。经过进一步研究,我似乎应该在目录中添加一个 .local 文件,但这仍然没有效果。
  • 那么我认为由于 Windows 的缓存行为,它们不能被覆盖(DLL 在实际 RAM 中只存在一次,而不是每个进程一次)
  • 这是 Windows 中的 known dll 支持。

标签: windows dll windows-10 kernel32


【解决方案1】:

Windows 中的KnownDLLs 功能应该有助于更快地加载常用 DLL,但它也会强制列表中的所有 DLL 从 system32 加载。

除此之外,kernel32.dll 和 ntdll.dll 在大多数 Windows 版本中都得到了特殊处理,并在 CreateProcess 中提前加载,因为用户模式进程的真正入口点位于其中一个模块中。

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

【讨论】:

    【解决方案2】:

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

    如果您想解决这个问题,例如制作代理 DLL,您需要在应用程序目录中包含两个文件:applicationName.exe.localapplicationName.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 等工具删除资源。

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多