R0 CREW

Внедрить код из 32битного процесса в 64битный win7-win10

ru
#1

⁠Привет! Следует внедрить код из 32битного процесса в 64битный win7-win10. Как это можно решить?

#2

Добрый день, для этого скорее всего придётся использовать heaven gates, т.е. алгоритм примерно такой:

  • Вы не сможете загрузить 32-битный код в целевой 64-битный процесс, так как в нём нет 32-битной среды. Поэтому инжект возможен только 64 битного кода.
  1. Из 32-битного процесса переводим наш код в 64-битный режим используя jmp far с селектором 0x33 (гуглить heaven’s gate wow64)
  2. Уже из 64 битного кода находим ntdll через PEB и ищем в таблицах экспорта нужные для инжекта функции (ZwAllocateWirtualMemory, ZwWriteVirtualMemory, ZwCreateThreadEx, etc)
  3. Открывает 64-битный процесс в который собераемся инжектнутся, используя найденные функции выполняем инжект
  4. Возвращаемся в 32-битный режим используя jmp fword [reg], где reg указывает на 48 битный адресс который включает в себя селектор 0x23

Мне кажется я видел много примеров на github, но думаю большинство из них именно так работают

#3

Thanks

#4

Ошибаетесь, не отработает на 8.1 и 10.

#5

movl ну так будьте добры обоснуйте

#6

Всё отлично работает 7, 8, 8.1, 10 RS3

#7

А можно на сам код взглянуть? Просто в вин 10 есть такая штука как CFG, вот она по моему мнению не даст этого сделать…

#8

Нет, я не могу вам открыть код, но я поясню ситуацию. Предполагаю вы имеете ввиду то, что описал Йонеску в данной статье: Closing “Heaven’s Gate”. Йонеску конечно уважаемый спец, респект и всё такое, но то как он описал матерьял в статье похоже больше на страшилки для детей (хакиров таким не напугать). Кратко суть в том что Microsoft ввели улучшения OS через механизмы CFG:

  1. С 8.1 upd3 WOW64 процессы имеют 2 CFG карты для 32-бит и для 64-бит, причём карта 64-бит не покрывает 32-битное пространство и наоборот
  2. С 10 свободное место в 64-битном регионе 32-битного процесса закрыто для выделения памяти, т.е. забито специальными регионами которые нельзя использовать

Получается если вы запустите 64-битный код из 32-битного пространства, то этот код не пройдёт CFG валидацию. Но на хрена нам проходить валидацию? Никто не запрещает использовать системные сервисы Zw*, Nt* напрямую, для инжекта этого предостаточно так что пример который я привел абсолютно рабочий.

Другое дело если вы захотите полноценно работать с ntdll из другой 64-битной библиотеки (регистрировать калбеки, получать APC) лежащей в 32-битном регионе, то что вам мешает в ntdll распарсить PE, найти Load Config Directory и пропатчить указатель ntdll!_guard_check_icall_fptr который ссылается на колбек проверки CFG :slight_smile:

Heaven’s gate not dead mazafakas!

#9

https://github.com/georgenicolaou/HeavenInjector
А лучше почитай и разберись -> http://rce.co/knockin-on-heavens-gate-dynamic-processor-mode-switching/#Loading_an_External_64bit_Payload_DLL_HeavenInjector