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

Carding

Professional
Messages
2,830
Reputation
17
Reaction score
2,042
Points
113
Небольшая, но в то же время полезная развлекуха - самоудаляющийся исполняемый файл. Во времена MS-DOS подобным фокусом никого было не удивить, там операционная система позволяла писать что угодно куда угодно, и даже удалять исполняемый файл во время его выполнения (хе-хе...). С появлением Windows вольница закончилась. Если файл запущен, то до того, как он завершит работу, ничего с ним сделать не получится. Но из этого правила есть одно исключение - так называемые пакетные или bat-файлы. Они выполняются не как самостоятельное приложение, а как набор инструкций для командного процессора, поэтому запросто могут удалять сами себя. Этим мы и воспользуемся для решения нашей задачи. Вот пример пакетного файла, который сперва пытается удалить файл по заданному пути, а затем самоуничтожается.

PHP код:
Code:
:loc
del "D:\Path\file.exe"
if exist "D:\Path\file.exe" goto loc
del %0

Проверка и цикл нужны для того, чтобы дождаться момента, когда файл освободится и станет доступным для ликвидации. Команда "del %0" удаляет bat-файл, в котором она выполняется, без привязки к его имени. Теперь, чтобы наш исполняемый файл самоудалялся, он должен выполнить следующие действия: получить имя и путь выполняемого файла, сформировать bat-файл, запустить его и завершить работу. bat-файл дождется окончания работы исполняемого файла, удалит его, затем удалит сам себя.

Осталось перевести человеческие слова на язык Ассемблера. Код получается достаточно простой, дополнительно комментировать его я не буду.

PHP код:
Code:
; сегмент данных
...
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
Один момент все-таки проясню. Путь и имя файла преобразуется в DOS'овский "короткий" формат 8.3 на тот случай, если в нем содержатся какие-нибудь специальные символы или буквы не-латинского алфавита. При обычном написании пути пакетные файлы в таком случае могут отработать некорректно.

PHP код:
Code:
; сегмент кода
...
        ; Получить имя файла
        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

Где это можно использовать? Если в благих целях, то именно так должны работать правильные деинсталляторы программ. Хороший деинсталлятор не должен просить пользователя подчистить "хвосты" вручную, или еще хуже - молча завершать работу, оставляя в системе как минимум каталог установки с файлом деинсталлятора внутри. Хороший деинсталлятор тщательно удалит за собой все, включая сам деинсталлятор. В этом случае bat-файл придется дополнить командой удаления каталога с программой и запускать его вне этого каталога. На темной стороне Силы самоудаляющимся файлам тоже найдется применение. Например, какая-нибудь шпионская программа может тихонько самоликвидироваться после выполнения своих непосредственных задач, чтобы не вызывать подозрений у жертвы и не оставлять образцов для исследования.

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