Wie schreibt man ein Programm in C++ so, dass es sich nach der Ausführung selbst löscht?Wie schreibt man ein Programm in C++ so, dass es sich nach der Ausführung selbst löscht?
Antwort
Hier ist der Code in C, der die ausführbare Datei nach der Ausführung löschen wird.
#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();
}
Es ist eine rechtmäßige Frage, aber es scheint, dass Sie nicht verstehen, wie ausführbare Dateien funktionieren. Die Ausführung platziert das Programm im Speicher, so dass das Löschen der Datenträgerdatei trivial ist (vorausgesetzt, dass Sie Laufzeitabhängigkeiten nicht löschen).
Wenn es im Speicher ausgeführt wird, warum kann ich nicht (in Windows) die ausführbare Datei löschen, wenn das Programm ausgeführt wird ? –
Ausführungsorte ** Teile ** des Programms im Speicher - viele Seiten können auf der Festplatte verbleiben, um später geladen zu werden. Aus diesem Grund ist es in den meisten Betriebssystemen nicht möglich, die Datei zu löschen, die einen ausgeführten Prozess darstellt. –
Ah, ich verstehe. Das war hauptsächlich, was ich dachte, würde passieren. –
Auf Unix, rufen Sie einfach unlink (2) auf die ausführbare Datei.
Unter Windows benötigen Sie einen zweiten Prozess, um Ihnen zu helfen. Die Antwort von st0le scheint zu sein, eine DLL zu entkoppeln, aber für eine ausführbare Datei müssten Sie einen zweiten Prozess starten oder einen vorhandenen Prozess verwenden, und dann Ihre ausführbare Datei beenden und den zweiten Prozess ausführen lassen.
Ein sehr einfacher Ansatz wäre die Verwendung von cmd.exe zu helfen. Ein spekulativer Ansatz, der einen anderen Prozess verwendet, könnte darin bestehen, Speicher in einem anderen Prozess zuzuweisen und den zu löschenden Dateinamen dort einzufügen. Anschließend CreateRemoteThread() verwenden, um einen gesperrten Thread im Remote-Prozess mit einem Einstiegspunkt zu erstellen DeleteFile mit einem Argument eines Zeigers auf den Speicher, den Sie zugewiesen haben. Dann beenden Sie Ihren Prozess, die Anzahl der Threadaussetzer sollte dekrementieren und dann DeleteFile sollte aufgerufen werden, um Ihre Datei zu löschen.
Probleme: Speicherleck im Remote-Prozess, chaotisch.
Ein einfacherer Weg könnte einfach sein, eine unterstützende DLL zu verwenden, die die Techniken aus st0les Antwort verwendet.
Es gibt jedoch eine Möglichkeit, die Datei nach der Ausführung selbst zu löschen, da jedes Deinstallationsprogramm die Software, die von ihm installiert wurde, nicht löscht & löscht auch die letzte verbleibende Datei, dh sich selbst, so dass keine Dateien auf unserer Festplatte übrig bleiben einige Registry-Einträge unabhängig von der Plattform, die es installiert wurde.
std::remove(argv[0])
vor der Rückkehr in den Haupt es tun kann.
Sie können nicht wirklich 100% sicher sein, dass 'argv [0]' einen richtigen Pfad zur ausführbaren Datei enthält. Es soll, aber es gibt keine Durchsetzung und es gibt Fälle, in denen dies aus dem einen oder anderen Grund gebrochen ist. – dmckee
Dies funktioniert nicht unter Windows. –
Für Windows versuchen Sie dies. Es startet im Grunde eine .bat-Datei, die die Zerstörung ist sucessful Schleifen bis:
http://www.codeproject.com/Articles/4027/Writing-a-self-destructing-exe-file
- 1. Kerndaten-Datenbank löscht sich selbst
- 2. FileUpload-Steuerelement löscht sich selbst
- 3. Linux C - Implementierung der Fähigkeit, dass ein Programm sich selbst aktualisieren kann
- 4. Ist es möglich, ein selbstzerstörerisches Programm in C zu schreiben?
- 5. Ziel C - Gibt es einen Schlüsselpfad, der dazu führt, dass ein Objekt sich selbst zurückgibt?
- 6. Wie schreibt man ein C- oder C++ - Programm, das als Speicher- und CPU-Zyklus-Füller dient?
- 7. Wie schränkt man ein Flex-Programm so ein, dass es nur von meiner Website läuft?
- 8. Kann ein laufendes Python-Programm sich selbst überschreiben?
- 9. Kann ein Objekt sich selbst aus einem C++ - Standardcontainer löschen?
- 10. Wie schreibt man es schön?
- 11. C++ Struktur in sich selbst?
- 12. Nach dem Erzeugen Protokolldatei, wie man schreibt es in CSV
- 13. , wie man sicherstellen, dass es in C#
- 14. Wie schreibt man Schleife in C so Compiler kann Verzweigung auf Null nach Dekrement verwenden
- 15. Wie erstellt man infinit Iframe, das sich selbst enthält? So
- 16. Was sind die möglichen Gründe dafür, dass selbst nach erfolgreicher Ausführung die Kontrolle nicht zurückkommt?
- 17. Selbst Ausführung Funktionen
- 18. Python-Programm verlangsamt Computer nach mehrmaliger Ausführung
- 19. Wie schreibt man Stylesheets nach JSDOM?
- 20. So beenden Sie ein Programm mit gemischten C/C++ sauber
- 21. Wie schreibt man C++ Audio-Verarbeitungsanwendungen?
- 22. Wie kann ein UserControl sich selbst zerstören?
- 23. Wie fragt ein Programm nach Administratorrechten?
- 24. Xcode: Breakpoints deaktivieren sich selbst
- 25. Wie kann ein Prozess sich selbst töten?
- 26. Wie man Eingaben in Arrays schreibt, ohne dass ein Komma zwischen den Eingängen benötigt wird
- 27. C++ - Programm hängt an ntdll.dll Ausführung
- 28. Wie schreibt man sich zwei WCF Serviceverträge mit Autofac
- 29. Wie schreibt man benutzerdefinierte Ausnahmen in C#?
- 30. Wie man DataRow in C# fett schreibt?
Nun, warum möchten Sie tun mögen, dass, frage ich mich? –
@Neil: Es ist eine Falle! – BoltClock
@Neil: um einen Job @ 007 zu bekommen. Ich möchte auch einen Job dort haben, also habe ich eine gute Antwort. –