首页 > 解决方案 > rcx 是否总是指向进程入口点的 PEB?

问题描述

64 位 Windows 似乎调用了一个 exe 的入口点,rcx = r8 = &PEB并且rdx = r9 = &entrypoint好像入口点被声明为entrypoint(PEB *peb, void *entry).

这些细节是否在任何地方指定,或者这些细节没有记录并且不可靠?

标签: cwindowswinapiassemblyx86-64

解决方案


从 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启动时会崩溃。所以我认为这已经没有改变


推荐阅读