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

Небольшая, но в то же время полезная развлекуха – самоудаляющийся исполняемый файл. Во времена MS-DOS подобным фокусом никого было не удивить, там операционная система позволяла писать что угодно куда угодно, и даже удалять исполняемый файл во время его выполнения (хе-хе…). С появлением Windows вольница закончилась. Если файл запущен, то до того, как он завершит работу, ничего с ним сделать не получится. Но из этого правила есть одно исключение – так называемые пакетные или bat-файлы. Они выполняются не как самостоятельное приложение, а как набор инструкций для командного процессора, поэтому запросто могут удалять сами себя. Этим мы и воспользуемся для решения нашей задачи. Вот пример пакетного файла, который сперва пытается удалить файл по заданному пути, а затем самоуничтожается.

PHP код:



:loc

del 
"D:Pathfile.exe"

if exist "D:Pathfile.exe" goto loc

del 
%




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

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

PHP код:



сегмент данных

...

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
*




Один момент все-таки проясню. Путь и имя файла преобразуется в DOS’овский "короткий" формат 8.3 на тот случай, если в нем содержатся какие-нибудь специальные символы или буквы не-латинского алфавита. При обычном написании пути пакетные файлы в таком случае могут отработать некорректно.

PHP код:



сегмент кода

...

        ; 
Получить имя файла

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

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

• Пример программы с исходным текстом (FASM): http://www.manhunter.ru/download/23733/Self.Delete.File.Demo.zip

• Author: ManHunter

Оставьте комментарий