Помогите пожалуйста разобраться! При загрузке нового процесса загрузчик проецирует исполняемый файл в адресное пространство нового процесса. Может ли быть такая ситуация что при недостатке физической памяти часть кода программы будет выгружена не в файл подкачки (например его нету или он мал), а в никуда (или в сам файл) и потом считана с исполняемого файла на диске? Если такое возможно, то выходит что разные исхищрения для удаления исполняемого в момент исполнения pe файла небезопасны для этого процесса?
AFAIK, выгружаться исполняемый файл будет как раз сам в себя - независимо от того, есть файл подкачки или нет. Нет, не так. Изменённые страницы, конечно, винда должна будет выгрузить в файл подкачки... А не изменённым страницам выгружаться на диск незачем - просто "потерять" их, а при необходимости загрузить из исполняемого файла. Есть чо почитать?)
Novi4ek Как это сделать (удалить выполняющийся ехе-шник)? Желательно из него-же самого. Под XP и выше?
Если нет доступа к ядру ничего не получится, помню в ранних версиях был баг с манипуляциями NtClose, но потом его закрыли. Инжектишся куданибудь в чужой процесс, а свой завершаешь, а затем можно и удалить файл.
Охх. (мысли вслух). При загрузке программы файл пдокачки не используется. страницы выгружаются туда же, откуда были считаны, точнее говоря - страницы просто удаляются из физической памяти. по требованию снова грузятся из файла. другое дело - если они модифицированы. тогда они выгружаются в файл подкачки. см мою статью про списки страниц зы. в драйверах совсем подругому. там проекции не используются, а файл просто считывается в память. поэтому выгружается он весь в файл подкачки и бинарник на диске не нужен и легко удаляется при желании. а все методы удаления испольняемого файла в предыдущих версиях винды основывались на том, что управление у файла отнимается и больше он уже не трогается, поэтому и удаляется.
Clerk Great Хорошо. А создать юзермодный процесс не имеющий под собой файла каким-нибудь образом можно? Имеется ввиду стандартный способ, тк дыру закрыть могут.
Clerk Образ именно запускаемого файла? Или любой файл сойдет? Скажем, создаем суспендед (или как там) процесс из файла 'readme.txt'.. Подменяем код и запускаем. Или файл с одним MZ-PE хедером и дальше текст какой-нибудь, чтоб в глаза не бросалось.. Или своп. Он-то точно есть..
не получится помоему же так сделать - ZwCreateSection свалится с SEC_IMAGE. а от CreateSuspended потом зависит тока вызов финальный ZwResumeThread() или я тебя не понял..)
Great Так, хорошо. А правильно оформленый хидер на пустой РЕ-шник? Только чтоб процесс создать. Скажем так: MZ хидер | левый текст (например ридми) | PE хидер | продолжение ридми. Все необязательные поля заполнить и хидеры оформить текстово для запутывания.
Ну раз пошла такая пьянка, что мешает создать такой файл уже в режиме рантайма где-нито в TEMP-папке, запустить, проинжектиться в его процесс, и потереть исходный екзешник?
Секцию создаёт MiCreateImageFileMap(), там проверок куча, если ей такого формата файл скормить, она ругаться будет. А расширение имени процесса может быть любым.
DEEP сильно много подозрительных операций требующих покрытия. Кроме того изменения в фс могут мониториться, а в папке темп и подавно. Clerk Great Во первых то что на виду обычно не подозрительно. Во вторых в 'MZ' (интересно - меняешь на 'ZM' и прога воспринимается как чисто досовая, написал в начале 'ZMEI " все ОК пашет дос часть) система читает только смещение по 3С. Все остальное заполняем копиврайтом от программера 'MZ0rA'. И файл должен быть броский, наглый - 'readme.1st', например. Только-что попробовал в начале живого РЕ-шника вписать строку 'MZOR Copyright(c) 1532 ' - все пашет ОК. ЗЫ забыл написать - XPSP2. Впрочем, подозревю, в висте та-же петрушка.
логично, из DOS хидера только чекается сигнатура и берется e_lfanew. Автор - поясни, что ты хочешь. Вопрос в начале топика был другой. Хочешь создать неприметный исполняемый файл, выдавая его за текстовый? Ну так и скажи тогда)
Great Нет, идея у меня другая. Исполняемый файл представляет собой не один большой модуль, а кучу маленьких не зависящих от своего положения в исходном большом ехе-шнике модульков спец формата плюс небольшой код для их связки. В процессе исполнения модульки время от времени случайным образом меняют свое положение и пересвязываются. И время от времени новые сборки должны записываться в исходный файл. Топикстартер задал вопрос из которого коссвено следовало, что он знает как удалить исполняемый файл во время исполнения, что близко к его перезаписи. Вот я и решил развить тему, узнав какие вообще варианты для перезаписи ехе-шником самого себя существуют.
Интересно, конечно, но я смысла пока не вижу. Это получается тоже самое, что и подгружать длл-ки и вызывать их функции, только заморочки с форматом...