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?
Trả lời
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.
Hoạt động tuyệt vời - cảm ơn! –
Ok, +1 rồi :). –
Ở đâ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
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.
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.
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.
Reverse Little John! –
Nhưng những gì về B - nó giống như tự tử đôi đã đi sai. –
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
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?
Đó là việc gõ các đối số wackiest vào main() mà tôi từng thấy. – blueshift
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
Đó 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 ... –
- 1. PostgreSQL: hủy truy vấn từ chương trình C/C++
- 2. Tương đương với ctrl c trong lệnh hủy chương trình
- 3. Có hủy bỏ hiệu suất chương trình trong OpenGL không?
- 4. Tôi có thể viết các chương trình mạng dựa trên Ethernet trong C++ không?
- 5. Làm cách nào để viết chương trình lọc trong C?
- 6. mức phá hoại mặc định làm
- 7. Có thể lưu trữ CLR trong chương trình C không?
- 8. Làm cách nào để viết tệp tiêu đề C có thể được sử dụng trong các chương trình C++?
- 9. Chương trình tự tái tạo
- 10. LISP - cấu trúc phá hoại và không phá hủy
- 11. Có thể viết một chương trình trong C mà không có gì - thậm chí không chiếm bộ nhớ?
- 12. Tại sao khó viết các chương trình C di động?
- 13. Hiểu một chương trình tự xóa trong C++
- 14. Lỗi chế độ hỗn hợp C++/CLI: tham nhũng đống trong atexit (đăng ký hủy hoại tĩnh)
- 15. Viết chương trình C di động - điều cần xem xét?
- 16. c + +, được bảo vệ cơ sở ảo trừu tượng tinh khiết hủy hoại riêng ảo
- 17. C# - Chương trình không có cửa sổ
- 18. Thực hiện chương trình từ bên trong chương trình C
- 19. Cách nhanh nhất để viết & biên dịch một chương trình C/C++ trong Windows
- 20. C chương trình: __start
- 21. Trình chỉnh sửa có thể viết khác?
- 22. Chương trình .net có thể được viết cho windows hoạt động trên OSX không?
- 23. Cách tạo chương trình tự động khởi động C++
- 24. Làm cách nào để viết chương trình tự cập nhật trong Java?
- 25. Làm thế nào để viết một chương trình trong C++ sao cho nó sẽ tự xóa sau khi thực thi?
- 26. Bạn tạo chương trình C++ tự do như thế nào?
- 27. Làm cách nào một UserControl có thể tự hủy?
- 28. Có thể có nhiều hơn một phương thức main() trong chương trình C# không?
- 29. Có thể viết trực tiếp chương trình với các hướng dẫn bytecode Java không?
- 30. Ping từ một chương trình C/C++
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ó. –