【问题标题】:Is it possible to replace Loader of an OS? Any way to obtain the control over Loader?是否可以更换操作系统的加载程序?有什么方法可以控制加载器吗?
【发布时间】:2011-01-10 18:03:36
【问题描述】:

我只是想知道是否可以替换操作系统的加载程序(可执行程序加载程序而不是引导加载程序)(Windows 是我的选择)。是否有任何可用的第三方加载器可以修补默认加载器。

有什么方法可以让我获得对 OS Loader 的控制权?我的意思是,我希望它正在做的事情对我来说是可见的(每一步)。

如果你问我为什么要这样做,For learning purposes.

【问题讨论】:

  • 引导加载器还是可执行加载器?

标签: windows linux operating-system linker loader


【解决方案1】:

不,进程创建和ntdll中的用户模式加载器是捆绑在一起的(PsCreateProcess会直接映射到ntdll中并跳转到它,这样它就可以完成解析模块和设置进程),你不能替换它。

【讨论】:

  • 不会很好,但至少可以通过API hooking 或类似的低级拦截技术来实现吗?
【解决方案2】:

如果你想玩这种东西,那么 Linux 就是你要走的路。

加载程序是内核的一部分,但是由于您可以访问所有内核源代码,因此您可以尽情地使用它。

【讨论】:

  • 其实Linux中的loader是/lib{,64}/ld-linux.so.2。
  • 各种二进制格式的加载器在 Linux 源代码中的 fs/binfmt_*.c 中(fs/binfmt_elf.c 是用于 ELF 格式的可执行文件的加载器 - 即绝大多数)。 Ignacio 指出的动态加载器ld-linux.so.2 也用于动态链接的二进制文件——它是binfmt_elf.c 中的代码引用的“解释器”示例。
【解决方案3】:

Linux 具有可插入的可执行文件格式,因此可以添加一个额外的程序加载器,它会使用可执行文件而不是标准的(ELF、shell 脚本、binfmt_misc)来执行自己的自定义操作。

binfmt_misc 模块允许您完全在用户空间中为可执行程序编写自定义加载器;这通常用于执行非本机二进制文件或解释的二进制文件,例如 Java、CLR 可执行文件等。

另一方面,如果您想用其他东西替换 ELF 加载器,您可以直接在内核中创建一个 binfmt 模块。查看 fs/binfmt_* 示例。 ELF 加载程序本身就在那里。

【讨论】:

    【解决方案4】:

    因为每个答案和 cmets 都提供了有用的信息。我刚刚将所有答案和 cmets 编译到一个帖子中。

    我只是想知道这是否可能 替换Loader(可执行程序 加载程序不是引导加载程序)的 操作系统(Windows 是我的 选择)。

    不,在windows中进程创建和ntdll中的用户模式加载器是绑定在一起的(PsCreateProcess会直接映射到ntdll中并跳转到它,这样它就可以完成解析模块和设置进程),你不能替换它。

    但是有一些可用的资源描述了进程的格式和加载。

    这是一篇关于 PE 文件(exe + dll)的相当古老但仍然是最新的 MSDN 文章

    1. Part I. An In-Depth Look into the Win32 Portable Executable File Format by Matt Pietrek (MSDN 杂志,2002 年 2 月)
    2. Part II. An In-Depth Look into the Win32 Portable Executable File Format by Matt Pietrek (MSDN 杂志,2002 年 3 月)

    您可以使用此信息编写启动给定可执行文件的应用程序。

    如果你对 linux 和 elf 格式更感兴趣,你会在 google 中找到你需要的一切。

    有什么办法可以 获得对 OS Loader 的控制权? 我的意思是,我想要它正在做的事情 对我可见(每一步)。

    Windows 上,您可以通过启用加载器快照来了解加载器的工作情况。您可以使用gflags.exe(Windows 调试工具的一部分)来执行此操作。有一个很好的 gflags.exe 参考 http://www.osronline.com/DDKx/ddtools/gflags_4n77.htm 。启用 Show Loader Snaps 后,您可以通过在调试器 (WinDBG) 下启动应用程序来查看加载程序跟踪消息。

    如果你想玩这种东西,那么 Linux 是最好的方法。

    加载程序是内核的一部分——但由于您可以访问所有内核源,因此您可以尽情使用它。

    各种二进制格式的加载器位于 Linux 源代码中的 fs/binfmt_*.c 中(fs/binfmt_elf.c 是用于 ELF 格式的可执行文件的加载器 - 即绝大多数)。

    动态加载程序/lib{,64}/ld-linux.so.2 也用于动态链接的二进制文件 - 它是 binfmt_elf.c 中的代码引用的“解释器”示例。

    Linux 具有可插入的可执行文件格式,因此可以添加一个额外的程序加载器,它会使用可执行文件而不是标准的(ELF、shell 脚本、binfmt_misc)来执行自己的自定义操作。

    binfmt_misc 模块允许您完全在用户空间中为可执行程序编写自定义加载器;这通常用于执行非本机二进制文件或解释的二进制文件,例如 Java、CLR 可执行文件等。

    另一方面,如果你想用其他东西替换 ELF 加载器,你可以直接在内核中创建一个 binfmt 模块。查看fs/binfmt_* 的示例。 ELF 加载程序本身就在那里。

    【讨论】:

      【解决方案5】:

      不,您不能替换 OS 加载器,但有可用的资源描述进程的格式和加载。

      这是一篇关于 PE 文件(exe + dll)http://msdn.microsoft.com/en-us/magazine/cc301805.aspx

      的相当古老但仍然是最新的 MSDN 文章

      您可以使用此信息来编写启动给定可执行文件的应用程序。

      如果你对 linux 和 elf 格式更感兴趣,你会在 google 中找到你需要的一切。

      【讨论】:

        【解决方案6】:

        有什么方法可以让我获得对 OS Loader 的控制权?我的意思是,我希望它正在做的事情对我来说是可见的(每一步)。

        在 Windows 上,您可以通过启用加载程序快照来了解加载程序的工作情况。您可以使用 gflags.exe(Windows 调试工具的一部分)执行此操作。有一个很好的 gflags.exe 参考 here。启用 Show Loader Snaps 后,您可以通过在调试器 (WinDBG) 下启动应用程序来查看加载程序跟踪消息。

        【讨论】:

          猜你喜欢
          • 2015-05-07
          • 2015-12-06
          • 2014-11-12
          • 1970-01-01
          • 2014-12-10
          • 1970-01-01
          • 2022-11-11
          • 2014-10-12
          • 1970-01-01
          相关资源
          最近更新 更多