2012-04-25 27 views
7

Bunu kaldırırsanızC kendinden silme programı ++ anlama

#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); 
    } 
} 

kendinden silme programı yoktur.
Herkes bana nasıl çalıştığını açıklayabilir mi? (Ben şeyleri anlamak gibi) bunun bir wmain ve çalıştırma unicode kullanmak dönüştürürseniz

+0

bir açıklama bu. – Benj

+0

Dosya adı dizesi ascii kodlama olduğu için .Maybe _T() 'yi ekleme etrafında ekleyebilirsiniz. – pl8787

+0

Haha, bunu yaptım, derledim, yani çalışma zamanında çalışmıyor. – Benj

cevap

8

İşte ... Odd çalışmıyor,

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

Yani, bu programın tanıtıcısı CreatProcess tutamıyor mu? Ama hala nasıl çalıştığını anlamıyorum. Çıkarsam, programın kendini silmesi için yeterli zaman yok mu? – pl8787

+1

FILE_FLAG_DELETE_ON_CLOSE tanıtıcısı çok erken kapanırsa, 1.exe işlemi hala devam ettiği için silme başarısız olur. Kolu kaplayan bir çocuğu piyasaya sürerek, 1.exe'nin kolu, çocuk kapandığında silinmesine izin vererek kapanır. – Benj

+0

Çok teşekkürler ~ Sanırım ne demek istediğini anlıyorum. – pl8787