2012-04-25 5 views
7

における自己消去プログラムを理解することは、自己削除プログラム私は、この削除した場合C++

#include <windows.h> 
#include <stdio.h> 

void main(int argc, char* argv[]) 
{ 
    STARTUPINFO si = {0}; 
    PROCESS_INFORMATION pi = {0}; 
    si.cb = sizeof(si); 

    if (argc == 1) 
    { 
     SECURITY_ATTRIBUTES sa; 
     sa.nLength = sizeof(sa); 
     sa.lpSecurityDescriptor = NULL; 
     sa.bInheritHandle = TRUE; 

     CopyFile(argv[0], "1.exe", FALSE); 
     MoveFile(argv[0], "2.exe"); 

     CreateFile("1.exe", 0, FILE_SHARE_READ, &sa, 
      OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); 

     CreateProcess(NULL, "1.exe x", NULL, NULL, 
      TRUE, 0, NULL, NULL, &si, &pi); 
    } 
    else if (argc == 2) 
    { 
     while(!DeleteFile("2.exe")); 

     CreateProcess(NULL, "net", NULL, NULL, TRUE, 
      DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 
    } 
} 

があります:それは働くことができないCreateProcess(NULL, "net", NULL, NULL, TRUE, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); を。
誰でも私にその仕組みを説明できますか?ここで

+0

です。 – Benj

+0

ファイル名の文字列はアスキーコードなので、_ng()を追加することができます。 – pl8787

+0

ああ、私はそれをやった、それはコンパイルした、私はそれが実行時に動作しないことを意味します。 – Benj

答えて

8

は...あなたはwmainと実行ユニコードを使用するためにこれを変換する場合、それは動作しません奇数(私は物事を理解して)説明

void main(int argc, char* argv[]) 
{ 
    STARTUPINFO si = {0}; 
    PROCESS_INFORMATION pi = {0}; 
    si.cb = sizeof(si); 

    if (argc == 1) 
    { 
     SECURITY_ATTRIBUTES sa; 
     sa.nLength = sizeof(sa); 
     sa.lpSecurityDescriptor = NULL; 
     sa.bInheritHandle = TRUE; 

     // Make a copy of ourselves which we'll use to delete the version we were run from 
     CopyFile(argv[0], "1.exe", FALSE); 

     // Rename the running copy of ourself to another name 
     MoveFile(argv[0], "2.exe"); 

     // Make sure we delete the copy of ourselves that's going to delete us when we die 
     CreateFile("1.exe", 0, FILE_SHARE_READ, &sa, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); 

     // Invoke the process that will delete us 
     // allowing it to inherit the handle we just created above. 
     CreateProcess(NULL, "1.exe x", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); 
    } 
    else if (argc == 2) 
    { 
     // Wait for the original program to die (deleting us and closing a handle), then delete it 
     while(!DeleteFile("2.exe")); 

     // Launch a child process which will inherit our file handles 
     // -- This keeps the file handle with FILE_FLAG_DELETE_ON_CLOSE (which we inherited) alive beyond our lifetime 
     // this allowing us to be deleted after we've died and our own handle is closed. 
     CreateProcess(NULL, "notepad", NULL, NULL, TRUE, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 
    } 
} 
+0

CreatProcessはこのプログラムのハンドルを保持していますか?しかし、私はまだそれがどのように機能するのか理解していません。それを削除すると、プログラムが自分自身を削除するのに十分な時間がないのでしょうか? – pl8787

+1

FILE_FLAG_DELETE_ON_CLOSEハンドルがあまりに早く閉じられると、1.exeプロセスがまだ実行されているため、削除は失敗します。ハンドルを継承する子を起動すると、1.exeのハンドルが閉じ、子が閉じると削除されます。 – Benj

+0

ありがとうございます〜私はあなたが意味するものを理解していると思います。 – pl8787

関連する問題