首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言程式自刪除技術實現

     編輯:關於C語言

核心思路

進程無法直接刪除自己的可執行文件(文件被鎖定)。經典解法:啟動隱藏的 `cmd.exe /c del <自身路徑>`,主進程退出後由命令行進程完成刪除。

關鍵步驟

  1. 獲取自身完整路徑 `GetModuleFileName`;
  2. 轉短路徑 `GetShortPathName` 避免空格問題;
  3. 獲取 `COMSPEC` 環境變量定位 `cmd.exe`;
  4. 構造參數 `/c del "路徑" > nul`;
  5. `ShellExecuteEx` 啟動 cmd,設置 `SW_HIDE` 隱藏窗口;
  6. 提升自身優先級、降低 cmd 優先級,搶佔 CPU 確保主進程先退出;
  7. `SHChangeNotify` 通知資源管理器刷新。

C 版實現

BOOL SelfDel() {
    SHELLEXECUTEINFO sei = {0};
    TCHAR szModule[MAX_PATH], szComspec[MAX_PATH], szParams[MAX_PATH];

    if (GetModuleFileName(0, szModule, MAX_PATH) &&
        GetShortPathName(szModule, szModule, MAX_PATH) &&
        GetEnvironmentVariable(_T("COMSPEC"), szComspec, MAX_PATH)) {

        lstrcpy(szParams, _T("/c del "));
        lstrcat(szParams, szModule);
        lstrcat(szParams, _T(" > nul"));

        sei.cbSize = sizeof(sei);
        sei.hwnd = 0;
        sei.lpVerb = _T("open");
        sei.lpFile = szComspec;
        sei.lpParameters = szParams;
        sei.nShow = SW_HIDE;
        sei.fMask = SEE_MASK_NOCLOSEPROCESS;

        if (ShellExecuteEx(&sei)) {
            SetPriorityClass(sei.hProcess, IDLE_PRIORITY_CLASS);
            SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
            SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
            SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, szModule, 0);
            return TRUE;
        }
    }
    return FALSE;
}

匯編版要點

邏輯相同,調用 `ShellExecuteEx`,注意結構體初始化與字符串拼接。代碼較長,此處略。

安全提示

  • 該技術常被惡意軟件利用,殺毒軟件會監控 `ShellExecuteEx` + `del` 組合;
  • 正規軟件應提供「協載程序」而非自刪除;
  • 現代 Windows 建議使用 MSI 安裝包,由系統管理安裝/協載。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved