Можно ли написать саморазрушающую программу на C? - PullRequest
10 голосов
/ 01 апреля 2012

Можно ли написать программу на C, которая после выполнения удаляет себя (двоичный файл), а затем успешно завершает свою работу.Если так, какой самый простой способ сделать это?

Ответы [ 5 ]

15 голосов
/ 01 апреля 2012

Да.

#include <unistd.h>
int main(int argc, char* argv[])
{
  return unlink(argv[0]);
}

(Проверено и работает.)

Примечание , что если argv[0] не указывает на двоичный файл (переписанный вызывающей стороной), этоне будет работать.Аналогичным образом, если выполнить символьную ссылку, будет удалена символическая ссылка, а не двоичная.

Кроме того, если файл имеет несколько жестких ссылок, будет удалена только вызываемая ссылка.

5 голосов
/ 01 апреля 2012

Я не знаю, что удобно сделать это по-настоящему независимым от платформы способом, но вы не указали независимость от платформы, поэтому попробуйте следующий код в стиле Linux:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv) {
    printf("Read carefully!  You cannot print this message again.\n");
    return unlink(argv[0]);
}

Насколько это близко к тому, что вы хотите?

2 голосов
/ 01 апреля 2012

Если ваша операционная система позволяет запущенной программе удалять свой собственный двоичный файл, просто найдите API для удаления файла или выполните соответствующую команду system().

Если ОС не позволяет этогоВаша программа (назовем ее A ) может создать другой двоичный файл, содержащий другую программу (назовем ее B ).Затем A немедленно завершит работу.

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

0 голосов
/ 01 апреля 2012

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

Я не уверен, правда ли это в Windows или нет. Может быть запрещено удалять исполняемый образ. Вы можете попробовать API DeleteFile () в Windows.

0 голосов
/ 01 апреля 2012

Вы можете попытаться просто удалить исполняемый файл в программе (FILE * и прочее) ... но, учитывая, что исполняемый файл - это то, что запускается, он может не работать. Мне кажется, что вы едите себя, и, насколько я знаю, это невозможно, но вы наверняка можете попробовать, используя метод, который я упомянул выше.

...