1. 程式人生 > >bat批處理自刪除

bat批處理自刪除

   今天突然發現bat可以自刪除,驚訝之餘很慚愧,現在才知道!

不過我平時很少用bat批處理的。

   del  reg.bat

網路的:

   ////////////////////////////////////////////////////////////////////////////////////////

del %0 以及一些呼叫cmd的刪除方法是錯誤的

原因在於exe 或者 bat在執行的時候 自身的程序仍然存在

所以我們就會看見好些 木馬 病毒 殘留的exe 以及 bat

下面給出絕對可以自刪除的程式!

start del /f /q fuckjapanpig.exe

很簡單也是呼叫了cmd ,把它加在最後一行就行了!此時程式已經執行完,不存在程序了!

//////////////////////////////////////////////////////////////////////////////////////////

VC程式自刪除

有時候,我們需要建立一個執行後能夠自己刪除自己的可執行程式即自刪除檔案。很明顯如果一個程序通過直接呼叫DeleteFile()來刪除自己是不可能的。必須另想辦法,經過本人在網上參考很多資料後實際測試並集眾家之所長,發現有二種方法效果比較好。現在將其封裝成函式,這樣使用將更加容易:

方法1,呼叫BAT檔案。

//向指定檔案寫入文字。如果檔案不存在就建立。

int WriteTextToFile(const char szFileName[], const char *lpszText)

{

       FILE *pfile = fopen(szFileName, "w+");

       if (pfile == NULL)

              return -1;

       int nWriteByte = fprintf(pfile, lpszText);

       fclose(pfile);

       return nWriteByte;

}

void DeleteApplicationSelf()

{

       const char szFileName[] = "DeleteBat.bat"; //使用批處理

       const char szDeleteBatText[] = "@ echo off\r\ndel %%1\r\ndel %%0";

       //建立BAT檔案並寫入內容

       WriteTextToFile(szFileName, szDeleteBatText);

       //設定本程式程序基本為實時執行,快速退出。

       SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

       SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

       //通知資源管理器不顯示本程式,當然如果程式沒有真正的刪除,重新整理資源管理器後仍會顯示出來的。

    SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);

       //執行bat檔案來刪除程式

       ShellExecute(NULL, "open", "DeleteBat.bat", _pgmptr, NULL, SW_HIDE);

       ExitProcess(0);

}

呼叫起來非常方便:直接一個DeleteApplicationSelf()就完成了任務。

方法二。呼叫系統的cmd程式並傳入引數。

void DeleteApplicationSelf()

{

       char szCommandLine[MAX_PATH + 10];

       //設定本程序為實時執行,快速退出。

       SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);

       SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

       //通知資源管理器不顯示本程式,當然如果程式沒有真正的刪除,重新整理資源管理器後仍會顯示出來的。

    SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, _pgmptr, NULL);

       //呼叫cmd傳入引數以刪除自己

       sprintf(szCommandLine, "/c del /q %s", _pgmptr);

       ShellExecute(NULL, "open", "cmd.exe", szCommandLine, NULL, SW_HIDE);

       ExitProcess(0);

}

呼叫方法與前面相同。

這二種方法都不會出現DOS程式視窗,完全達到了無影無蹤的刪除效果,更加不會出現有的程式自刪除後仍顯示程式圖示,要重新整理資源管理器後才發現程式被刪除了。

再對程式碼作下講解:

1._pgmptr 的定義為extern char * _pgmptr,stdlib.h檔案對其說明為:points to the module (EXE)name。使用_pgmptr與使用GetModuleFileName(NULL, szExePath, MAX_PATH);來得到程式的路徑是等效的。

2.ShellExecute()最後一個引數為SW_HIDE表示隱藏視窗。

3.DOS命令del的/q引數表示安靜模式,這樣刪除檔案時就不會出現要求使用者確認的提示對話方塊了。

附:二種方法都要加入標頭檔案及lib庫

#include <windows.h>

#include <stdlib.h>

#include <shellapi.h>

#include <shlobj.h>

#pragma comment(lib, "shell32.lib")