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...
Пока на собственное сообщение не было ответов, его можно удалить.