2010-08-11 4 views

Antwort

17

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(); 
} 
-3

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).

+0

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 ? –

+5

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. –

+0

Ah, ich verstehe. Das war hauptsächlich, was ich dachte, würde passieren. –

5

Einige Methods

Sie könnten auch eine Art von geplanten Aufgabe verwenden ...

+0

toller Artikel, "Lösung für XP +" ist wirklich genial – Andrey

4

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.

0

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.

1

std::remove(argv[0]) vor der Rückkehr in den Haupt es tun kann.

+0

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

+1

Dies funktioniert nicht unter Windows. –

Verwandte Themen