Здравствуйте, Вумудщзук, Вы писали:
>>Если .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