質問

C# アプリ自体を消去 (自己破壊) させるにはどうすればよいですか?うまくいくかもしれないと思う方法を 2 つ紹介します。

  • メインプログラムを削除する別のプログラムを提供します。では、この削除プログラムはどのようにして削除されるのでしょうか?
  • 数秒待ってからファイルを削除する CMD へのプロセスを作成します。この数秒の間に、アプリケーションを閉じます。

どちらの方法も非効率的に思えます。Windows には、そのようなことを可能にする組み込みフラグか何かがあるような気がします。どうすればいいですか?また、サンプルコードをいくつか提供していただけますか?

アップデート: ご回答ありがとうございました!試してみて、どうなるか見てみるつもりです。

まず、何人かの人々が、なぜ私のアプリでこれを行う必要があるのか​​と尋ねました。答えは次のとおりです。数日前、Joel Spolsky がブログに投稿した Project Aardvark 仕様を読みました。そこには、クライアント アプリがリモート セッション後に自身を削除すると記載されていました。これがどのように機能するのか、そしてもしこれを行う必要がある場合、どのようにしてそのような偉業を達成できるのか疑問に思っています。

提案されている内容の概要を次に示します。

  • 再起動時にファイルを削除するように Windows に指示するレジストリ エントリを作成します。
  • ping コマンドを使用して CMD を起動し、数秒待ってからファイルを削除します

もちろん、コメントで概説されているように、どちらにも欠点があります。

しかし、以下に概説するような方法は機能するでしょうか?

実行可能ファイルは 2 つあります。Program.exe と Cleaner.exe。前者はプログラム自体であり、後者は Program.exe とそれ自体を削除するアプリです (これから説明するように、メモリにロードされている場合)。Program.exe (依存関係がある) は可能ですか? 負荷 Cleaner.exe のすべて (依存関係はありません) 記憶の中に そしてそれを実行しますか?

これが可能であれば、Cleaner.exe を Program.exe 内にパッケージ化し、メモリにロードして実行できますか?

役に立ちましたか?

解決

は、 MoveFileEx のAPIがありますされ、 MOVEFILE_DELAY_UNTIL_REBOOTフラグが与えられたときに、次のシステム起動時に指定されたファイルを削除します。

他のヒント

素晴らしいものがあります コードプロジェクトの記事 この話題について。

編集: 基本的には、数秒後に指定されたファイルを削除する単純な cmd 呼び出しです。

Process.Start("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del " + Application.ExecutablePath); 
Application.Exit();

マシン上に物理的に存在する必要がある限り、これが機能することを保証することはできません。 例えば:

  • リソースを削除しようとしたときに、アプリが適切なタイミングでリソースを解放できなかった場合はどうなるでしょうか?エラーが発生し、アプリが残ってしまいます。
  • あるアプリが別のアプリを起動し、その後最初のアプリが削除される動作は次のとおりです。 非常に疑わしい AVの観点から。ユーザーのマシン上で防御機能がトリガーされ、元のアプリを強制終了しようとするプロセスが強制終了される可能性があります。
  • 再起動時にファイルを削除するなどの操作を行った場合、ユーザーがその間にファイルを移動したりコピーを作成した場合はどうなるでしょうか?元の場所にはもうなく、アプリは残っています。

アプリケーションにこのレベルのセキュリティが必要な場合は、制御するマシン上でアプリケーションをホストすることを検討してください (たとえば、Web サービスを提供し、スタブ クライアントがそのようにアクセスできるようにするなど)。

これと多少関連する話ですが、(1) 誰かのマシン上に物理的に存在する必要があり、(2) アプリが存在した証拠を削除したいという人物の動機についても推測したくなります。

答えを@Bobbyするための補正は、ケースには人々が便利なことがあります - 実行可能ファイルのパスを引用符で囲む必要があります。また、以下に隠されるべきcmd.exeのウィンドウを設定する(それ以外の場合は、黒コンソールウィンドウとして点滅)とのSystem.Windows.Formsアセンブリ(Applicationクラス)に依存することなく、実行する変換されます。

 
var exepath = Assembly.GetEntryAssembly().Location;              
var info = new ProcessStartInfo("cmd.exe", "/C ping 1.1.1.1 -n 1 -w 3000 > Nul & Del \"" + exepath + "\"");
info.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(info).Dispose();
Environment.Exit(0);

もあります FileOptions.DeleteOnClose, ただし、そのためにはファイルが書き込み用に開かれている必要があります。次のようなシーケンスで実行できるかもしれません (未テスト)。

  • プログラムは次のように起動します Original.exe, 、そしてそれ自体の名前から、自己破壊機能をトリガーする必要があることを検出します。
  • Original.exe 新しいファイルを作成します Temp.exeFileOptions.DeleteOnClose 独自のコンテンツをそこにコピーしますが、まだ閉じません
  • Original.exe 2番目の読み取り専用ハンドルを開きます Temp.exe そして最初の書き込みハンドルを閉じます。読み取り専用ハンドルは、ファイルを開いたままにして自動削除を遅らせながら、実行ハンドルと共存できます。
  • Original.exe 打ち上げる Temp.exe. Temp.exe 一時ディレクトリから起動されたことを検出し、自己破壊シーケンスをバイパスして通常の動作を継続します。
  • Original.exe 終了します(読み取り専用ハンドルを取得して Temp.exe それと。)
  • Temp.exe 走り続けます。終了すると、ファイルは Temp.exe 今後は使用されなくなりますので、自動的に削除されます。

編集 #2:実際には、これは可能ではないと思います。なぜなら、カーネルがファイルを開くことに依存しているからです。 FILE_SHARE_DELETE フラグですが、それはありそうにありません。

NJによって並べ替え C#の 他のコードはシンプルなので動作しません。 uがデル・アプリケーションにループ風呂ファイルを作成する場合と、 バッチファイルそのもの uが使用したいいけない場合uがプロセスを殺すためにtakkillコマンドを使用することができます application.close方法

        `string delname = "test.cmd";
        string fileurl = Application.ExecutablePath;
        System.IO.StreamWriter file = new System.IO.StreamWriter(delname);
        file.WriteLine(":Repeat");
        file.WriteLine("del \"" + fileurl + "\"");
        file.WriteLine("if exist \"" + fileurl + "\" goto Repeat");
        file.WriteLine("del \"" + delname + "\"");
        file.Close();
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.CreateNoWindow = true;
        startInfo.UseShellExecute = false;
        startInfo.FileName = delname;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        Process.Start(startInfo);`

` TH3の3E3 1は、3D部品OVものではありません I5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

を考え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 + "\"");

;>

私はあなたが古いバージョンを使用して更新しないことを選択した場合、リフレクタは自身を削除します知っています。あなたはそれが何をするかを理解しようとするかもしれません。私はFileMonユーティリティを起動し、これを達成するために、任意のプロセスを生成かどうかを確認します。

私のアプリケーション(Windowsサービス)は、Windowsインストーラによってインストールされているので、私はこれを使用して、自己削除します:

Dim uninstall_params As String = "/x {MY-PRODUCTS-GUID} /qn /norestart REBOOT=ReallySuppress"
proc.StartInfo = New ProcessStartInfo("msiexec.exe", uninstall_params)
proc.Start()
Environment.Exit(-1)

申し訳ありません - それはVBでですが、それはC#に簡単に変換可能でなければならない。

のWindows 7&8で動作し、**あなたが管理者権限でアプリケーションを実行確認するか、エラーが発生します。

「Application.Exitを();」

このコードは、私は私がそれを追加することによって、私のために働く作られた完全な信用を取ることができないので、別の場所に存在します。

static void autodelete()
{
    string batchCommands = string.Empty;
    string exeFileName = Assembly.GetExecutingAssembly().CodeBase.Replace("file:///", string.Empty).Replace("/", "\\");

    batchCommands += "@ECHO OFF\n";                         // Do not show any output
    batchCommands += "ping 127.0.0.1 > nul\n";              // Wait approximately 4 seconds (so that the process is already terminated)
    batchCommands += "echo j | del /F ";                    // Delete the executeable
    batchCommands += exeFileName + "\n";
    batchCommands += "echo j | del deleteMyProgram.bat";    // Delete this bat file

    File.WriteAllText("deleteMyProgram.bat", batchCommands);

    Process.Start("deleteMyProgram.bat");
    Application.Exit();
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top