В общем есть такой код, который получает контекст в коде под WoW64 в двух вариациях

первая функция - обычный вызов юзермодной Api, получает контекст в формате 32 бит
вторая функция переходит через Heavens Gate в режим W64onWoW64 и получает контекст того же самого потока через прямой сискол уже в формате 64 бит
После вызовов получаем такие результаты для замороженного (приостановленного процесса)
Так для справки - эксперименты проходят в контексте RunPE через сисколы под WOW64
С получением контекста все ок
Но при попытке установить контекст (NtSetCоntextThread) из режима W64onWoW64 и последующим стартом замороженного процесса на старте в контекст укладывается только RDX -> EBX, а вот RCX -> EAX не устанавливается
То есть сразу после записи контекста еще до разморозки процесса, то что записывается в RDX автоматом переносится в EBX (там содержится адрес PEB и загрузчик начинает плясать оттуда и настраивает процесс, с этой частью все ок), а вот то, что записывается в RCX в EAX не переносится, там остается старое значение EntryPoint и после разморозки процесса он стартует не там где надо, соответственно процесс настроен так, что бы работать по новой базе и EP, но точка входа вызывается не та, если на этом этапе вручную в отладчике указать нормальную точку входа в EAX, то процесс стартует и работает без нареканий
Если контекст устанавливать просто через SetThreadContext, без перехода 86->64 через ХевинГейт, то в таком случае установка контекста работает нормально(Еще бы, конечно работает, дергаем юзермод апишки)

первая функция - обычный вызов юзермодной Api, получает контекст в формате 32 бит
вторая функция переходит через Heavens Gate в режим W64onWoW64 и получает контекст того же самого потока через прямой сискол уже в формате 64 бит
После вызовов получаем такие результаты для замороженного (приостановленного процесса)
Так для справки - эксперименты проходят в контексте RunPE через сисколы под WOW64
С получением контекста все ок
Но при попытке установить контекст (NtSetCоntextThread) из режима W64onWoW64 и последующим стартом замороженного процесса на старте в контекст укладывается только RDX -> EBX, а вот RCX -> EAX не устанавливается
То есть сразу после записи контекста еще до разморозки процесса, то что записывается в RDX автоматом переносится в EBX (там содержится адрес PEB и загрузчик начинает плясать оттуда и настраивает процесс, с этой частью все ок), а вот то, что записывается в RCX в EAX не переносится, там остается старое значение EntryPoint и после разморозки процесса он стартует не там где надо, соответственно процесс настроен так, что бы работать по новой базе и EP, но точка входа вызывается не та, если на этом этапе вручную в отладчике указать нормальную точку входа в EAX, то процесс стартует и работает без нареканий
Если контекст устанавливать просто через SetThreadContext, без перехода 86->64 через ХевинГейт, то в таком случае установка контекста работает нормально(Еще бы, конечно работает, дергаем юзермод апишки)
Последнее редактирование: