Здравствуйте, Вумудщзук, Вы писали:
>>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя... >>А может всё-таки как-нибудь можно?
В>to my mind, нельзя... разве что в iddqd
В>а если вдруг и можно, то это будет одна лишь головная боль... экзешник может захотеть, скажем, почитать, чего-нть в самом себе и, ессессно, обломится.
Может быть тебя устроит то, что под NT-линейкой можно его переименовать.
Если всё же надо удалить, то посмотри в сторону MoveFileEx
Re: Как удалить с диска выполняющийся в данный момент .exe ?
Здравствуйте, RekoD, Вы писали:
RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
RD>А может всё-таки как-нибудь можно?
Удалить выполняющийся файл невозможно — за это отвечает драйвер файловой системы (и даже не диспетчер объектов)!
Re: Как удалить с диска выполняющийся в данный момент .exe ?
Здравствуйте, RekoD, Вы писали:
RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя... RD>А может всё-таки как-нибудь можно?
Через внешнее воздействие.
newbie
Re: Как удалить с диска выполняющийся в данный момент .exe ?
Здравствуйте, RekoD, Вы писали:
RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
RD>А может всё-таки как-нибудь можно?
Може я не правильно понял, но, Новый процесс, который выполняет батничек, который ждет завершения exe, а потом его валит и завершается
... << RSDN@Home 1.1.3 stable >>
Re: Как удалить с диска выполняющийся в данный момент .exe ?
Здравствуйте, RekoD, Вы писали:
RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
RD>А может всё-таки как-нибудь можно?
Если нежелательно создавать файлы (батник) то можно инжектировать код удаления в чужой процесс (explorer). Но без TerminateProcess или ExitProcess не обойтись.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Как удалить с диска выполняющийся в данный момент .ex
От:
Аноним
Дата:
26.08.05 18:11
Оценка:
Здравствуйте, sober, Вы писали:
S>Здравствуйте, RekoD, Вы писали:
RD>>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
RD>>А может всё-таки как-нибудь можно?
S>Удалить выполняющийся файл невозможно — за это отвечает драйвер файловой системы (и даже не диспетчер объектов)!
Можно, если файл запускался с новеловкского диска
Re[2]: Как удалить с диска выполняющийся в данный момент .ex
Здравствуйте, RekoD, Вы писали:
RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
RD>А может всё-таки как-нибудь можно?
создаешь remote thread в процессе для кот. хочешь удалить его image, а дальше как здесь
В общем, если хочешь сделать что-то серьезное, прийдется писать драйвер:
Который при загрузке будет перехватывать ф-цию удаления файла, т.е. вместо оригинальной ф-ции подставлять свою,
описание ее работы примерно обрисовал Жива.
Кстати — очень прикольно. На выходных обязательно попробую это сделать, если получится удалить exe во время исполнения — отпишусь.
Единственная проблема найти эту ф-цию, к-ю необходимо перехватить:
Может эта:
NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteFile(
IN POBJECT_ATTRIBUTES ObjectAttributes
);
Если кому интересно, в инете ищите по ключевым словам Native API или KeServiceDescriptorTable
Могу предложить вариант и посерьезнее перехвата Native API ф-ций
Re[2]: Как удалить с диска выполняющийся в данный момент .ex
От:
Аноним
Дата:
29.08.05 14:46
Оценка:
Здравствуйте, onyx2, Вы писали:
O>Мне кажется единственный реальный совет дал Жива:
O>В общем, если хочешь сделать что-то серьезное, прийдется писать драйвер:
O>Который при загрузке будет перехватывать ф-цию удаления файла, т.е. вместо оригинальной ф-ции подставлять свою, O>описание ее работы примерно обрисовал Жива.
O>Кстати — очень прикольно. На выходных обязательно попробую это сделать, если получится удалить exe во время исполнения — отпишусь. O>Единственная проблема найти эту ф-цию, к-ю необходимо перехватить: O>Может эта: O>
O>Если кому интересно, в инете ищите по ключевым словам Native API или KeServiceDescriptorTable O>Могу предложить вариант и посерьезнее перехвата Native API ф-ций
И что же это тебе даст? В любом случа система вернет статус, что файл открыт, и операция удаления не будет завершена!
Re[3]: Как удалить с диска выполняющийся в данный момент .ex
А>И что же это тебе даст? В любом случа система вернет статус, что файл открыт, и операция удаления не будет завершена!
Значит надо найти место где проверки уже прошли, а потом дальний jmp
Че в самом деле, люди в космос летают, а тут фигня такая
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Как удалить с диска выполняющийся в данный момент .ex
От:
Аноним
Дата:
29.08.05 16:21
Оценка:
Здравствуйте, Жива, Вы писали:
А>>И что же это тебе даст? В любом случа система вернет статус, что файл открыт, и операция удаления не будет завершена!
Ж>Значит надо найти место где проверки уже прошли, а потом дальний jmp Ж>Че в самом деле, люди в космос летают, а тут фигня такая
Знаешь, драйверами файловых систем никогда не занимался — времени нет, что в космос летают тоже понятно, а вот то что ты предлагаешь — это действительно фигня.
Представь себе что нада найти все эти проверки для каждого билда винды + для каждого сервис пака + не забыть пакеты обновления временных заплаток. Какова стабильность такого драйвера? Проше всетаки вежливо попровить Винду отпустить файл...не стандартно конечно. А для этого как раз нада разобраться с работой файловых драйверов и IFS и может даже с менеджером обьектов тоже, а не перехватывать NativeAPI которые из недокументированных скоро превратятся в самые частоиспользуемые для всяких хакерских нужд
Re[5]: Как удалить с диска выполняющийся в данный момент .ex
Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Как удалить с диска выполняющийся в данный момент .ex
Здравствуйте, Жива, Вы писали:
Ж>Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар!
Какая функция? У 9x и NT общего — только подсистема Win32, и то только снаружи.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[6]: Как удалить с диска выполняющийся в данный момент .ex
Здравствуйте, Жива, Вы писали:
Ж>Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар!
Отличный ответ только ни кому об этом не говори!!
А вообще я живу в softice. Еще раз говорю что драйверами файловых систем не занимался, но по логике вещей
ядро поле всех внутрених проверок, которые ты предлагаешь обойти сформирует IRP пакет который отправит вниз по стеку
в драйвер файловой системы, который и проделает операции удаления, если ошибаюсь поправте. Если файл будет открыт, то файловый драйвер вернет статус о невозможности завершить операцию. Да и потом часть файла может быть частью виртуальной памяти, насильно закрывая файл скорей всего введешь в заблуждение менеджер виртуальной памяти... так что хакерскими методами заниматься такими делами крайне не рекомендуется.
Re[7]: Как удалить с диска выполняющийся в данный момент .ex
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, Жива, Вы писали:
Ж>>Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар! GN>Какая функция? У 9x и NT общего — только подсистема Win32, и то только снаружи.
Sorry, забыл сказать: все, что я говорил справедливо только для NT систем.
Ни о каких 9х речь не идет.
А гадать нечего получится, не получится...
Надо попробовать.
По крайней мере у меня такое получалось с ZwTerminateProcess — я мог запретить убить любой процесс — антикиллер получился
Ну там конечно чуть-чуть другая ситуация.
А вообще надо попробовать, будет время обязательно попробую.
Здравствуйте, RekoD, Вы писали:
RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
RD>А может всё-таки как-нибудь можно?
Вот попробовал. И получилось.
Как я и говорил нужно было осуществить перехват определенной Native API функции,
но не ZwDeleteFile, а:
NTSTATUS ZwSetInformationFile(IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass);
Вот на такую ф-цию вы должны подменить оригинальный обработчик:
//===================================================================================
//обработчик ZwSetInformationFile
NTSTATUS TestDelZwSetInformationFile(IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN PVOID FileInformation,
IN ULONG Length,
IN FILE_INFORMATION_CLASS FileInformationClass)
{
NTSTATUS ntstatus = STATUS_SUCCESS;
if (FileInformationClass==FileDispositionInformation) {//delete
PFILE_OBJECT FileObject = NULL;
ObReferenceObjectByHandle( FileHandle, 0, NULL, KernelMode, &FileObject, NULL );
if ( FileObject ) {
#ifdef DBG
DbgPrint("Deleting %ws", FileObject->FileName.Buffer);
#endif//zero ImageSection - теперь можно будет удалить образ любого выполняющегося exe в системеif (FileObject->SectionObjectPointer->ImageSectionObject)
FileObject->SectionObjectPointer->ImageSectionObject= 0;
ObDereferenceObject(FileObject);
}
}
//calling original handler
ntstatus = RealZwSetInformationFile(FileHandle, IoStatusBlock, FileInformation, Length, FileInformationClass);
#ifdef DBG
if (FileInformationClass==FileDispositionInformation) //delete
//по умолчанию для выполняющегося exe - ntstatus = STATUS_CANNOT_DELETE
//в нашем случае для выполняющегося exe - ntstatus = STATUS_SUCCESS и
//файл exe успешно удаляется драйвером файл. системы
DbgPrint("TestDel, TestDelZwSetInformationFile status= 0x%08X", ntstatus);
#endif
return ntstatus;
}
Проверял под XP — работает. Можно удалить любой выполняющийся файл в системе.
Повторяю — это решение только для NT платформ.
Здравствуйте, onyx2, Вы писали:
O>Проверял под XP — работает.
Под SP2?
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[3]: Решение - удаление выполняющегося в дан. момент .exe!
Здравствуйте, gear nuke, Вы писали:
GN>Здравствуйте, onyx2, Вы писали:
O>>Проверял под XP — работает.
GN>Под SP2?
Только что проверил — работает.
Только там одна странность (только что выяснил) запускаешь exe из архива, он распаковывается запускается, а потом при закрытии программы (просто при закрытии, без всякого удаления exe-файла) происходит BSOD — думаю, что c SP2 это не связано
Здравствуйте, onyx2, Вы писали:
O> //zero ImageSection — теперь можно будет удалить образ любого выполняющегося exe в системе O> if (FileObject->SectionObjectPointer->ImageSectionObject) O> FileObject->SectionObjectPointer->ImageSectionObject= 0;
Это как минимум страшно озадачит фильтры в стеке, которые полагаются на подсчет ссылок. Неправильный подсчет ссылок = обычно взрыв рано или поздно (спустя неск часов например), если кто не в курсе. Или deadlock, неясно что лучше Хотя нет, когда фильтрам в стеке сносит крышу, проблемы могут быть самые разные...
Этот код явно также озадачит тот же FSD (или через его иное поведение Cc\Mm как-нибудь), который пользует указанное поле для сброса кэша в нужных местах вроде закрытия файла или тома, плюс искомые приключения (вижу пост ниже) даст обратная связь со стороны Мм и\или Сс на удаленный FO — кто-то же кодом выше сказал что можно удалять файло. Вполне может быть что его уже удалили — я так понимаю что у Вас IRP_MJ_CLOSE приходит до того как кто-то там у Вас перестал пользовать удаленный exe через ImageSectionObject? Если так, то после этого можно уже начинать потихоньку в белую простыню завертываться и в сторону кладбища начинать движение...
Тут бы можно было ссылочку накинуть, дабы FO не удалялся, но это замкнет круг — удаление не пройдет в RealZwSetInformationFile вероятно.
Короче, я бы не считал это решением совсем. Я бы лучше попросил обрисовать проблему автора топика. Скорее всего у него инсталлятор из-за этого требует перезагрузки или еще что — но такие вещи не решаются подобными методами.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[3]: Решение - удаление выполняющегося в дан. момент .exe!
Пробовать лень — но, по идее, должно хотя бы уменьшить вероятность глюков: восстанавливать ImageSectionObject после обращения к RealZwSetInformationFile.
Re[3]: Решение - удаление выполняющегося в дан. момент .exe!
Здравствуйте, Valery A. Boronin, Вы писали:
VAB>Короче, я бы не считал это решением совсем.
IMHO дело не в деталях, а в том, что решение вообще возможно относительно малой кровью. В SP2 залатали старую дыру, дававшую возможность удаления. Предложенный способ имеет недостатки, но их решения наверняка найдутся, нужно только копать ещё . На выходных надо будет потренироваться. Мне почему-то кажется, что можно даже из юзермода попробовать сделать всё страницы exe dirty (тогда менеджер памяти отобразит их на swap) перед удалением. Запускить юзермодные процессы из ядра тоже не было задумано by design, но это возможно.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Решение - удаление выполняющегося в дан. момент .exe!
Как то граждане сложно всё...
Мне кажется самым правильным способом является создание внешнего процесса которые просто чекает что файл занят а потом убивает его. А хакерские методы в этом случае не самое лучшее решение. Но прикольное
С уважением AWOD.
Re[2]: Решение - удаление выполняющегося в дан. момент .exe!