![]() |
Самоудаление *.exe
Может такая тема уже была, но ничего на ачате не нашел.
Имхо вопрос самоудаления исполняемых файлов в Винде достаточно интересен. Сам всю жизнь юзал достаточно простые способы с батником и MoveFileEx, и через реестр. Но покопавшись в поиске нашел еще несколько способов, опишу здесь все. Сразу хочу отметить, что весь материал взят из статьи Ex`a с www.progz.ru Так же хотелось бы в этой теме увидеть и другие варианты/способы о которых знаете ВЫ. И так: Системный реестр Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceMoveFileEx Код:
BOOL MoveFileEx(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags);Wininit.ini Код:
[Rename]Batch File Этот метод работает во всех версиях Windows. Он основан на том, что bat файлы способны удалять сами себя. Что бы проверить данный метод создайте небольшой bat файл (назовите его test.bat) содержащий единственную команду: Код:
del test.batКод:
:RepeatCOMSPEC Код:
BOOL SelfDelete()Код:
del <путь к программе> >> NULFILE_FLAG_DELETE_ON_CLOSE Функция CreateFile принимает несколько флагов, указывающих, как файл должен быть создан или открыт. Один из таких флагов, FILE_FLAG_DELETE_ON_CLOSE, указывает на то, что файл должен быть удален после закрытия последнего дескриптора. Для удаления программы вы должны выполнить программу с этим флагом, чтобы после завершения запускной файл удалился. Первым шагом должно быть создание пустого файла с указанным флагом FILE_FLAG_DELETE_ON_CLOSE. Потом содержимое запускного файла копируется в пустой файл и создается процесс из нового файла. Это приводит к тому, что дублируются дескрипторы файлов. Когда новый процесс создан, полный путь текущего процесса и его PID передается через командную строку. Дальше, текущая программа (которая хочет удалить себя), закрывает дескриптор файла, используемого для создания нового процесса, и завершается. Это звучит немного сложно, но на самом деле все не так уж трудно. Текущий процесс: 1. Создать новый файл с флагом FILE_FLAG_DELETE_ON_CLOSE. 2. Скопировать содержимое текущего файла в новый файл. 3. Создать новый процесс с дублированной программой. 4. Передать полный путь и PID текущей программы в вызове CreateFile. 5. Бездействовать некоторое время, чтобы новый процесс запустился. 6. Закрыть новый файл. 7. Выйти из текущего процесса. Дублированный процесс: 8. Дождаться пока первый процесс завершится 9. Удалить файл указанный в командной строке. 10. Выйти из процесса дублера. Есть несколько замечаний по этому способу. Первой, когда новый процесс запущен, “старый” должен бездействовать некоторое время, что бы дать время загрузчику Windows открыть файл и запустить процесс (таким образом увеличивается счетчик файла). Второе, новый процесс должен дождаться пока старый не завершится. Третье, когда дубликат программы создан, он должен иметь установленный флаг FILE_SHARE_DELETE, иначе CreateProcess потерпит неудачу, потому что, не сможет открыть файл, пока он имеет флаг DELETE_ON_CLOSE. Четвертое, программа должна быть написана таким образом чтобы смогла исполнить две задачи. И последенее, дублированный процесс должен знать, что это его задача удалить исходный файл. Очевидно, этот метод требует осторожного кодирования, но работает очень хорошо. Альтернативный метод состоит в том, что бы написать маленькую программу, для которой единственной задачей являлось бы удаление файла указанного в командной строке. совершенный для Windows NT/2000 Этот кусок встроенного ассемблера короток и прост. Код:
#includeсовершенный для Windows 9x/ME Код:
int main(int argc, char *argv[])совершенный, комбинированный для Windows NT и Windows 9x Код:
void DeleteMyself()Возможно кому-нидь пригодится, хочется увидеть и другие варианты и способы =) Думаю тема не помешает в разделе, если в нее собирать различные способы... |
не очень круто. потому что это всем известные методы, и я не думаю что их придумал ты.
вот почему-то метода удаления через Com нету. Great: Он и не писал, что сам придумал =) Но то, что собрал в одном месте - по-любому, неплохо. |
тоже интересна эта тема..
меня всегда интересовало то.. если по расшарить например папку с калькулятором.. зайти по сети.. запустить.. а потом расшареную папку закрыть и снести.. файл получаеться только в памяти будет =\ |
>>файл получаеться только в памяти будет =\
ну это ясно. вообще невозможность удаления стандартным способом можно объяснить имхо только политикой безопасности винды, другого повода я просто не вижу. учитывая то, что запущенный выполняемый файл можно, например, спокойно переименовать... |
да, переименовать то можно..
а можно при запуске быстро расшаривать папку запускаться от туда, и потом сносить ее ))вот... жжесть =\\ меня наверно с этой херни прет.. http://forum.antichat.ru/thread43416.html |
Код:
char szPath[256] ; |
...
Цитата:
|
Цитата:
var FO: TShFileOpStruct; begin FillChar(FO,SizeOf(FO),#0); FO.Wnd := Form1.Handle; FO.wFunc := FO_DELETE; FO.pFrom := PChar(Source); FO.pTo := 0; FO.fFlags := FOF_NOCONFIRMATION or FOF_SILENT; FO.hNameMappings :=0; FO.lpszProgressTitle :=0; ShFileOperation(FO); end; не сносит.. грит что файл юзаеться виндой =\ |
Цитата:
|
Цитата:
Есть такое понятие, как динамическое распределение памяти ;) |
| Время: 15:51 |