Можно ли удалить *.exe файлу самого себя?
Нужно для uninstall'era.
Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe".
В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя?
Есть ли какие-то другие способи удалить самого себя
Здравствуйте yaroslav_v, Вы писали:
YV>Можно ли удалить *.exe файлу самого себя?
Напрямую — нет.
YV>Нужно для uninstall'era. YV>Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe". YV>В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя?
Нет.
YV>Есть ли какие-то другие способи удалить самого себя
До сих пор самый надежный способ, работающий во всех системах, — это запуск .bat файла, удаляющего основную программу, а затем и себя. Динамически формируется и запускается .bat-файл следующего содержания, после чего программа быстренько завершается, чтобы пользователь не успел заметить 100% использование процессора:
:loop
del "full-path-to-my-program.exe"
if exist "full-path-to-my-program.exe" goto :loop
del "full-path-to-this-file.bat"
В этот же .bat-файл можно добавить удаление директорий, в которых находилась основная программа.
Здравствуйте yaroslav_v, Вы писали:
YV>Можно ли удалить *.exe файлу самого себя? YV>Нужно для uninstall'era. YV>Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe". YV>В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя? YV>Есть ли какие-то другие способи удалить самого себя
Здравствуйте yaroslav_v, Вы писали:
YV>Можно ли удалить *.exe файлу самого себя?
Под NT я так делал, под другими операционками это не работает.
Хотя для win9x есть аналогичный код.
Трюк основан на факте, что под nt в каждом процессе хэндл со значением 4
является хэндлом собственной проекции процесса (memory mapped file). http://rsdn.ru/forum/message.asp?mid=22155&only
Есть варианты и без недокументированных фишек. Рихтер ими занимался некоторое время.
Последний писк был такой: копируем куда-то EXE, затем открываем эту копию CreateFile с флагом FILE_FLAG_DELETE_ ON_CLOSE, затем запускаем эту же копию (ч/з CreateProcess, например). Ей кидаем в командную строку (или как-то иначе) два параметра: путь к исходному EXE и inheritable-хендл самого работающего процесса. Потом делаем харакири (просто завершаем процесс).
В это время копия уже делает WaitForSingleObject, ожидая, пока не станет инвалидным полученный хендл. Как только это произойдет, она удаляет оригинал. Потом тоже просто-напросто умирает, и срабатывает (т.к. больше файл никому не нужен) Delete-On-Close.
Все!
Естественно, EXEшник должен уметь распознавать, что его запустили в режиме удаления, т.е. единственно в качестве копии для удаления деинсталлера.
Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Здравствуйте, Slicer [Wirkwood], Вы писали:
SW>Естественно, EXEшник должен уметь распознавать, что его запустили в режиме удаления, т.е. единственно в качестве копии для удаления деинсталлера.
По-моему, этот вариант мало отличается от варианта с .bat файлом.
Только сложней в реализации.
YV>Есть ли какие-то другие способи удалить самого себя
свежее поступление по теме на codeguru
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.
а вот у меня тоже вопрос есть: как сообще отвязаться от файла.
т.е. если мы запускаем прогу с сиди, вынимаем диск, и прога пробует обратиться за своими ресурсами, то потребуется диск. а как сделать чтоб он не был нужен? (чур без копирования на хард)
еслибы можно было этого добиться то exe-файл можно запросто удалить и самой прогой.
такие вот изыскания...
тока кто что подскажет по этому поводу?
селф делит — оч любопытная тема.
запуск самого себя с параметром FILE_FLAG_DELETE_ ON_CLOSE не поможет с освобождением хэндлов сразу по загрузке кода и ресурсов в память?
оч любопытно.
я вот например делаю программу-безопасниковскую. чтобы контролировать целостность одного бизнес-процесса.
хочу запускать прогу с дискеты и вынимать е:е. а прога чтоб работала и при неком событии просто завершалась. если при контроле е:е нет в списке задач значит беда!
Здравствуйте, yaroslav_v, Вы писали:
_>Можно ли удалить *.exe файлу самого себя? _>Нужно для uninstall'era. _>Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe". _>В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя? _>Есть ли какие-то другие способи удалить самого себя
Можно создать bat ( del путь к exe) файл и вызвать его, но потом проблема удалить этот bat
вся эта тема подробнейшим образом обсуждена — воспользуйтесь поиском! даже субж практически 1 в 1
... << RSDN@Home 1.1 alpha 1 >>
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.
эта любопытная действительно тема уже давно лежит на сайте — достаточно попробовать поиск!!!
... << RSDN@Home 1.1 alpha 1 >>
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.
Есть такая идея — сделать секцию на основе файла подкачки, в неё затолкать ресурсы из файла, которые являются кодом, ожидающим завершения процесса. потом настроит стек, остальные вещи, необходимые для работы NtCreateProcess, и вызвать NtCreateProcess для созданной секции.
Новый процесс дождётся завершения родителя и завершится.
Или такая мысль — родить поток в чужом процессе, который сделает то же самое, процессом-носителем может быть любой процесс, хоть SYSTEM
Re[3]: *.exe self-delete.
От:
Аноним
Дата:
15.10.06 23:14
Оценка:
Здравствуйте, masta, Вы писали:
M>Есть такая идея — сделать секцию на основе файла подкачки, в неё затолкать ресурсы из файла, которые являются кодом, ожидающим завершения процесса. потом настроит стек, остальные вещи, необходимые для работы NtCreateProcess, и вызвать NtCreateProcess для созданной секции.
Можно, пожалуйста поподробнее об этом... Если не трудно.