Как удалить с диска выполняющийся в данный момент .exe ?
От: RekoD  
Дата: 24.08.05 14:18
Оценка:
Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...

А может всё-таки как-нибудь можно?
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: Вумудщзук Беларусь  
Дата: 24.08.05 14:25
Оценка:
>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...
>А может всё-таки как-нибудь можно?

to my mind, нельзя... разве что в iddqd

а если вдруг и можно, то это будет одна лишь головная боль... экзешник может захотеть, скажем, почитать, чего-нть в самом себе и, ессессно, обломится.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как удалить с диска выполняющийся в данный момент .ex
От: realloc Россия  
Дата: 24.08.05 15:17
Оценка:
Здравствуйте, Вумудщзук, Вы писали:

>>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...

>>А может всё-таки как-нибудь можно?

В>to my mind, нельзя... разве что в iddqd


В>а если вдруг и можно, то это будет одна лишь головная боль... экзешник может захотеть, скажем, почитать, чего-нть в самом себе и, ессессно, обломится.


Может быть тебя устроит то, что под NT-линейкой можно его переименовать.
Если всё же надо удалить, то посмотри в сторону MoveFileEx
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: sober  
Дата: 25.08.05 09:23
Оценка: +1
Здравствуйте, RekoD, Вы писали:

RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...


RD>А может всё-таки как-нибудь можно?


Удалить выполняющийся файл невозможно — за это отвечает драйвер файловой системы (и даже не диспетчер объектов)!
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: PVA  
Дата: 25.08.05 13:43
Оценка:
Здравствуйте, RekoD, Вы писали:

RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...

RD>А может всё-таки как-нибудь можно?
Через внешнее воздействие.
newbie
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: srggal Украина  
Дата: 25.08.05 14:19
Оценка:
Здравствуйте, RekoD, Вы писали:

RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...


RD>А может всё-таки как-нибудь можно?


Може я не правильно понял, но, Новый процесс, который выполняет батничек, который ждет завершения exe, а потом его валит и завершается
... << RSDN@Home 1.1.3 stable >>
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: gear nuke  
Дата: 26.08.05 02:41
Оценка:
Здравствуйте, 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
От: Жива  
Дата: 27.08.05 05:11
Оценка: -1
Как уже говарилось файлы удаляет драйвер файловой системы

Так вот вам нужно найти эту фукнцию удаления

вот пример

PublicFunctionDeleteFile
}
.....
Если файл используется
{
пошлем нафиг;
}
Если нет
{
PrivateFunctionDeleteFile();
}
.....
{

PrivateFunctionDeleteFile
{
//А здесь уже проверки не выполняются, именно эту функцию и ищи
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: pavel_turbin  
Дата: 27.08.05 07:16
Оценка:
Здравствуйте, RekoD, Вы писали:

RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...


RD>А может всё-таки как-нибудь можно?


создаешь remote thread в процессе для кот. хочешь удалить его image, а дальше как здесь

Win32 Self-Deletion Function
http://www.codeguru.com/Cpp/W-P/win32/article.php/c4533/
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: onyx2 Украина  
Дата: 29.08.05 14:34
Оценка:
Мне кажется единственный реальный совет дал Жива:

В общем, если хочешь сделать что-то серьезное, прийдется писать драйвер:

Который при загрузке будет перехватывать ф-цию удаления файла, т.е. вместо оригинальной ф-ции подставлять свою,
описание ее работы примерно обрисовал Жива.

Кстати — очень прикольно. На выходных обязательно попробую это сделать, если получится удалить exe во время исполнения — отпишусь.
Единственная проблема найти эту ф-цию, к-ю необходимо перехватить:
Может эта:
NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteFile(
    IN POBJECT_ATTRIBUTES ObjectAttributes
    );


Если кому интересно, в инете ищите по ключевым словам Native API или KeServiceDescriptorTable


Могу предложить вариант и посерьезнее перехвата Native API ф-ций
www.cubik.biz
Re[2]: Как удалить с диска выполняющийся в данный момент .ex
От: Аноним  
Дата: 29.08.05 14:46
Оценка:
Здравствуйте, onyx2, Вы писали:

O>Мне кажется единственный реальный совет дал Жива:


O>В общем, если хочешь сделать что-то серьезное, прийдется писать драйвер:


O>Который при загрузке будет перехватывать ф-цию удаления файла, т.е. вместо оригинальной ф-ции подставлять свою,

O>описание ее работы примерно обрисовал Жива.

O>Кстати — очень прикольно. На выходных обязательно попробую это сделать, если получится удалить exe во время исполнения — отпишусь.

O>Единственная проблема найти эту ф-цию, к-ю необходимо перехватить:
O>Может эта:
O>
O>NTSYSAPI
O>NTSTATUS
O>NTAPI
O>ZwDeleteFile(
O>    IN POBJECT_ATTRIBUTES ObjectAttributes
O>    );
O>


O>Если кому интересно, в инете ищите по ключевым словам Native API или KeServiceDescriptorTable

O>Могу предложить вариант и посерьезнее перехвата Native API ф-ций

И что же это тебе даст? В любом случа система вернет статус, что файл открыт, и операция удаления не будет завершена!
Re[3]: Как удалить с диска выполняющийся в данный момент .ex
От: Жива  
Дата: 29.08.05 16:02
Оценка:
А>И что же это тебе даст? В любом случа система вернет статус, что файл открыт, и операция удаления не будет завершена!

Значит надо найти место где проверки уже прошли, а потом дальний jmp
Че в самом деле, люди в космос летают, а тут фигня такая
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Как удалить с диска выполняющийся в данный момент .ex
От: Аноним  
Дата: 29.08.05 16:21
Оценка:
Здравствуйте, Жива, Вы писали:

А>>И что же это тебе даст? В любом случа система вернет статус, что файл открыт, и операция удаления не будет завершена!


Ж>Значит надо найти место где проверки уже прошли, а потом дальний jmp

Ж>Че в самом деле, люди в космос летают, а тут фигня такая

Знаешь, драйверами файловых систем никогда не занимался — времени нет, что в космос летают тоже понятно, а вот то что ты предлагаешь — это действительно фигня.
Представь себе что нада найти все эти проверки для каждого билда винды + для каждого сервис пака + не забыть пакеты обновления временных заплаток. Какова стабильность такого драйвера? Проше всетаки вежливо попровить Винду отпустить файл...не стандартно конечно. А для этого как раз нада разобраться с работой файловых драйверов и IFS и может даже с менеджером обьектов тоже, а не перехватывать NativeAPI которые из недокументированных скоро превратятся в самые частоиспользуемые для всяких хакерских нужд
Re[5]: Как удалить с диска выполняющийся в данный момент .ex
От: Жива  
Дата: 30.08.05 06:01
Оценка:
Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Как удалить с диска выполняющийся в данный момент .ex
От: gear nuke  
Дата: 30.08.05 07:27
Оценка:
Здравствуйте, Жива, Вы писали:

Ж>Не факт что эта функция была плохо отлаженна еще на винде 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
От: Аноним  
Дата: 30.08.05 08:03
Оценка: +2
Здравствуйте, Жива, Вы писали:

Ж>Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар!


Отличный ответ только ни кому об этом не говори!!
А вообще я живу в softice. Еще раз говорю что драйверами файловых систем не занимался, но по логике вещей
ядро поле всех внутрених проверок, которые ты предлагаешь обойти сформирует IRP пакет который отправит вниз по стеку
в драйвер файловой системы, который и проделает операции удаления, если ошибаюсь поправте. Если файл будет открыт, то файловый драйвер вернет статус о невозможности завершить операцию. Да и потом часть файла может быть частью виртуальной памяти, насильно закрывая файл скорей всего введешь в заблуждение менеджер виртуальной памяти... так что хакерскими методами заниматься такими делами крайне не рекомендуется.
Re[7]: Как удалить с диска выполняющийся в данный момент .ex
От: onyx2 Украина  
Дата: 30.08.05 09:53
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, Жива, Вы писали:


Ж>>Не факт что эта функция была плохо отлаженна еще на винде 95, и раотает по сей день без изменений, а узнать ответы на эти вопросы ты сможеш если запосешься терпением и софтайсом, но когда ты это сделаеш это будет рар!

GN>Какая функция? У 9x и NT общего — только подсистема Win32, и то только снаружи.

Sorry, забыл сказать: все, что я говорил справедливо только для NT систем.
Ни о каких 9х речь не идет.

А гадать нечего получится, не получится...
Надо попробовать.

По крайней мере у меня такое получалось с ZwTerminateProcess — я мог запретить убить любой процесс — антикиллер получился
Ну там конечно чуть-чуть другая ситуация.
А вообще надо попробовать, будет время обязательно попробую.
www.cubik.biz
Re: Решение - удаление выполняющегося в дан. момент .exe!
От: onyx2 Украина  
Дата: 12.09.05 11:18
Оценка: 21 (2)
Здравствуйте, 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 платформ.
www.cubik.biz
Re[2]: Решение - удаление выполняющегося в дан. момент .exe!
От: gear nuke  
Дата: 12.09.05 12:38
Оценка:
Здравствуйте, 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!
От: onyx2 Украина  
Дата: 12.09.05 13:18
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Здравствуйте, onyx2, Вы писали:


O>>Проверял под XP — работает.


GN>Под SP2?


Только что проверил — работает.

Только там одна странность (только что выяснил) запускаешь exe из архива, он распаковывается запускается, а потом при закрытии программы (просто при закрытии, без всякого удаления exe-файла) происходит BSOD — думаю, что c SP2 это не связано

Потом попробую выяснить, что там не так...
www.cubik.biz
Re[2]: Решение - удаление выполняющегося в дан. момент .exe!
От: Valery A. Boronin Россия linkedin.com/in/boronin
Дата: 13.09.05 12:27
Оценка: +1
Здравствуйте, 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!
От: sober  
Дата: 13.09.05 12:37
Оценка:
Здравствуйте, Valery A. Boronin,

Пробовать лень — но, по идее, должно хотя бы уменьшить вероятность глюков: восстанавливать ImageSectionObject после обращения к RealZwSetInformationFile.
Re[3]: Решение - удаление выполняющегося в дан. момент .exe!
От: gear nuke  
Дата: 13.09.05 13:18
Оценка:
Здравствуйте, 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!
От: onyx2 Украина  
Дата: 14.09.05 07:35
Оценка: 21 (2)
Там был бок при удалении директорий.
Делаем доп. проверку. И все ок


if (FileObject->SectionObjectPointer && FileObject->SectionObjectPointer->ImageSectionObject)
                FileObject->SectionObjectPointer->ImageSectionObject= 0;


Начальник меня постоянно ругает, а я все туплю насчет проверок указателей.


DbgPrint естественно в конце имени файла чушь выводит, потому что строка не заканч. 0. Мне лень писась больше

//===================================================================================
//обработчик 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 && 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;        
}



Работает все ок
SP2, не SP2 без — разницы

Явно такая штука нужна не для добрых дел

Для недобрых дел вполне подойдет
www.cubik.biz
Re: Как удалить с диска выполняющийся в данный момент .exe ?
От: ironwit Украина  
Дата: 15.09.05 05:04
Оценка:
Здравствуйте, RekoD, Вы писали:

RD>Если .exe запущен, то доступ к файлу на диске блокируется и удалить его нельзя...


а если дождатся окончания выполнения, для этого повесить как нить таймер и потом убить? а перед этим сделать move куда нить чтобы никто не нашел
... << RSDN@Home 1.2.0 alpha rev. 616>>
играет: Mike Shinoda — [Depeche Mode: Remixes 81-04 #37] Enjoy The Silence (Reinterpret
Я не умею быть злым, и не хочу быть добрым.
Re[4]: Решение - удаление выполняющегося в дан. момент .exe!
От: awod Россия  
Дата: 06.10.05 08:28
Оценка:
Как то граждане сложно всё...
Мне кажется самым правильным способом является создание внешнего процесса которые просто чекает что файл занят а потом убивает его. А хакерские методы в этом случае не самое лучшее решение. Но прикольное
С уважением AWOD.
Re[2]: Решение - удаление выполняющегося в дан. момент .exe!
От: bizon  
Дата: 10.10.05 14:53
Оценка:
Здается мне, что не работает без соответствующих привилегий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.