Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0476: Selbstzerstörung - eigene Exe löschen

 von 

Beschreibung 

Da eine Exe-Datei sich bekanntlicherweise nicht selbst löschen kann, wurde hier ein raffinierter Trick angewandt: Es wird eine Batch-Datei erstellt, in der eine Endlosschleife abläuft, die endlos versucht die Exe zu löschen, weil das Programm noch nicht ganz entladen sein könnte. Wenn gelöscht, entfernt sich die Batch-Datei selbst.

Das gleiche Ziel kann mit der API-Funktion "MoveFileEx" erreicht werden.

Schwierigkeitsgrad:

Schwierigkeitsgrad 1

Verwendete API-Aufrufe:

CharToOemA

Download:

Download des Beispielprojektes [2,41 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'--------- Anfang Projektdatei Selfdestruction.vbp  ---------
'--- Anfang Formular "frmsSelfdestruction" alias frmSelfdestruction.frm ---
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Beschriftungsfeld "Label1"
'Autor: Pascal Martiné

Option Explicit

Private Befehl$
Private MeFile$
Private BatFile$
Private Comment As Boolean

Private Declare Function CharToOemA Lib "user32.dll" (ByVal _
        lpszSrc As String, ByVal lpszDst As String) As Long

Private Sub Command1_Click()
    Selfdestruction
End Sub

Private Sub Command2_Click()
    Comment = True
    Selfdestruction
End Sub

Private Sub Selfdestruction()
    Dim ff As Long
    ff = FreeFile

    'verhindert das auftauchen von "\\" im Dateinamen:
    If Len(App.Path) > 3 Then 'In einem Unterverzeichnis
        MeFile = App.Path & "\" & App.EXEName & ".exe"
        BatFile = App.Path & "\" & "Kill.bat"
    Else 'Direkt auf der Festplatte
        MeFile = App.Path & App.EXEName & ".exe"
        BatFile = App.Path & "Kill.bat"
    End If
 
    'falls Attribute (wie z.B. Schreibschutz)
    'gesetzt sind, werden diese augeschaltet
    If GetAttr(MeFile) Then SetAttr MeFile, 0

    'Konvertiert Dateinamen zu ANSI-Code
    Call CharToOemA(MeFile, MeFile)
    
    'verhindert Anzeigen der Befehle im DOS-Fenster
    If Comment Then Befehl = "@echo off" & vbCrLf
    Befehl = Befehl & ":Marke" & vbCrLf
    
    'Befehl zum Zerstören der EXE
    Befehl = Befehl & "Del " & Chr(34) & MeFile & Chr(34) & vbCrLf
    
     'falls EXE noch vorhanden (Zugriff verweigert) --> zurück zu :Marke
    Befehl = Befehl & "If Exist " & Chr(34) & MeFile & Chr(34) & " Goto Marke" & vbCrLf
    
    'gibt Text aus
    If Comment Then Befehl = Befehl & "echo." & vbCrLf & _
        "echo EXE wurde zerstoert" & vbCrLf & "echo." & vbCrLf
        
    'Bat-Datei zerstört sich selbst
    Befehl = Befehl & "del " & Chr(34) & BatFile & Chr(34)


    'Bat-Datei muss binär erstellt werden
    Open BatFile For Binary As #ff
        Put #ff, , Befehl
    Close #ff
 
    If Not Comment Then
        Shell BatFile, vbHide
    Else
        Shell BatFile, vbNormalFocus
    End If
    
    End
End Sub
'--- Ende Formular "frmsSelfdestruction" alias frmSelfdestruction.frm ---
'---------- Ende Projektdatei Selfdestruction.vbp  ----------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 14 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Simon D am 20.09.2009 um 16:41

das geht ganz einfach: Setz noch ne Zeile an über
'Bat-Datei zerstört sich selbst
da schreibst du folgendes rein
Befehl = Befehl & "rmdir " & app.path
Und verzeichnis ist auch weg.

Ich würde empfehlen ein
GetShortPathName zu machen! Damit werden Pfade zu 8.3 umgewandelt.

Public Function GetShortName(ByVal sLongFileName As String) As String
Dim lRetVal As Long, sShortPathName As String, iLen As Integer
sShortPathName = Space(255)
iLen = Len(sShortPathName)

lRetVal = GetShortPathName(sLongFileName, sShortPathName, iLen)
GetShortName = Left(sShortPathName, lRetVal)
End Function

Und dann in der Prozedur:
App.Path mit ShortName ersetzen;
Dim ShortName As String
ShortName = GetShortName(App.Path)

Dann wird sicherlich die Kill.Bat auch gelöscht... Ich hatte das Problem auch.

Kommentar von Kowalski am 08.03.2009 um 07:58

Hi,

ich suche schon lange so eine Routine, jedoch wäre es schön wenn auch das Verzeichnis mit gelöscht werden würde. Der Standard-Anwendungsfall für dieses Programm ist sicherlich ein Deinstallationsprogramm. Und genau bei dieser Anwendung ist es ja auch wünschenswert das Verzeichnis mit zu löschen.

Gruß Kowalski

Kommentar von Franz am 15.11.2006 um 15:34

Bei mir (WinXP ,VB6) funktioniert das nur, wenn im Pfad keine Umlaute oder "ß" enthalten sind, sonst bleibt "KILL.BAT" stehen!

Kommentar von Markus Gries am 26.02.2004 um 02:24

Bitte noch den String BatFile nach ANSI konvertieren, bzw.:

BatFileANSI = BatFile
Call CharToOemA(BatFileANSI, BatFileANSI)

Und diese dann in der Befehlszeile verwenden.
BatFile wird in dieser Form beim Erstellen der Kill.bat nochmal gebraucht - deshalb die Kopie...

Gruß Markus

Kommentar von Joffele am 21.12.2002 um 18:11

also ich kann das projekt nicht öffnen..
kann jemand einfach mal evtl. den source hier hin posten?

Kommentar von Lukas am 02.11.2002 um 13:12

Was für einen !"§$%&/*+#-Zeichen Code benützt ihr da ?!
Die Datei, die eigentlich 'frmSelbstzerstörung.frm' heißen sollte, heißt 'frmSelbstzerst"rung.frm'.
Kein Zip-Programm kann DIE Datei jemals lesen !!
Hoffe auf bessere Codierung.
:-|

Kommentar von christian am 15.10.2002 um 09:14

BLÖÖÖDSINN

Bei mir hat er das ganze ding gar nicht erst gezeigt!
form1.frm konnte nicht gefunden werden. super!

Kommentar von Gandalf am 14.05.2002 um 20:56

Oh sorry - kannste das ändern?
gruß

Kommentar von Johannes P. am 12.05.2002 um 23:49

Du öffnest die Datei als FreeFile, gehst dann aber in den nächsten zwei Zeilen davon aus das FreeFile=1 ist!
Open BatFile For Binary As FreeFile
Put #1, , Befehl
Close #1
Besser wäre:
Dim ff as long
ff = FreeFile
open ... as #ff
put #ff,...
close #ff
Gruß,
Johannes

Kommentar von Gandalf am 30.04.2002 um 13:39

zu simon:
bei mir klappts unter winxp - was fürn vb hast du denn (und was fürn winxp-typ)
gruß

Kommentar von Simon am 29.04.2002 um 20:49

Ist echt eine gute Idee, klappt aber bei Win XP nicht mehr. Wäre es nicht möglich das ganze per VBS-Script zu machen. VBS-Scripte können sich selbst löschen, da Sie nur interpretiert und nicht ausgeführt werden.

Kommentar von Johannes Pfeiffer am 27.04.2002 um 19:23

Dieser Tipp wurde am 27. April 2002 updatet.

Kommentar von FileKiller am 03.03.2002 um 21:12

willst du etwa kill(app.path+app.exename)
machen???
das prog kann sich eben NICHT selbst killen - sonst gäbe es diesen tip nich !

Kommentar von calamari am 02.03.2002 um 15:34

wär es nicht einfacher
kill App.Path
oder so?