2012-04-01 11 views
9

क्या सी में एक प्रोग्राम लिखना संभव है कि निष्पादन पर स्वयं (बाइनरी) हटा दिया जाता है और फिर सफलतापूर्वक समाप्त हो जाता है। यदि हां, तो ऐसा करने का सबसे आसान तरीका क्या है?क्या सी में एक आत्म विनाशकारी कार्यक्रम लिखना संभव है?

+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 का कहना है कि * बाइनरी को इंगित करना चाहिए, लेकिन इसकी आवश्यकता नहीं है और एपीआई प्रोग्राम्स को इसे किसी अन्य चीज़ पर सेट करने की अनुमति देता है। अंत परिणाम यह है कि यह आमतौर पर काम करता है, लेकिन विश्वसनीय नहीं है। इसके अलावा, यहां तक ​​कि यदि आपके पास सही पथ है, तो बाइनरी एक से अधिक स्थानों पर हार्डलिंक हो सकती है। – dmckee

0

तुम बस कार्यक्रम (फ़ाइल * और सामान) में निष्पादन को हटाने का प्रयास कर सकता है ... लेकिन यह है कि निष्पादन योग्य के रूप में देख रहा है यह काम नहीं हो सकता है क्या चलाया जा रहा है। मैं इसे खुद को खाने की तरह देखता हूं, और जहां तक ​​मुझे पता है कि यह संभव नहीं है, लेकिन आप निश्चित रूप से ऊपर वर्णित विधि का उपयोग करके इसे आज़मा सकते हैं।

0

मुझे लगता है कि यह मंच आप उपयोग कर रहे पर निर्भर है। असल में, निष्पादन योग्य लोड होने के बाद, बाइनरी में आने वाले किसी भी बदलाव से चल रहे प्रोग्राम को प्रभावित नहीं होता है। यूनिक्स में, यह मामला है, और आप अनलिंक सिस्टम कॉल का उपयोग कर सकते हैं।

मुझे यकीन है कि क्या यह विंडोज या नहीं पर सच है नहीं कर रहा हूँ। निष्पादन योग्य छवि को हटाने की अनुमति नहीं दी जा सकती है। आप विंडोज़ में DeleteFile() एपीआई आज़मा सकते हैं।

2

यदि आप ऑपरेटिंग सिस्टम एक चल रहे प्रोग्राम को अपनी बाइनरी हटाने की अनुमति देता है, तो बस फ़ाइल हटाने के लिए एपीआई की तलाश करें, या संबंधित system() कमांड निष्पादित करें।

ओएस इस की अनुमति नहीं है, तो अपने कार्यक्रम एक और द्विआधारी निर्माण कर सकता है, किसी अन्य प्रोग्राम से युक्त (यह एक कॉल) (यह बी कॉल)। फिर, तुरंत छोड़ दिया जाएगा।

कार्यक्रम बी एकल लूप पता चल सके कि एक अभी भी रूप में जल्द ही के रूप में एक इस्तीफा, बी चल रहा है और मिटा होगा एक के द्विआधारी होगा।

+1

रिवर्स लिटिल जॉन! –

+3

लेकिन बी के बारे में क्या - यह दोहरी आत्महत्या की तरह गलत हो गया है। –

+1

ठीक है, मिशन ए को मारना था, है ना? बी कुछ अस्थायी फ़ोल्डर में आराम कर सकता है और कभी-कभी बाहर निकलने का इंतजार कर सकता है। – Imp

5

मुझे लगता है कि एक वास्तव में एक मंच स्वतंत्र तरीके से यह कर सकते हैं आसानी से पता नहीं है, लेकिन आप मंच स्वतंत्रता निर्दिष्ट नहीं किया है, तो निम्नलिखित की कोशिश, लिनक्स शैली कोड:

#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

यह मुख्य रूप से तर्कों का सबसे कठिन टाइपिंग है() मैंने कभी देखा है। – blueshift

+0

वाह। यह काम करता हैं। क्या आप इस तर्क प्रकार के बारे में समझा सकते हैं? – Jack

+1

वे संयोग से 'मुख्य' के लिए गैर मानक तर्क हैं। यह देखते हुए, यह केवल आपके उदाहरण कोड को समझने के लिए एक नए आने के लिए कड़ी मेहनत करता है ... –

संबंधित मुद्दे