Всегда ли rcx указывает на PEB в точке входа процесса? - PullRequest
4 голосов
/ 08 мая 2020

64-битный Windows, кажется, вызывает точку входа exe с rcx = r8 = &PEB и rdx = r9 = &entrypoint, как если бы точка входа была объявлена ​​entrypoint(PEB *peb, void *entry).

Указаны ли эти детали где-нибудь или они недокументированы и на что нельзя положиться?

1 Ответ

3 голосов
/ 08 мая 2020

начинать с перспективы windows вызывать точку входа exe с одним параметром - адресом PEB , поэтому подпись точки входа exe должна быть следующей

ULONG __stdcall ep(PEB* ); 

, потому что в x64 первый параметр передается через регистр rcx - здесь вы видите адрес PEB . значения в других регистрах случайны. но как я говорю - это относится не только к 64-битной. во всех версиях windows в первом параметре будет адрес PEB .

это не задокументировано, но я уверен, что это очень надежно и не будет изменено в новых версиях windows.

в wdk существует nt.lib . это stati c (не импортная) библиотека, которая реализует крошечный crt для приложений, которые могут использовать только ntdll.dll import (приложения для выполнения основной загрузки, например autochk.exe ) это Библиотека реализует точку входа exe (NtProcessStartup[W]), которая затем называется вашим [w]main с обычными параметрами. и NtProcessStartup[W] текущая реализация использует указатель на PEB из первого (и единственного) агрумента. Предположим, мы связываемся с текущей реализацией nt.lib . потому что это stati c lib - код NtProcessStartup[W] будет внутри вашего exe и уже не изменен. если windows больше не будет передавать адрес PEB в первом аргументе - все exe, которые связаны с текущим nt.lib , будут срабатывать sh при запуске. поэтому я думаю, что это уже нельзя изменить

...