информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
а исходничек можно ? :-) 17.02.06 02:47  Число просмотров: 2170
Автор: Tamas Статус: Member
<"чистая" ссылка>
<programming>
[C++] Delete File on reboot XP 15.02.06 02:37  
Автор: Tamas Статус: Member
<"чистая" ссылка>
вобщём задача такая нужно удалить фаил который используется другим процессом
сответствино сделать это можно при перезагруске... вот только вопрос как ?
есть стандартный метод MoveFileEx MOVEFILE_DELAY_UNTIL_REBOOT
но он мне не подходит :-( у кого нибудь есть есть ещё идеи ?

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

не предлагать... это тоже самое что и MoveFileEx MOVEFILE_DELAY_UNTIL_REBOOT

PS к сожелению грохнуть процес который его использует нельзя :-(((
[C++] Недостаточно информации 15.02.06 12:18  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> вобщём задача такая нужно удалить фаил который используется
> другим процессом
> сответствино сделать это можно при перезагруске... вот
> только вопрос как ?
> есть стандартный метод MoveFileEx
> MOVEFILE_DELAY_UNTIL_REBOOT
> но он мне не подходит :-( у кого нибудь есть есть ещё идеи
> ?

Если бы прояснить почему не подходит такой метод, то искать решение было бы проще.

> PS к сожелению грохнуть процес который его использует
> нельзя :-(((

При ОЧЕНЬ большом желании грохнуть файл можно и без перезагрузки. Например, прямым доступом к диску или закрыть хендл на этот файл в процессе, который его держит (и то и то делается легко в третьем кольце, нужны лишь привилегии). Оба способа могут привести к нестабильной работе этого процесса (а первый может завалить еще и винду или файловую систему, ибо метаданные закешированы, а при прямом доступе к диску нарушится консистентность кеша). Можно также внедриться в процесс, который держит файл и, если при открытии был указан GENERIC_WRITE, GENERIC_ALL или нечто подобное, то удалить этот файл через хендл этого же процесса.

В нулевом кольце пространство для маневра больше: во-первых можно сделать все вышеперечисленное (только внедряться никуда не нужно), во-вторых можно на лету заменить объект на который указывает открытый хендл на новый (свежесозданный файл), а старый удалить

Это первое что пришло в голову на тему удаления отрытого файла без перезагрузки.

С перезагрузкой все еще легче.
1) Совершенно непонятно почему нельзя использовать MoveFileEx. Удаление происходит в первом созданном пользовательском процессе - smss.exe (Session Manager). В этот момент нет ни одного открытого хендла на файлы.

2) Удаление можно произвести в специальном драйвере, написанном специально для этого. Удаление произойдет до создания первого пользовательского процесса. В этот момент также нет ни одного открытого хендла на файлы.

3) Можно написать Native приложение, которое будет удалять файл и прописать его в BootExecute. Удаление произойдет в пользовательском процессе, запущенном из smss (в зависимости от номера строки в значении BootExecute это будет второй, третий и т.д. процесс). Открытых хендлов все еще нет и удаление чего угодно совершенно безопасно.

4) Можно написать системный сервис пользовательского режима (или использовать специальную заворачивалку обычных exe-шников в сервисы). Удаление произойдет после создания кучи пользовательских процессов, но до логина. Будет открыто уже до фига файлов и не все получится удалить

5) Ну и последний - прописаться в автостарт к пользователю. Удаление после логина - самый примитивный и ограниченный в возможностях способ.
1 большое спосибо за грамотный ответ 17.02.06 02:43  
Автор: Tamas Статус: Member
<"чистая" ссылка>
> > вобщём задача такая нужно удалить фаил который
> используется
> > другим процессом
> > сответствино сделать это можно при перезагруске... вот
> > только вопрос как ?
> > есть стандартный метод MoveFileEx
> > MOVEFILE_DELAY_UNTIL_REBOOT
> > но он мне не подходит :-( у кого нибудь есть есть ещё
> идеи
> > ?
>
> Если бы прояснить почему не подходит такой метод, то искать
> решение было бы проще.
>
> > PS к сожелению грохнуть процес который его использует
> > нельзя :-(((
>
> При ОЧЕНЬ большом желании грохнуть файл можно и без
> перезагрузки. Например, прямым доступом к диску или закрыть
> хендл на этот файл в процессе, который его держит (и то и
> то делается легко в третьем кольце, нужны лишь привилегии).
> Оба способа могут привести к нестабильной работе этого
> процесса (а первый может завалить еще и винду или файловую
> систему, ибо метаданные закешированы, а при прямом доступе
> к диску нарушится консистентность кеша). Можно также
> внедриться в процесс, который держит файл и, если при
> открытии был указан GENERIC_WRITE, GENERIC_ALL или нечто
> подобное, то удалить этот файл через хендл этого же
> процесса.
>
> В нулевом кольце пространство для маневра больше: во-первых
> можно сделать все вышеперечисленное (только внедряться
> никуда не нужно), во-вторых можно на лету заменить объект
> на который указывает открытый хендл на новый
> (свежесозданный файл), а старый удалить
>
> Это первое что пришло в голову на тему удаления отрытого
> файла без перезагрузки.
>
> С перезагрузкой все еще легче.
> 1) Совершенно непонятно почему нельзя использовать
> MoveFileEx. Удаление происходит в первом созданном
> пользовательском процессе - smss.exe (Session Manager). В
> этот момент нет ни одного открытого хендла на файлы.
>
> 2) Удаление можно произвести в специальном драйвере,
> написанном специально для этого. Удаление произойдет до
> создания первого пользовательского процесса. В этот момент
> также нет ни одного открытого хендла на файлы.
>
> 3) Можно написать Native приложение, которое будет удалять
> файл и прописать его в BootExecute. Удаление произойдет в
> пользовательском процессе, запущенном из smss (в
> зависимости от номера строки в значении BootExecute это
> будет второй, третий и т.д. процесс). Открытых хендлов все
> еще нет и удаление чего угодно совершенно безопасно.
>
> 4) Можно написать системный сервис пользовательского режима
> (или использовать специальную заворачивалку обычных
> exe-шников в сервисы). Удаление произойдет после создания
> кучи пользовательских процессов, но до логина. Будет
> открыто уже до фига файлов и не все получится удалить
>
> 5) Ну и последний - прописаться в автостарт к пользователю.
> Удаление после логина - самый примитивный и ограниченный в
> возможностях способ.


1 большое спосибо за грамотный ответ

1 MoveFileEx нельзя испольховать потому что он всеголиш добовляет записть в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations
а этот ключь реестра контролирует тодже процес что и фаил который надо грохнуть

2 в недрится в процесс который его контролирует тоже нельзя
потомушчто он устанавливает драйвер перехвата api и контролирует OpenProcess и OpenThread
сответствино и у бить проццес нельзя не зависимо от привелегий

3 процес который его контралирует евляется сервисом... ивыполняется от имини SYSTEM

4 я согласен примой доступ к диску это уж слишком грубо

так что похоже придётся посать драйвер :-(

PS речь кстати идёт о сервисе ZoneAlarm :-)

Тогда остается либо драйвер либо native-приложение 17.02.06 12:00  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> 1 MoveFileEx нельзя испольховать потому что он всеголиш
> добовляет записть в
> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
> Manager\PendingFileRenameOperations
> а этот ключь реестра контролирует тодже процес что и фаил
> который надо грохнуть

А как контроллирует?
Можно ли обратиться к этому ключу например через "\\.\GLOBALROOT\REGISTRY\MACHINE\System\ControlSet001\Session Manager"?

Или так:

"\\.\GLOBALROOT\??\GLOBALROOT\REGISTRY\MACHINE\System\ControlSet001\Session Manager"

Или создать в директории объектов симлинк на \REGISTRY и обратиться через свой симлинк. Большинство программ, контроллирующих доступ к файлам/ключам по имени очень плохо работают с симлинками.

> 2 в недрится в процесс который его контролирует тоже нельзя
> потомушчто он устанавливает драйвер перехвата api и
> контролирует OpenProcess и OpenThread
> сответствино и у бить проццес нельзя не зависимо от
> привелегий

Если так, то да.

> так что похоже придётся посать драйвер :-(

Можно еще и native-приложение для BootExecute

> PS речь кстати идёт о сервисе ZoneAlarm :-)
Обратится можно :-) 17.02.06 18:54  
Автор: Tamas Статус: Member
<"чистая" ссылка>
> > 1 MoveFileEx нельзя испольховать потому что он
> всеголиш
> > добовляет записть в
> >
> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session
> > Manager\PendingFileRenameOperations
> > а этот ключь реестра контролирует тодже процес что и
> фаил
> > который надо грохнуть
>
> А как контроллирует?
> Можно ли обратиться к этому ключу например через
> "\\.\GLOBALROOT\REGISTRY\MACHINE\System\ControlSet001\Sessi
> on Manager"?
>
> Или так:
>
> "\\.\GLOBALROOT\??\GLOBALROOT\REGISTRY\MACHINE\System\Contr
> olSet001\Session Manager"
>

Обратится можно :-)

сиё чюдо считавает текушие значение параметра
с определённым интервалом... примерно 500 ms
и если он изменяется в поредённою строну меняет его обратно


> Или создать в директории объектов симлинк на \REGISTRY и
> обратиться через свой симлинк. Большинство программ,
> контроллирующих доступ к файлам/ключам по имени очень плохо
> работают с симлинками.
>
> > 2 в недрится в процесс который его контролирует тоже
> нельзя
> > потомушчто он устанавливает драйвер перехвата api
> и
> > контролирует OpenProcess и OpenThread
> > сответствино и у бить проццес нельзя не зависимо от
> > привелегий
>
> Если так, то да.
>
> > так что похоже придётся посать драйвер :-(
>
> Можно еще и native-приложение для BootExecute
>
> > PS речь кстати идёт о сервисе ZoneAlarm :-)
Иногда замечал одну фишку в виндах, которая мне напомнила о... 15.02.06 11:41  
Автор: DPP <Dmitry P. Pimenov> Статус: The Elderman
<"чистая" ссылка>
> вобщём задача такая нужно удалить фаил который используется
> другим процессом
> сответствино сделать это можно при перезагруске... вот
> только вопрос как ?

Иногда замечал одну фишку в виндах, которая мне напомнила о старых добрых операционках.
Фишка в том, что команда удаления завершается успешно, но файл не удаляется. Последующие команды на удаление завершаются с ошибкой. Файл удаляется автоматически, как только заканчивают работу с ним все программы. Пока файл остается в состоянии "помечен на удаление" другие проги не могут получить к нему доступ чтоб что-то сделать.
Эта фишка работает не всегда. Естественно возникает вопрос: "Не глюк ли это у меня и действительно ли это так" и "почему это работает не всегда"?

Если воспользоваться этой фичей, то можно просто попытаться удалить файл. Прога, работающая с ним будет продолжать работать нормально. Все процессы завершаться при завершении работы системы (перезагрузке). Файл должен автоматом удалиться на этапе остановки системы.
не на этапе остановки а на этапе загруски и фича эта... 17.02.06 03:12  
Автор: Tamas Статус: Member
<"чистая" ссылка>
> Если воспользоваться этой фичей, то можно просто попытаться
> удалить файл. Прога, работающая с ним будет продолжать
> работать нормально. Все процессы завершаться при завершении
> работы системы (перезагрузке). Файл должен автоматом
> удалиться на этапе остановки системы.

не на этапе остановки а на этапе загруски и фича эта называется MoveFileEx
Нет. Я тоже сталкивался с этим. 17.02.06 11:54  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> не на этапе остановки а на этапе загруски и фича эта
> называется MoveFileEx

И это не MoveFileEx
Операция удаления заканчивается (кажется с ошибкой), после чего удаляемый файл нормально энумерируется в каталоге, но при попытке открытия говорит, что такого файла уже нет. Через некоторое время (без всяких перезагрузок) файл пропадает (перестает энумерироваться)
Это movefileex с флагом movefile_write_through 17.02.06 18:50  
Автор: Tamas Статус: Member
<"чистая" ссылка>
> > не на этапе остановки а на этапе загруски и фича эта
> > называется MoveFileEx
>
> И это не MoveFileEx
> Операция удаления заканчивается (кажется с ошибкой), после
> чего удаляемый файл нормально энумерируется в каталоге, но
> при попытке открытия говорит, что такого файла уже нет.
> Через некоторое время (без всяких перезагрузок) файл
> пропадает (перестает энумерироваться)


Это MoveFileEx с флагом MOVEFILE_WRITE_THROUGH
хотя я могу ошибатся
Нечто такое наблюдается если открыть файл с file_flag_dele_on_close 17.02.06 13:55  
Автор: Killer{R} <Dmitry> Статус: Elderman
<"чистая" ссылка>
А вообще это имхо происки того что для удаления файлов винда как ни странно юзает ZwSetInformationFile а не ZwDeleteFile
а можно пример на WinApi ? 17.02.06 02:44  
Автор: Tamas Статус: Member
<"чистая" ссылка>
моя qrd 15.02.06 11:08  
Автор: Killer{R} <Dmitry> Статус: Elderman
Отредактировано 15.02.06 11:08  Количество правок: 1
<"чистая" ссылка>
ставит свой драйвер которым и удаляет. если указать ключик /r

http://www.killprog.com/qrd.zip
а исходничек можно ? :-) 17.02.06 02:47  
Автор: Tamas Статус: Member
<"чистая" ссылка>
[C++] Удалить или незаметно удалить? 15.02.06 05:01  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Если просто удалить, то войди в сэйв мод и потри, или перезагрузись с дискеты.
не много не втему всё это дожно происходить в автоматеческом... 17.02.06 02:27  
Автор: Tamas Статус: Member
<"чистая" ссылка>
> Если просто удалить, то войди в сэйв мод и потри, или
> перезагрузись с дискеты.

не много не втему всё это дожно происходить в автоматеческом режиме... делать это дожно моё приложение... но я не имею физического доступа к этому компу так что с дискеты не загрузишся :-)
Если требуется именно автоматизм, а не кракинг, читай тело письма. В большинстве случаев срабатывает. 19.02.06 11:03  
Автор: kstati <Евгений Борисов> Статус: Elderman
Отредактировано 19.02.06 11:06  Количество правок: 1
<"чистая" ссылка>
1. Получаешь путь к скрипту:
path = [[["\HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\"]]]
path = path + "\/cleanup.bat";

2. Пишешь в него:
@echo off
SET target=Целевой файл в кавычках
if not exists %target% del %0
del %tagert%
%0

---

--------------
Например такая "тулза" очистки TEMP-а работает на ура. Хотя временные файлы используются другими программами cleartemp.cmd:
@echo off
del /q /s %TEMP%
del /q /s %WINDIR%\temp
rd /q /s %TEMP%
rd /q /s %WINDIR%\temp
mkdir %TEMP%
mkdir %WINDIR%\temp

---
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach