rcx 是否总是指向进程入口点的 PEB?
Does rcx always point to the PEB at the process entrypoint?
64 位 Windows 似乎使用 rcx = r8 = &PEB
和 rdx = r9 = &entrypoint
调用 exe 的入口点,就好像入口点被声明为 entrypoint(PEB *peb, void *entry)
.
这些详细信息是在任何地方指定的,还是没有记录且不可依赖?
从 vista 开始 windows 使用一个参数调用 exe 入口点 - PEB 的地址
所以 exe 入口点的签名必须是 next
ULONG __stdcall ep(PEB* );
因为在 x64 中,第一个参数是通过 rcx 寄存器传递的 - 您可以在此处查看 PEB 的地址。另一个寄存器中的值是随机的。但我怎么说 - 这仅与 64 位无关。在所有 windows 版本中,第一个参数将是 PEB 的地址。
这没有记录,但我确信它非常可靠并且不会在新的 windows 版本中改变。
在wdk中存在nt.lib。这是静态(非导入)库——它为只能使用 ntdll.dll 导入的应用程序实现微型 crt(主引导执行应用程序,如 autochk.exe) 这个库实现了 exe (NtProcessStartup[W]
) 的入口点,它用通常的参数调用了你的 [w]main
。和 NtProcessStartup[W]
当前实现使用来自第一个(和单个)agrument 的指向 PEB
的指针。假设我们 link 当前 nt.lib 实施。因为这是静态库 - NtProcessStartup[W]
的代码将在您的 exe 中并且尚未更改。如果 windows 不再将在第一个参数中传递 PEB 的地址 - 当前 nt.lib[=35 link 的所有 exe =] 将在启动时崩溃。所以我认为这已经没有改变
64 位 Windows 似乎使用 rcx = r8 = &PEB
和 rdx = r9 = &entrypoint
调用 exe 的入口点,就好像入口点被声明为 entrypoint(PEB *peb, void *entry)
.
这些详细信息是在任何地方指定的,还是没有记录且不可依赖?
从 vista 开始 windows 使用一个参数调用 exe 入口点 - PEB 的地址 所以 exe 入口点的签名必须是 next
ULONG __stdcall ep(PEB* );
因为在 x64 中,第一个参数是通过 rcx 寄存器传递的 - 您可以在此处查看 PEB 的地址。另一个寄存器中的值是随机的。但我怎么说 - 这仅与 64 位无关。在所有 windows 版本中,第一个参数将是 PEB 的地址。
这没有记录,但我确信它非常可靠并且不会在新的 windows 版本中改变。
在wdk中存在nt.lib。这是静态(非导入)库——它为只能使用 ntdll.dll 导入的应用程序实现微型 crt(主引导执行应用程序,如 autochk.exe) 这个库实现了 exe (NtProcessStartup[W]
) 的入口点,它用通常的参数调用了你的 [w]main
。和 NtProcessStartup[W]
当前实现使用来自第一个(和单个)agrument 的指向 PEB
的指针。假设我们 link 当前 nt.lib 实施。因为这是静态库 - NtProcessStartup[W]
的代码将在您的 exe 中并且尚未更改。如果 windows 不再将在第一个参数中传递 PEB 的地址 - 当前 nt.lib[=35 link 的所有 exe =] 将在启动时崩溃。所以我认为这已经没有改变