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