2012-04-01 35 views
9

Có thể viết chương trình bằng C khi thực thi tự xóa (nhị phân) và sau đó chấm dứt thành công. Nếu vậy, cách dễ nhất để làm điều này là gì?Có thể viết chương trình tự hủy hoại trong C?

+3

Có thể viết chương trình xóa tệp .exe hoặc bất kỳ thứ gì, mặc dù bạn có thể phải nhảy qua một số vòng vì trong một số môi trường hệ điều hành khóa .exe trong khi thực thi nó. –

Trả lời

15

Có.

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

(Tested và các công trình.)

Lưu ý rằng nếuargv[0] không trỏ đến nhị phân (viết lại bởi người gọi) này sẽ không hoạt động. Tương tự, nếu chạy qua một liên kết tượng trưng thì liên kết tượng trưng, ​​không phải là mã nhị phân, sẽ bị xóa.

Ngoài ra nếu tệp có nhiều liên kết cứng, chỉ liên kết được gọi sẽ bị xóa.

+0

Hoạt động tuyệt vời - cảm ơn! –

+0

Ok, +1 rồi :). –

+5

Ở đây chúng ta đi vào kinh doanh thông thường về độ tin cậy của 'argv [0]' như là đường dẫn đến nhị phân. POSIX nói rằng đó là * nên * trỏ đến nhị phân, nhưng không yêu cầu nó và API cho phép các chương trình cài đặt nó thành một thứ khác. Kết quả cuối cùng là, điều này thường hoạt động, nhưng không đáng tin cậy. Hơn nữa, ngay cả khi bạn có một con đường chính xác, nhị phân có thể được liên kết cứng ở nhiều nơi. – dmckee

0

Bạn có thể thử xóa tệp thi hành trong chương trình (FILE * và nội dung) ... nhưng xem như là tệp thực thi đó là những gì đang chạy nó có thể không hoạt động. Tôi thấy nó giống như ăn chính mình, và theo như tôi biết nó không thể, nhưng bạn chắc chắn có thể cho nó một thử bằng cách sử dụng phương pháp tôi đã đề cập ở trên.

0

Tôi nghĩ rằng nó phụ thuộc vào nền tảng bạn đang sử dụng. Về cơ bản, khi tệp thực thi được tải, mọi thay đổi tiếp theo đối với tệp nhị phân không ảnh hưởng đến chương trình đang chạy. Trong Unix, đây là trường hợp và bạn có thể sử dụng cuộc gọi hệ thống hủy liên kết.

Tôi không chắc liệu điều này có đúng trên Windows hay không. Nó có thể không được phép xóa hình ảnh thực thi. Bạn có thể dùng thử DeleteFile() api trong Windows.

2

Nếu hệ điều hành của bạn cho phép chương trình đang chạy để xóa nhị phân của riêng nó, hãy tìm API để xóa tệp hoặc thực hiện lệnh system() tương ứng.

Nếu hệ điều hành không cho phép điều này, chương trình của bạn (hãy gọi số A) có thể tạo một nhị phân khác, chứa chương trình khác (hãy gọi số B). Sau đó, A sẽ thoát ngay lập tức.

Chương trình B sẽ có một vòng lặp đơn kiểm tra nếu Một vẫn chạy và càng sớm càng Một bỏ, B sẽ xóa Một nhị phân 's.

+1

Reverse Little John! –

+3

Nhưng những gì về B - nó giống như tự tử đôi đã đi sai. –

+1

Vâng, nhiệm vụ là giết A, phải không? B có thể nghỉ ngơi trong một số thư mục tạm thời và chờ đợi để được quét ra đôi khi. – Imp

5

Tôi không biết rằng một thuận tiện có thể làm điều đó một cách thực sự nền tảng độc lập, nhưng bạn không nói rõ nền tảng độc lập, vì vậy hãy thử những điều sau đây, mã Linux-style:

#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]); 
} 

Làm thế nào gần đó là những gì bạn muốn?

+9

Đó là việc gõ các đối số wackiest vào main() mà tôi từng thấy. – blueshift

+0

Woow. Nó hoạt động. Bạn có thể giải thích về các loại đối số này không? – Jack

+1

Đó là những đối số không chuẩn đối với 'chính', ngẫu nhiên. Cho rằng, nó chỉ phục vụ để làm cho mã ví dụ của bạn khó khăn hơn cho một người mới để hiểu ... –

Các vấn đề liên quan