Привет всем, есть масссив байт, считываю в него содержимое файла C:\Windows\notepad.exe, теперь хочу из этого массива байт породить процесс, т.е. запустить процесс из памяти. Подскажите как это сделать?
Aspire Если память мне не изменяет, в той статье запускающий стаб копирует себя в другое место, освобождает на своем месте память, куда и помещает запускаемый файл, т.е. по адресу 00400000
MSoft Шутка но с долей правды, как без NtCreateProcess запустить его. Например процесс который должен "запустить из памяти" имеет имя run.exe, как сделать notepad.exe - в юзермоде решений я не вижу, так как имена эти сохраняются при передаче имени секции в тот сервис. Хотя вопрос наверно не об этом, а о том как настроить релоки, подгрузить всё что в импорте и пр., без обращения к файлу на диске, а использую образ в памяти. В таком случае решения есть, это перехват NtCreateFile для того, чтобы возвратить иной от ошибки статус, NtCreateSection чтобы забить ноль, на место хэндла файла, NtMapViewOfSection чтобы подставить свою проекцию и пр. Или создать секцию в директории KnownDlls\, в принципе нужно подумать. Если не устраивают подобные ухищрения, то написать загрузчик. Кстати можно попробовать использовать хэндл секции который является одним из параметров для NtCreateProcess. Можно клонировать адресное пространство, можно попробовать поставить хэндл не файлоовой секции(не знаю в этом случае что произойдёт).
EvilsInterrupt нет, это к тому что смешного мало и вообще какая вам какая разница - вам же легче работать будет)
K10 дада он поидее должен быть SEC_IMAGE, когдато уже сморел в ту сторону Код (Text): if (!((PSECTION)SectionToMap)->u.Flags.Image) { ... return STATUS_SECTION_NOT_IMAGE;
Aspire Кто сказал, что в целевом АП будут те же виртуальные адреса? Требуется ведь создать процесс, а не поток. Если бы поток тогда вполне сошел бы и пе лоадер. А так можно попробовать сделать объект Section которая будет отображаьтб не файл на диске, а файл подкачки а потом NtCreateProcess и передать туда этот Section
Можно как вариант помещать код загрузчика на свободные адреса изначально, т.е. линковать с нужной нам базой. Так получается и необходимости писать шеллкод нет и не требуется обрабатывать релоки, ну и весь остальной геммор с "перелетами" на другие адреса тоже отпадет.
Нельзя. Т.к. многие АВ выдают HEUR/Mal. по одной только базе. База нужна стандартная, иначе не спасет не один криптор
int2e Ну о палевности же речи не шло, а говорили "как запустить из памяти". По поводу АВ, раз уж речь зашла... здравый смысл подсказывает что вызов NtCreateProcess, учитывая что ей передается уже расшифрованный бинарник, будет провоцировать громкий аверский крик в 100% случаев. верно?
процесс не запускается. Вот на этом условии завершается праздник жизни: Код (Text): if( !poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress ) {