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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Нет. Я тоже сталкивался с этим. 17.02.06 11:54  Число просмотров: 2066
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> не на этапе остановки а на этапе загруски и фича эта
> называется MoveFileEx

И это не MoveFileEx
Операция удаления заканчивается (кажется с ошибкой), после чего удаляемый файл нормально энумерируется в каталоге, но при попытке открытия говорит, что такого файла уже нет. Через некоторое время (без всяких перезагрузок) файл пропадает (перестает энумерироваться)
<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-2022 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach