2012-04-01 3 views
9

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

+3

Возможно, возможно написать программу, которая удалит файл .exe или что-то еще, хотя вам, возможно, придется перепрыгнуть через некоторые обручи, так как в некоторых средах ОС блокирует файл .exe во время его выполнения. –

ответ

15

Да.

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

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

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

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

+0

Отлично работает - спасибо! –

+0

Хорошо, +1 то :). –

+5

Здесь мы получаем обычное дело о надежности 'argv [0]' как пути к двоичному. POSIX говорит, что * должен * указывать на двоичный файл, но не требует его, и API позволяет программам устанавливать его на что-то другое. В конечном итоге это обычно работает, но не является надежным. Более того, даже если у вас есть правильный путь, двоичный файл может быть жестко привязан в нескольких местах. – dmckee

0

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

0

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

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

2

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

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

Программа Б бы проверку, если все еще работает, и как только A завершает работу B бы стереть бинарного «ы одну петлю.

+1

Обратный Маленький Джон! –

+3

Но как насчет B - это похоже на двойное самоубийство. –

+1

Ну, миссия заключалась в том, чтобы убить А, не так ли? B может отдыхать в какой-то временной папке и ждать, когда ее уберут. – Imp

5

Я не знаю, что один может удобно сделать это действительно независимым от платформы способом, но вы не указали независимость от платформы, поэтому попробуйте следующий, код 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]); 
} 

Как близко это то, что вы хотите?

+9

Это наихудшая типизация аргументов main(), которую я когда-либо видел. – blueshift

+0

Woow. Оно работает. Можете ли вы объяснить эти типы аргументов? – Jack

+1

Это нестандартные аргументы для 'main', кстати. Учитывая это, он служит только для того, чтобы ваш примерный код стал более трудным для новичков, чтобы понять ... –

Смежные вопросы