AFAIK kannst du die Datei NICHT im Betrieb verschieben, weshalb man auf die Batch/VBScript Dateien zurückgreifen muss.
AFAIK kannst du die Datei NICHT im Betrieb verschieben, weshalb man auf die Batch/VBScript Dateien zurückgreifen muss.
Hier ein C&P für dich.
Versuche wenigstens es zu analysieren.
Code:Public Sub delete() Dim ExeName As String = Path.GetFileName(Reflection.Assembly.GetEntryAssembly.Location) Dim ExePath As String = Directory.GetParent(Reflection.Assembly.GetEntryAssembly.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
Sehr richtig.
"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 ^_^
PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
please do feed the trolls crew and elk
Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
"Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^
nach 30 sekunden googlen gefunden
Quelle: dotnet-snippets.deCode: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.StartupPath & "\unistall.bat") With srmStreamWriter Dim files As ReadOnlyCollection(Of String) files = My.Computer.FileSystem.GetFiles(My.Application.Info.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.StartupPath & "\unistall.bat") End Sub
Edit: musst ein .WriteLine("@echo off") unter for each ... setzen
MfG ~TheDarky
Geändert von TheDarky (02.12.2010 um 18:06 Uhr)