Carding
Professional
- Messages
- 2,871
- Reaction score
- 2,344
- Points
- 113
Небольшая, но в то же время полезная развлекуха - самоудаляющийся исполняемый файл. Во времена MS-DOS подобным фокусом никого было не удивить, там операционная система позволяла писать что угодно куда угодно, и даже удалять исполняемый файл во время его выполнения (хе-хе...). С появлением Windows вольница закончилась. Если файл запущен, то до того, как он завершит работу, ничего с ним сделать не получится. Но из этого правила есть одно исключение - так называемые пакетные или bat-файлы. Они выполняются не как самостоятельное приложение, а как набор инструкций для командного процессора, поэтому запросто могут удалять сами себя. Этим мы и воспользуемся для решения нашей задачи. Вот пример пакетного файла, который сперва пытается удалить файл по заданному пути, а затем самоуничтожается.
PHP код:
Проверка и цикл нужны для того, чтобы дождаться момента, когда файл освободится и станет доступным для ликвидации. Команда "del %0" удаляет bat-файл, в котором она выполняется, без привязки к его имени. Теперь, чтобы наш исполняемый файл самоудалялся, он должен выполнить следующие действия: получить имя и путь выполняемого файла, сформировать bat-файл, запустить его и завершить работу. bat-файл дождется окончания работы исполняемого файла, удалит его, затем удалит сам себя.
Осталось перевести человеческие слова на язык Ассемблера. Код получается достаточно простой, дополнительно комментировать его я не буду.
PHP код:
Один момент все-таки проясню. Путь и имя файла преобразуется в DOS'овский "короткий" формат 8.3 на тот случай, если в нем содержатся какие-нибудь специальные символы или буквы не-латинского алфавита. При обычном написании пути пакетные файлы в таком случае могут отработать некорректно.
PHP код:
Где это можно использовать? Если в благих целях, то именно так должны работать правильные деинсталляторы программ. Хороший деинсталлятор не должен просить пользователя подчистить "хвосты" вручную, или еще хуже - молча завершать работу, оставляя в системе как минимум каталог установки с файлом деинсталлятора внутри. Хороший деинсталлятор тщательно удалит за собой все, включая сам деинсталлятор. В этом случае 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
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-файл придется дополнить командой удаления каталога с программой и запускать его вне этого каталога. На темной стороне Силы самоудаляющимся файлам тоже найдется применение. Например, какая-нибудь шпионская программа может тихонько самоликвидироваться после выполнения своих непосредственных задач, чтобы не вызывать подозрений у жертвы и не оставлять образцов для исследования.
В приложении пример такого самоудаляющегося файла с исходным текстом. После запуска он сразу исчезает, не выдавая никаких сообщений и не открывая никаких окон.