2012-04-01 12 views
9

E 'possibile scrivere un programma in C che dopo l'esecuzione si cancella da solo (il binario) e quindi termina con successo. In tal caso, qual è il modo più semplice per farlo?È possibile scrivere un programma autodistruttivo in C?

+3

Probabilmente è possibile scrivere un programma che cancella il file .exe o qualsiasi altra cosa, anche se potrebbe essere necessario saltare alcuni loop poiché in alcuni ambienti il ​​sistema operativo blocca l'exe durante l'esecuzione. –

risposta

15

Sì.

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

(testato e funziona.)

Nota che se argv[0] non indica il binario (riscritto da chiamante) questo non funzionerà. Analogamente se si esegue un collegamento simbolico, il collegamento simbolico, non il file binario, verrà eliminato.

Anche se il file ha più collegamenti fisici, verrà rimosso solo il collegamento chiamato.

+0

Funziona alla grande - grazie! –

+0

Ok, +1 poi :). –

+5

Qui arriviamo al solito business sull'affidabilità di 'argv [0]' come percorso per il binario. POSIX dice che * dovrebbe * puntare al binario, ma non lo richiede e l'API consente ai programmi di impostarlo su qualcos'altro. Il risultato finale è, di solito funziona, ma non è affidabile. Inoltre, anche se si dispone di un percorso corretto, il file binario può essere collegato in più punti. – dmckee

0

Si potrebbe provare a eliminare solo l'eseguibile nel programma (FILE * e roba) ... ma visto che quell'eseguibile è ciò che viene eseguito potrebbe non funzionare. Lo vedo come se stessi mangiando te stesso, e per quanto ne so non è possibile, ma potresti certamente provarlo usando il metodo che ho menzionato sopra.

0

Penso che dipenda dalla piattaforma che si sta utilizzando. In sostanza, una volta caricato l'eseguibile, qualsiasi modifica successiva al file binario non influisce sul programma in esecuzione. In Unix, questo è il caso, ed è possibile utilizzare la chiamata di sistema dello scollegamento.

Non sono sicuro se questo sia vero su Windows o no. Potrebbe non essere consentito cancellare l'immagine eseguibile. Puoi provare l'API di DeleteFile() in Windows.

2

Se il sistema operativo consente a un programma in esecuzione di eliminare il proprio binario, è sufficiente cercare l'API per l'eliminazione dei file o eseguire un comando system() corrispondente.

Se il sistema operativo non permette questo, il vostro programma (chiamiamolo A) potrebbe costruire un altro binario, che contiene un altro programma (chiamiamolo B). Quindi, A si chiuderà immediatamente.

programma B avrebbe un singolo ciclo controllando se Un è ancora in esecuzione e appena A si chiude, B cancellerebbe Un binario s'.

+1

Reverse Little John! –

+3

Ma che dire di B - è come un doppio suicidio andato storto. –

+1

Beh, la missione era uccidere A, non è vero? B può riposare in una cartella temporanea e aspettare di essere spazzato via qualche volta. – Imp

5

Non so che comodamente si può fare in un modo veramente indipendente dalla piattaforma, ma non è stato specificato l'indipendenza dalla piattaforma, in modo da provare le seguenti, codice di stile 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]); 
} 

Quanto vicino è quello che vuoi?

+9

Questa è la più bizzarra digitazione di argomenti a main() che io abbia mai visto. – blueshift

+0

Woow. Funziona. Puoi spiegare questo argomento? – Jack

+1

Questi sono argomenti non standard per 'main', per inciso. Detto questo, serve solo a rendere il codice di esempio più difficile da capire per un nuovo arrivato ... –

Problemi correlati