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?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?
Trả lời
Đây là mã trong C sẽ xóa tệp thi hành sau khi thực thi.
#include <Windows.h>
#include <strsafe.h>
#define SELF_REMOVE_STRING TEXT("cmd.exe /C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del /f /q \"%s\"")
void DelMe()
{
TCHAR szModuleName[MAX_PATH];
TCHAR szCmd[2 * MAX_PATH];
STARTUPINFO si = {0};
PROCESS_INFORMATION pi = {0};
GetModuleFileName(NULL, szModuleName, MAX_PATH);
StringCbPrintf(szCmd, 2 * MAX_PATH, SELF_REMOVE_STRING, szModuleName);
CreateProcess(NULL, szCmd, NULL, NULL, FALSE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
void main()
{
/* Do what you need */
/* Call this function at the very end of your program to delete itself */
DelMe();
}
Đó là một câu hỏi đủ hợp pháp nhưng có vẻ như bạn không hiểu cách thực thi hoạt động. Thực thi đặt chương trình vào bộ nhớ để xóa tệp đĩa là không đáng kể (miễn là bạn cũng không xóa các phụ thuộc thời gian chạy).
Nếu nó được thực hiện trong bộ nhớ, tại sao tôi không thể (trong cửa sổ) xóa thực thi nếu chương trình đang chạy ? –
Các vị trí thực thi ** các phần ** của chương trình trong bộ nhớ - nhiều trang có thể được để lại trên đĩa để tải sau, đó là lý do tại sao hầu hết các hệ điều hành không cho phép bạn xóa tệp đại diện cho quá trình thực thi. –
Ah, tôi hiểu rồi. Đó là những gì tôi nghĩ sẽ xảy ra. –
Trên Unix, chỉ cần gọi bỏ liên kết (2) trên thực thi.
Trên Windows, bạn cần quy trình thứ hai để trợ giúp bạn. Phản hồi từ st0le dường như là hủy liên kết một DLL, nhưng đối với một tệp thực thi, bạn sẽ cần phải bắt đầu một quy trình thứ hai hoặc sử dụng một quy trình hiện có, và sau đó chấm dứt thực thi của bạn và có quá trình thứ hai thực hiện việc xóa.
Cách tiếp cận rất đơn giản là sử dụng cmd.exe để trợ giúp.
Phương pháp đầu cơ sử dụng bất kỳ quy trình nào khác có thể phân bổ bộ nhớ trong một quy trình khác và đặt tên tệp bạn muốn xóa ở đó, sau đó sử dụng CreateRemoteThread() để tạo chuỗi bị treo trong quá trình từ xa với điểm vào DeleteFile với một đối số của một con trỏ đến bộ nhớ mà bạn đã cấp phát. Sau đó thoát khỏi quá trình của bạn, số lượng đình chỉ chuỗi nên giảm và sau đó DeleteFile nên được gọi để xóa tệp của bạn.
Sự cố: Rò rỉ bộ nhớ trong quá trình từ xa, lộn xộn.
Một cách dễ dàng hơn có thể chỉ là để có một DLL hỗ trợ bằng cách sử dụng các kỹ thuật từ câu trả lời của st0le.
Tuy nhiên, có một cách để xóa tệp sau khi thực thi vì mỗi Uninstaller bỏ cài đặt phần mềm đã được cài đặt bởi nó & cũng xóa tệp còn lại cuối cùng, chính nó sao cho không có tệp nào còn lại trong Đĩa cứng của chúng tôi ngoại trừ một số mục đăng ký không phụ thuộc vào nền tảng mà nó đã được cài đặt.
std::remove(argv[0])
trước khi trở về chính có thể thực hiện.
Bạn thực sự không thể chắc chắn 100% rằng 'argv [0]' chứa một đường dẫn thích hợp đến tệp thực thi. Nó có nghĩa vụ phải, nhưng không có thực thi và có những trường hợp trong đó điều này là bị hỏng vì một lý do này hay cách khác. – dmckee
Điều này sẽ không hoạt động trên Windows. –
Đối với Windows, hãy thử điều này. Nó là cơ bản tung ra một tập tin .bat mà vòng cho đến khi sự tàn phá là thành công:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
- 1. Có thể viết chương trình tự hủy hoại trong C?
- 2. Làm cách nào để viết chương trình lọc trong C?
- 3. Làm thế nào để một chương trình java quyết định lệnh nào sẽ thực thi tùy thuộc vào os
- 4. Hiểu một chương trình tự xóa trong C++
- 5. C# Làm thế nào để thực thi mã sau khi xây dựng đối tượng (postconstruction)
- 6. Làm cách nào để tạo chương trình Java thực thi?
- 7. Làm thế nào để thực hiện một chương trình C++ nghe lệnh hệ thống
- 8. Viết mã opcode PHP và thực thi nó. Làm thế nào để làm gì?
- 9. python: lỗi nhập sau khi thực hiện chương trình thực thi
- 10. Làm thế nào để tạo lại thư mục bin trong Eclipse sau khi nó bị xóa?
- 11. Trong GDB, làm cách nào để thực thi lệnh tự động khi chương trình dừng? (như hiển thị)
- 12. Thực thi chương trình C trong Linux ga
- 13. Làm thế nào để chạy chương trình được viết cho trình biên dịch cũ?
- 14. Làm thế nào để hiển thị một cửa sổ trong Qt và xóa nó ngay sau khi nó đóng cửa?
- 15. Làm thế nào để viết và thực hiện một chương trình hello world trong tập tin cho R?
- 16. Trong GDB trên MinGW, làm thế nào để làm cho Ctrl-C dừng chương trình?
- 17. Tại sao khó viết các chương trình C di động?
- 18. Cách nhanh nhất để viết & biên dịch một chương trình C/C++ trong Windows
- 19. Làm thế nào để gỡ lỗi một chương trình khi nó treo w/out ngoại lệ?
- 20. Làm cách nào để thực thi mô-đun node.js như một tiến trình con của một chương trình node.js?
- 21. Làm thế nào để bộ tiền xử lý C thực thi mã trong khi biên dịch?
- 22. Làm thế nào để làm cho chương trình của tôi là một quá trình nền
- 23. Khi truy cập, có cách nào để thực thi mã khi chấm dứt chương trình không?
- 24. Làm cách nào để kết thúc chương trình C++ sau khi bị lỗi?
- 25. Làm thế nào để bạn đặt một điều kiện "NẾU BỎ" trong một chương trình C#?
- 26. Làm cách nào để xóa một tệp trong Sinatra sau khi nó được gửi qua send_file?
- 27. Làm thế nào để thực thi thứ tự bit struct với trình biên dịch GCC?
- 28. Làm thế nào để chạy một chương trình thực thi với tập tin cấu hình khác nhau?
- 29. Làm thế nào để tạo biểu đồ phụ thuộc chương trình cho chương trình C?
- 30. Làm thế nào để thực hiện tuần tự trong C++
Bây giờ tại sao bạn sẽ muốn làm điều đó, tôi tự hỏi? –
@Neil: đó là một cái bẫy! – BoltClock
@Neil: để nhận được công việc @ 007's. Tôi muốn có một công việc ở đó, vì vậy tôi đang upvoting bất kỳ câu trả lời tốt. –