cla*_*aws 6 linux windows linker operating-system loader
我只是想知道是否有可能替换操作系统的Loader(可执行程序加载器而不是引导加载程序)(Windows是我的选择).是否有任何第三方加载器可以修补默认加载器.
有什么办法可以获得对OS Loader的控制吗?我的意思是,我希望我所看到的事情(每一步都可见).
如果你问我为什么要这样做, For learning purposes.
因为每个答案和评论都提供了有用的信息。我刚刚将所有答案和评论整理到一篇文章中。
我只是想知道是否可以替换操作系统的加载程序(可执行程序加载程序而不是引导加载程序)(Windows 是我的选择)。
不,在Windows中进程创建和ntdll中的用户模式加载器是捆绑在一起的(PsCreateProcess将直接在ntdll中映射并跳转到它,以便它可以完成解析模块和设置进程),你无法替换它。
但有一些资源可以描述流程的格式和加载。
这是一篇关于 PE 文件(exe + dll)的相当古老但仍然最新的 MSDN 文章
- 第一部分:深入探讨 Win32 可移植可执行文件格式,作者:Matt Pietrek(MSDN 杂志,2002 年 2 月)
- 第二部分。Matt Pietrek深入探讨 Win32 可移植可执行文件格式(MSDN 杂志,2002 年 3 月)
您可以使用此信息编写启动给定可执行文件的应用程序。
如果您对 linux 和 elf 格式更感兴趣,您将在 google 中找到所需的一切。
有什么方法可以让我获得对 OS Loader 的控制权吗?我的意思是,我希望它所做的事情对我来说是可见的(每一步)。
在Windows上,您可以通过启用加载程序快照来了解正在工作的加载程序。您可以使用gflags.exe(Windows 调试工具的一部分)来执行此操作。有一个很好的gflags.exe参考http://www.osronline.com/DDKx/ddtools/gflags_4n77.htm。启用“显示加载程序快照”后,您可以通过在调试器 (WinDBG) 下启动应用程序来查看加载程序跟踪消息。
如果你想玩这类东西,那么 Linux 是最好的选择。
加载器是内核的一部分——但是当您可以访问所有内核源代码时,您可以随心所欲地使用它。
各种二进制格式的加载器位于fs/binfmt_*.cLinux 源代码中(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 加载器本身就在那里。