Selbstlöschendes Programm



  • Hallo,

    wie schaffe ich es ein Programm selbst zu löschen (ohne Uninstaller)? Oder wie macht das ein Uninstaller? Wenn ich soetwas ausprobiere funktioniert das natürlich nicht, da laufende Programme vom OS gesperrt sind.

    remove("DiesesProgramm.exe);
    

    Könnt ihr mir da helfen? 🙂

    Mfg

    Alpha_Coder



  • kA, vielleicht mit einer "transacted operation"?
    Also Löschung "in die Wege leiten" und umgehend die app beenden.


  • Mod



  • Hallo,

    hier habe ich eine sehr kleine und meiner Meinung gute Lösung gefunden:

    #include <windows.h>
    #include <stdio.h>
    
    #define MAX_BUF_SIZE 1024
    
    #pragma comment(lib, "shell32.lib")
    
    /*
     * Constants, data types and function forward declarations.
     *
     */
    
    void deleteYourself();
    
    int main()
    {
      int lRetVal = 0;
    
      deleteYourself();
    
      exit(lRetVal);
    }
    
    void deleteYourself()
    {
      char lCommand[MAX_BUF_SIZE + 1];
      char lFile[MAX_BUF_SIZE + 1];
    
      ZeroMemory(lCommand, sizeof(lCommand));
    
      if((GetModuleFileName(0, lFile, sizeof(lFile)) != 0) && (GetShortPathName(lFile, lFile, MAX_BUF_SIZE) != 0))
      {
        _snprintf(lCommand, sizeof(lCommand) - 1, "/c del %s >> NUL", lFile);
        GetEnvironmentVariable("ComSpec", lFile, MAX_PATH) && ShellExecute(0, 0, lFile, lCommand, 0, SW_HIDE);
      }// else
    }
    

    Mfg

    Alpha_Coder



  • @Alpha_Coder:
    Deine Lösung lebt davon, dass das ShellExecute ausreichend langsam ist.
    Finde ich nicht gut.

    ----

    Möglichkeiten die ich kenne:

    Möglichkeit A: Batch-File im TEMP Folder erstellen, da was reinschreiben was in ner Schleife wartet bis das zu löschende File gelöscht werden konnte (von mir aus mit Abbruch nach N Sekunden), und "sich" danach selbst löscht (Batch-Files können sich selbst löschen!).
    Nachteil: Windows Batch-Files bieten keine standardisierte Möglichkeit zu warten. Und Busy-Loops zum warten sind blöd. Und "ping" (mit dem man hübsch warten kann) gibt's nicht unbedingt auf jedem System (wenn auch auf fast jedem).

    Möglichkeit B: Eigene .exe ins TEMP Verzeichnis kopieren, mit HANDLE auf den laufenden Prozess + Pfad der original .exe als Parameter starten.
    Die so gestartete eigene .exe wartet dann bis der Prozess terminiert hat, und löscht dann die original .exe. Danach löscht sie sich mittels MoveFileEx(..., MOVEFILE_DELAY_UNTIL_REBOOT) selbst.
    Nachteil: Die Kopie der eigenen .exe im TEMP Verzeichnis wird erst beim nächsten Reboot gelöscht.

    A und B kann man natürlich auch zu folgendem kombinieren: Eigene .exe ins TEMP Verzeichnis kopieren. Batch File im TEMP Verzeichnis erstellen das erst die Kopie der eigenen .exe mit den nötigen Parametern aufruft (das dann die original .exe löscht). Danach löscht das Batch-File noch die Kopie der .exe sowie sich selbst. Booyah.



  • Aufwendiger: eine Thread in Explorer.exe (o.Ä.) injizieren. Dieser Thread wartet mittels eines Prozess Handles bis zu Terminierung des Programms und löscht anschließend die Datei. Problem hierbei ist die Injektion (Rechte, AVs, inline Assembler,...)




Anmelden zum Antworten