Как сделать самоудаляющийся архив

Добавил пользователь Дмитрий К.
Обновлено: 04.10.2024

Этот документ представляет собой перевод статьи "Self-Deleting Executables" Джеймса Брауна (с его разрешения). Я не стал переводить пару описываемых Джеймсом методов. Если вам все же интересно узнать о них, то зайдите на страничку оригинала статьи.

Исправлены обнаруженные ошибки и неточности в оригинале. В оригинале, примеры приводятся на С, я перевел их на Delphi.
Download source (C)

В версии статьи 1.1 я исправил найденные орфографические ошибки, а также переработал текст статьи.

Введение

Эта тема так часто поднимается в различных группах новостей, что я решил написать статью о методах, позволяющих исполняемому модулю удалить себя с диска. Информации на эту тему в сети очень мало, а ту что есть очень трудно найти.

Зачем вам может понадобиться программа удаляющая сама себя? Единственная стоящая причина, которую я знаю - это программа деинсталляции. Она должна удалить файлы приложения и затем удалить с диска и себя. Я уверен, что существуют и другие хорошие причины, но большинство других причин - вирусы или трояны, пытающиеся скрывать себя от посторонних глаз.

В целом я знаю пять различных методов, каждый из которых я кратко опишу далее. Должен заметить, что лишь один из этих методов разработан мною. Все, кроме последнего метода, представляют собой перепечатку материалов из колонки Джефри Рихтера "Win32 Q&A" в журнале January 1996 MSJ. Щелкните здесь, если хотите прочитать оригинал статьи. Итак, я надеюсь теперь никто не подумает, что я присвоил себе труды и идеи других людей.

Так в чем же проблема?

Если вы попробуете выполнить следующий код, то вы не добьетесь желаемого результата:

Этот код получает полный путь к текущему исполняемому модулю и затем пытается удалить файл исполняемого модуля. Данный код не дает ожидаемого результата, потому что все 32-х битные версии операционной системы Windows (95, 98, ME, NT, 2000, XP и т.д.) используют механизм, называемый "файлы проецируемые в память", для загрузки образа исполняемого модуля в память.

Когда загрузчик Windows запускает исполняемый модуль, он открывает файл исполняемого модуля на диске и проецирует его в память. Этот файл остается открытым все время жизни процесса, и закрывается только после того, как процесс будет завершен. Из-за этого невозможно удаление файла исполняемого модуля обычными методами. Просто запустите notepad.exe, и попробуйте его удалить.

Метод MoveFileEx

Я собираюсь описать этот метод, хотя он решает поставленную задачу не до конца, потому что он очень полезен и удобен в других ситуациях.

Этот вызов API функции перемещает файл в новое место. Когда вы передаете nil в качестве второго параметра, файл перемещается в "никуда", что равнозначно его удалению. Без дополнильных усилий, этот вызов закончится неудачей, если вы укажете в качестве файла - файл текущего исполняемого модуля. Однако, если мы передадим MOVEFILE_DELAY_UNTIL_REBOOT в качестве параметра dwFlags, то мы попросим систему отложить операцию перемещения (удаления) до перезагрузки системы.

У данного метода есть пара недостатков. Во-первых, мы не можем удалить папку в которой находится исполняемый модуль. Во-вторых, файл не удаляется тотчас же. Поэтому, если система не перезагружается часто (например, вместо выключения ее отправляют в ждущий режим) файл так и будет оставаться на диске до тех пор, пока систему не перезагрузят. Но самая главная проблема заключается в том, что функция MoveFileEx не реализована в Windows 95/98/ME.

Метод WININIT.INI

В Windows 95/98/ME, приложение называемое WININIT.EXE запускается при каждой загрузке системы. Это приложение ищет файл WININIT.INI. Если этот файл существует, WININIT.EXE ищет в нем секцию [Rename]. Каждая запись в секции [Rename] описывает операцию переименования файла, которая произойдет единственный раз. Этот способ очень похож на метод описанный ранее.

Имя файла, слева от знака равенства, задает новое имя файла, указанного справа от равенства. Когда в качестве нового имени файла указан NUL, файл удаляется. Таким образом, приложение может добавить в секцию [Rename] новую запись, указав NUL в качестве нового имени и полный путь к своему файлу.

При добавлении записи в секцию [Rename] следует проявить осторожность. Вы не можете пользоваться API функцией , потому что эта функция удалит часть остальных записей из секции [Rename]. Потому что, она считает, что в каждой секции не может быть несколько записей с одинаковым именем, в нашем случае NUL.

Метод с использованием самоудаляющегося пакетного файла (.bat, .cmd)

Метод COMSPEC

Этот метод мне прислал Tony Varnas:

Этот способ очень похож на метод с пакетным файлом, но более изящен в реализации. Он работает во всех 32-х битных версиях Windows (95, 98, ME, NT, 2000, XP), так как на всех них определена переменная окружения COMSPEC. По умолчанию в ней содержится полный путь к системному интерпретатору командной строки. Для Windows 95 - "command.exe", для Windows NT - "cmd.exe".

Для работы функции необходимо ее вызвать и тут же завершить работу своего приложения. Она вызывает системный интерпретатор командной строки и просит его выполнить следующую команду:

Эта команда удаляет указанный файл и перенаправляет операции вывода в NUL (no output). Интерпретатор вызывается как скрытое окно, поэтому пользователь не видит процесса на своем экране.

Метод DELETE_ON_CLOSE

Функция принимает несколько флагов, которые влияют на то, как файл будет создаваться или открываться. Один из этих флагов - FILE_FLAG_DELETE_ON_CLOSE, указывает на то, что файл будет удален, когда последний дескриптор (handle) файла будет закрыт. Основа данного метода заключается в том, что исполняемый модуль будет запущен с установленным флагом FILE_FLAG_DELETE_ON_CLOSE, поэтому, когда приложение закончит свою работу, файл будет удален автоматически.

Первый шаг заключается в создании пустого файла, с установленным флагом FILE_FLAG_DELETE_ON_CLOSE. Содержимое текущего исполняемого модуля копируется в новый файл. Затем создается новый процесс из копии исполняемого модуля. Это увеличивает количество дескрипторов на новый файл. Кроме того, новому процессу передается полный путь к файлу текущего процесса и PID в качестве аргументов командной строки.

Затем текущий процесс закрывает дескриптор файла. Из-за чего число дескрипторов нового файла уменьшается на единицу, но так как CreateProcess увеличивал этот счетчик, файл не удаляется.

Итак, копия исполняемого модуля запущена, и начинает исполняться. PID, переданный через командную строку, используется для открытия первоначального процесса. Дублирующий процесс дожидается завершения первоначального процесса используя . После этого, дублирующий процесс удаляет файл первоначального процесса, путь к которому так же был передан как аргумент командой строки. Таким образом мы удалили файл исполняемого модуля исходного процесса, как и хотели в самом начале. Теперь дублирующий процесс завершает свою работу, количество дескрипторов на файл с копией модуля становится равным 0. А так как файл был создан с флагом FILE_FLAG_DELETE_ON_CLOSE, он удаляется.

Звучит слишком заумно, но это не так трудно. Давайте повторим еще раз:

Этот метод требует очень аккуратного кодирования, потому что, программа должна быть написана так, чтобы она могла выполнять обе задачи. Т.е. программа должна уметь играть роли "текущего" и "дублирующего" процессов.

Метод немного трудноват, но делает свою работу очень хорошо. Программа uninstall, которую я написал и использую в своих продуктах, реализует именно этот метод.

Можно немного модифицировать данный метод - разделить "текущий" и "дублирующий" процессы на разные модули. Т.е. написать очень маленький отдельный модуль, задача которого, лишь удалять переданный в командной строке файл. Этот маленький модуль можно вшить в ресурсы исполняемого модуля, который на шаге 2) в новый файл будет записывать не свою копию, а маленький модуль. В остальном, все тоже самое, как было описано выше.

Вопрос в следующем:
Как сделать из него .pdf-файл самоудаляющийся при определенных условиях (наступление указанной даты либо истечение определенного срока после создания файла)?
Вернее - самоудаление - не обязательная функция. Достаточно просто чтобы он перестал открываться (например самостоятельно изменил пароль на открытие).
Наверное такое можно сделать с помощью вложенного JavaScript кода?

ch_alex

Погулять вышел.

Ответ: Как сделать временный pdf-файл?

Имеем какой-то текстовый документ.

Вопрос в следующем:
Как сделать из него .pdf-файл самоудаляющийся при определенных условиях (наступление указанной даты либо истечение определенного срока после создания файла)?
Вернее - самоудаление - не обязательная функция. Достаточно просто чтобы он перестал открываться (например самостоятельно изменил пароль на открытие).

Или потер заголовки.
Ты таким образом ничего не добьешься - порчу файла можно сделать только при открытии его в Акробате (не в Ридере). Для порчи просто по дате нужна ВНЕШНЯЯ программа (типа шпиона). Но и тут все исправляет бэкап файла, в котором после таких явлений начинают разбираться.

Нет такого бухгалтера, который не способен угробить любое, хорошо налаженное производство. (С) CH_ALEX

Участник

Ответ: Как сделать временный pdf-файл?

Спасибо за ответ.
А что имееется в виду? То, что файл "запортиться" только в случаи если пользователь откроет его Акробатом? А если просто ридером - без изменений? Я правильно понял?

И что - вариантов совсем нет?

ch_alex

Погулять вышел.

Ответ: Как сделать временный pdf-файл?

Спасибо за ответ.
А что имееется в виду? То, что файл "запортиться" только в случаи если пользователь откроет его Акробатом? А если просто ридером - без изменений? Я правильно понял?

И что - вариантов совсем нет?

Ридер - он читатель, а не писатель.
Варианты я уже сообщал - поможет только вирусоподобная программа по типу отслеживателей кликов рекламных банеров, которую можно запускать из Visual Basic из PDF. Вот только я не уверен, что оно отработает в старых версиях PDF-Reader (да и в новых тоже) - как-то меня эта тема особенно не интересовала.

И повторюсь - все, кто пишет бэкапы, застрахованы от последствий работы таких программ - можно и под виртуалкой прокатать, выяснить, где собака порылась. И всё.

Нет такого бухгалтера, который не способен угробить любое, хорошо налаженное производство. (С) CH_ALEX

Самоуничтожающиеся фото — особенности функции

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

На смартфонах Apple

Далее получатель нажимает на присланное фото или видео, чтобы открыть его, и начинается отсчет до его удаления.

На Android-устройствах

Добавить исчезающее фото на Андройдах еще проще, но в целом порядок действий аналогичен:

Есть ли способы скачать самоудаляющееся фото

Многие пользователи мессенджера, после того, как в него добавили эту функцию, начали интересоваться, как сохранить самоуничтожающееся фото. С другими (обычными) изображениями проще. Открыв их, можно нажать на кнопку в виде трех точек и скачать на устройство. В случае с временными файлами — их можно только посмотреть.

Конечно, можно взять второй телефон и сделать снимок с его помощью, но это не всегда удобно, да и качество будет далеко от изначального.

Заключение

Сегодня рассмотрим как сделать самораспаковывающийся архив или SFX archive (аббревиатура английского self-extracting archive) — сжатый файл, состоящий из одного или нескольких документов плюс программный код для их извлечения.

Можно представить что это некий контейнер для хранения, переноски, передачи нужной информации в сжатом виде. Причем если для обычных архивов требуется наличие установленного архиватора для распаковки его содержимого. То здесь таких требований нет. Вынуть из него содержимое несложно при условии использования того же типа операционной системы. Если он создан для Windows, с большой долей вероятности он успешно распакуется на той же платформе с любой версией. Успех будет менее очевидным при попытке извлечения данных в других системах.

Часто подобный метод хранения информации используется для передачи данных в сети интернет. Благодаря ему отправителю можно не переживать о наличии предустановленного приложения для сжатия или какого либо дополнительного ПО у получателя. Сегодня обсудим самые актуальные на текущий момент программы для создания самораспаковывающихся архивов.

Создание SFX-Archive в 7zip

Описание процесса по шагам

Наиболее популярный выбор пользователей, который можно установить бесплатно — 7zip. Поэтому именно на его примере первым разберем процесс создания самораспаковывающегося архива.

Чтобы заархивировать нужную информацию и создать самораспаковывающийся архив используя программу 7zip необходимо:

7zip – Добавить к архиву

Если вы правильно выполнили описанные выше шаги, то откроется стандартное окно 7z вида:

Создать SFX архив в 7zip

Следует отметить что отображение опции станет активным только после выбора формат 7zip. Прочие форматы не поддерживают возможность создать самораспаковывающийся архив.

Перед сжатием можно модифицировать остальные параметры процедуры. К примеру, установить степень сжатия, метод, подключить опцию включения шифрования или разделения на тома. Настройка опций не обязательна. Для быстрого создания достаточно будет остановиться на шаге описанном в предыдущем параграфе.

По окончании в директории с исходными файлами будет создан EXE.

Распаковка

распаковка в 7zip

Внимание! Некоторые антивирусы могут воспринимать самораспаковывающиеся архивы как вирусы, несмотря на то, что они таковыми не являются.

Например, приложение Защитник Win 10 не только считает, что во всех архивах вирусы, но и автоматически удаляет подобные экзешники без предупреждения.

Пользователь, который уверен в отсутствии вредоносного кода, для решения проблемы может отключить Защитник Windows 10 на время распаковки.

Создание SFX-Archive в WinRAR

Пошаговая инструкция

Добавить в архив WinRar

Создать самораспаковывающийся архив Winrar

По завершению процесса компрессии появится EXE-файл с указанным вами названием.

Извлечение

При запуске полученного архива отобразится экран извлечения, аналогично тому, как на скриншоте ниже.

распаковка в WinRAR

Создание SFX-Archive в WinZIP

Руководство, как сжать файлы

Менее популярная, по сравнению с перечисленными выше, утилита WinZip.

WinZip в меню Пуск

добавить файлы в WinZip

Самораспаковывающийся EXE в WinZip

Сохранить и запустить WinZip Самораспаковывающийся архив

Следующим шагом приложение рекомендует задать имя ZIP-файла и сохранить. Выполняем предложенные действия и продолжаем.

сохранить архив как ZIP-файл

создание самораспаковывающегося EXE-файла

Выгрузка сжатых файлов

распаковка в WinZip

Прочие архиваторы

Кроме вышеописанных программ существуют и другие, редко используемые сейчас архиваторы для создания SFX архивов. К ним относятся такие как ARJ, PKZIP, p7zip, zipSfx, SFX Creator, CAB.

Напишите в комментарии: а какой утилитой пользуетесь вы?

Читайте также: