PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sich selbst löschende EXE. Wie geht das?



c00p3r
29.11.2010, 14:06
Was muss ich machen damit sich meine .exe selber löscht.
Code Bsp. wär super.

Thx in advance

EDIT: [vb .net]

100
29.11.2010, 14:16
Du brauchst eine externe Anwendung oder ein Script (soweit ich weiß).
Also zum Beispiel Batch oder vbs, wobei Batch hier wohl geeigneter wäre.

r4iden
29.11.2010, 14:16
Super Sache. Gibt sowas Namens Google.
Google (http://www.google.de/#hl=de&safe=off&q=vb.net+selbstl%C3%B6schende+exe&aq=f&aqi=&aql=&oq=&gs_rfai=&fp=4624c7bbf63615f0)

Findet man auf anhieb was mit den Suchwörtern: "VB.net Selbstlöschende Exe"

Jut4h.tm
29.11.2010, 14:23
Also:
naja kenne mich zwar nicht mit .net aus aber es geht überall so:



@echo off
ping -n 1 127.0.0.1 > NUL
del "deineexe.exe"
del %0
exit


das schreibste in ne Datei die im selben Verzeichnis ist wie deine exe...
die datei muss die Endung .bat haben dann startest du sie hidden...
fertig ;-)

die Zeile:
ping -n 1 127.0.0.1 > NUL
ist eine "sleep" anweisung die 1 steht für eine sekunde musste sehen ob du das überhaupt brauchst... oder vll. noch länger machst

WICHTIG:
du musst die exe natürlich beenden ... also die bat ausführen und dann deine exe sofort beenden!

CYSER
29.11.2010, 17:43
Mit der Move-File api in den temp ordner schieben und beenden, ist zwar kein löschen reicht aber eig.

_MrKode
29.11.2010, 22:15
AFAIK kannst du die Datei NICHT im Betrieb verschieben, weshalb man auf die Batch/VBScript Dateien zurückgreifen muss.

Mofo
29.11.2010, 23:43
Anstat das mit der Batch zu machen und die dann als Leiche uaf dem System zu lassen, solltest du die cmd.exe direkt ansprechen und
ping 0.0.0.1 -n 1 -w 1000 del "Pfad deiner exe" o.ä als Parameter übergeben was deiner Applikation Zeit lässt sich selbst zu beenden bevor Windows versucht sie zu löschen..

CYSER
30.11.2010, 10:55
AFAIK kannst du die Datei NICHT im Betrieb verschieben, weshalb man auf die Batch/VBScript Dateien zurückgreifen muss.

Kannst du sehr wohl, probier es doch mal aus ;)

BlackHook
30.11.2010, 11:42
Hier ein C&P für dich.
Versuche wenigstens es zu analysieren.


Public Sub delete()
Dim ExeName As String = Path.GetFileName(Reflection.Assembly.GetEntryAssem bly.Location)
Dim ExePath As String = Directory.GetParent(Reflection.Assembly.GetEntryAs sembly.Location).FullName
Dim BatFile As String
BatFile = ExePath & "\" & "del.bat"

Dim FileStr As FileStream = New FileStream(BatFile, FileMode.Create)
Dim StrWriter As StreamWriter = New StreamWriter(FileStr)
StrWriter.WriteLine(":schleife ")
StrWriter.WriteLine("erase " & ExeName)
StrWriter.WriteLine("if exist " & ExeName & " goto schleife")
StrWriter.WriteLine("erase %0")
StrWriter.Close()
Shell(BatFile, vbHide)
End Sub

blackberry
30.11.2010, 12:57
AFAIK kannst du die Datei NICHT im Betrieb verschieben
Sehr richtig.


weshalb man auf die Batch/VBScript Dateien zurückgreifen muss.
"Müssen" ist immer eine sehr einseitige Art ein Problem zu lösen.
Wer nicht gerne eine Datei droppt (welche sich ja eigentlich um unauffällig zu bleiben auch löschen müsste; auch das TEMP-Dir wird nicht ständig einfach so vom System geleert), der kann das Programm auch in einen neuen Prozess forken (bei C&P-lern oft als "RunPE" bekannt) und anschließend den ursprünglichen Prozess beenden, worauf die neue Instanz die nunmehr unverwendete Ausgangsdatei löschen kann.

Der Ablauf könnte beispielsweise so aussehen:
1. Programm A startet
2. es wird geprüft, ob sich das Programm im Systemordner befindet (generisch kann man das sehr gut mit GetModuleFileName und GetSystemDirectory machen)
3. Befindet es sich NICHT im Systemordner, so kann angenommen werden, dass es gerade vom Benutzer gestartet wurde; das Programm startet nun einen weiteren Prozess aus dem Sysdir (mspaint.exe, calc.exe, oder etwas was mehr nach einem wichtigen Systemprozess aussieht; svchost oder sonst was - was halt da ist eben), dem es als Argument (geht ganz normal via CreateProcess; nennen wir dieses neu gestartete Programm mal Programm B) den Pfad zu sich selbst (GetModuleFileName) übergibt und macht den Rest aus dem alt-bekannten RunPE-Muster.
4. Programm A beendet sich
5. Programm B wurde gerade gestartet und ist ja weil Programm A sich selbst in den Prozess injeziert hat mit Programm A identisch; es führt also auch Schritt 2 durch. Der Unterschied ist hierbei, dass das Programm ja nun als beispielsweise mspaint.exe im Sys-Ordner läuft - d.h. es forkt nicht ein zweites mal, sondern kann etwas anderes machen.
6. Programm B wartet 1 Sekunde (muss nicht sein; aber so kann man sicherstellen, dass Programm A zu der Zeit wirklich beendet ist)
7. Programm B hat ja den Pfad zu Programm A als Argument erhalten - weiß also wo Programm A auf der Festplatte liegt --> Programm B löscht Programm A.
8. Programm B macht was es eigentlich machen soll (die Spuren sind verwischt; Programm B läuft unter dem Namen eines anderen Prozesses und sieht damit unauffällig aus)

Ein weiterer Vorteil ist auch noch, dass Programm B ja im Weiteren als ein vermeindlich systemeigener Prozess läuft. Der User würde also auch mit dem Taskmanager keinen auffälligen Prozess erkennen.

Aber hey - wozu erzähle ich das eigentlich? Das kriegt hier doch eh keiner zusammengepastet ^_^

_MrKode
30.11.2010, 13:10
Auf die Idee mit der Verknüpfung von CreateProcess und dem Löschen der Datei wäre ich jetzt echt nicht gekommen. Danke für die Idee, werde eventuell in Kürze mal einen POC schreiben oder so. Arbeite mich atm wieder in die WinAPI Programmierung ein.

Mofo
30.11.2010, 13:36
Ein Poc wäre das aber nicht, denn das gab es schon hundertfach ;)

c00p3r
30.11.2010, 15:23
Danke erstmal an alle
@BlackHook (http://free-hack.com/member.php?u=54458) danke für den C&P hab ihn verstanden
Schleife ist vlt nicht ganz sinnvoll, weil sich der Prozess aufhängt, wenn er die Datei nicht löschen kann. Bin gewohnt "del" und nicht "erase" zu benutzen, ist aber glaub das selbe.

@BlackBerry ok, hab ich auch verstanden daher thx. Quasi per runPE eine Anwendung starten, welche die eigentliche Datei löscht. Da diese Methode jedoch um einiges aufwendiger ist, denk ich dass ich mich erstmal mit der relativ simplen batch datei methode zufrieden geben werde.

EDIT: hab verstanden warum ne Schleife sinn macht^^ alternative wäre die ping variante von Jut4h.tm (http://free-hack.com/member.php?u=35690)

@Mofo
Batch dateien können sich selber löschen, weshalb es keine Leiche geben würde

TheDarky
02.12.2010, 18:04
nach 30 sekunden googlen gefunden ;)



Private Sub MyApplication_Shutdown(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Shutdown
Using srmStreamWriter As New IO.StreamWriter(System.Windows.Forms.Application.S tartupPath & "\unistall.bat")
With srmStreamWriter
Dim files As ReadOnlyCollection(Of String)
files = My.Computer.FileSystem.GetFiles(My.Application.Inf o.DirectoryPath, FileIO.SearchOption.SearchAllSubDirectories, "*.*")
For Each f As Object In files
.WriteLine("@ECHO Datei """ & f.ToString & """ wird entfernt...")
.WriteLine("@CD /D %~d0%~p0")
.WriteLine("@ERASE /Q /F """ & f.ToString & """")
.WriteLine("@ECHO Vorgang abgeschlossen.")
Next

End With
End Using
Process.Start(System.Windows.Forms.Application.Sta rtupPath & "\unistall.bat")
End Sub

Quelle: dotnet-snippets.de (http://dotnet-snippets.de/)

Edit: musst ein .WriteLine("@echo off") unter for each ... setzen

MfG ~TheDarky