64 位 Windows 似乎使用 rcx = r8 = &PEB
调用 exe 的入口点和 rdx = r9 = &entrypoint
好像入口点被声明 entrypoint(PEB *peb, void *entry)
.
这些细节是在任何地方指定的,还是没有记录在案且不值得依赖?
最佳答案
从 vista windows 调用 exe 入口点开始,带有一个参数 - PEB 的地址
所以exe入口点的签名必须是下一个
ULONG __stdcall ep(PEB* );
因为在 x64 中,第一个参数是通过 rcx 寄存器传递的 - 您可以在此处查看 PEB 的地址。另一个寄存器中的值是随机的。但我怎么说 - 这不仅仅与 64 位有关。在所有 Windows 版本中,第一个参数中将是 PEB 的地址。
这没有记录,但我确信非常可靠并且不会在新的 Windows 版本中改变。
在 wdk 中存在 nt.lib。这是静态(非导入)库 - 它为只能使用 ntdll.dll 导入(主启动执行应用程序,如 autochk.exe)的应用程序实现了微小的 crt 这个库实现了 exe 的入口点(
NtProcessStartup[W]
),它调用了你的[w]main
与通常的参数。和 NtProcessStartup[W]
当前实现使用指向 PEB
的指针从第一个(和单个)agrument。假设我们链接到当前的 nt.lib 实现。因为这是静态库 - 代码 NtProcessStartup[W]
将在您的 exe 中并且尚未更改。如果 Windows 不再在第一个参数中传递 PEB 的地址 - 所有与当前 nt.lib 链接的 exe 将在启动时崩溃。所以我认为这已经没有改变
关于c - rcx 是否总是指向进程入口点的 PEB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61684051/