因为每个答案和 cmets 都提供了有用的信息。我刚刚将所有答案和 cmets 编译到一个帖子中。
我只是想知道这是否可能
替换Loader(可执行程序
加载程序不是引导加载程序)的
操作系统(Windows 是我的
选择)。
不,在windows中进程创建和ntdll中的用户模式加载器是绑定在一起的(PsCreateProcess会直接映射到ntdll中并跳转到它,这样它就可以完成解析模块和设置进程),你不能替换它。
但是有一些可用的资源描述了进程的格式和加载。
这是一篇关于 PE 文件(exe + dll)的相当古老但仍然是最新的 MSDN 文章
-
Part I. An In-Depth Look into the Win32 Portable Executable File
Format by Matt Pietrek (MSDN
杂志,2002 年 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 加载程序本身就在那里。