How can I make my C# app erase itself (self-destruct)? Here\'s two ways that I think might work:
You will never be able to guarantee that this will work, as long as you require a physical presence on the machine. For example:
If your application requires this level of security, consider hosting it on a machine you control (e.g., by providing a web service and letting a stub client access it that way).
On a somewhat related note, one is also tempted to speculate about the motives of someone who (1) requires a physical presence on someone's machine and (2) wants to delete the evidence that the app existed.
Think CMD
int sectosleep = 5000;
string exename = "yourexe.exe";
string location = @"c:\yourexe.exe"
Process.Start("cmd.exe", "/C taskkill /f /im " + exename + " & ping 1.1.1.1 -n 1 -w " + sectosleep + " > Nul & Del /F /Q \"" + location + "\"");
;>
This is the Uninstall.exe:
Shutdown.
Wait for 3 sec.
Try to kill that task if it is still running.
Wait for 3 sec.
Delete the app directory with the Uninstall.exe in it.
public void Uninstall()
{
var delPath = AppDomain.CurrentDomain.BaseDirectory;
var procId = Process.GetCurrentProcess().Id;
var psi = new ProcessStartInfo
{
FileName = "cmd.exe",
Arguments = $"/C timeout 3 & Taskkill /F /PID {procId} & timeout 3 & rd /s /q \"{delPath}\"",
CreateNoWindow = true,
WindowStyle = ProcessWindowStyle.Hidden
};
Process.Start(psi);
Application.Current.Shutdown();
}
There's a great CodeProject Article about this topic.
Edit: Basically it's a simple cmd-call which will delete the specified files after some seconds.
Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath);
Application.Exit();
There's a MoveFileEx API, which, when given a MOVEFILE_DELAY_UNTIL_REBOOT
flag, will delete specified file on next system startup.
There is also FileOptions.DeleteOnClose
, but that requires the file to be open for writing. You might be able to do it with a sequence like this (untested):
Original.exe
, and detects (from its own name) that it needs to trigger the self-destruct function.Original.exe
creates a new file Temp.exe
with FileOptions.DeleteOnClose
and copies its own content into it, but does not close it yetOriginal.exe
opens a second, read-only handle to Temp.exe
and closes the first write handle. The read-only handle can co-exist with an execute handle, whilst keeping the file open to delay auto-deletion.Original.exe
launches Temp.exe
. Temp.exe
detects that it has been launched from the temp directory and bypasses the self-destruct sequence and continues normal operation.Original.exe
exits (taking its read-only handle to Temp.exe
with it.)Temp.exe
continues running. When it exits, the file Temp.exe
will no longer be in use so it will be deleted automatically.Edit #2: Actually I don't think this is possible, because it relies on the kernel opening the file with the FILE_SHARE_DELETE
flag, which is unlikely.