64位Windows似乎使用rcx = r8 = &PEBrdx = 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/

10-12 04:17