| 日誌類型 | 預設路徑 | 備註 |
| IIS (W3SVC) | %SystemRoot%\system32\LogFiles\W3SVC1\ | 每日一檔,服務鎖定檔案 |
| FTP (MSFTPSVC) | %SystemRoot%\system32\LogFiles\MSFTPSVC1\ | 同上 |
| 排程服務 | %SystemRoot%\SchedLgU.txt | 單一檔案 |
| 應用程式/安全性/系統 | %SystemRoot%\system32\config\*.evt | 事件檢視器 .evt 檔 |
| DNS 服務 | %SystemRoot%\system32\dns\*.log | |
核心難點:服務鎖定檔案無法直接刪除
- IIS/FTP/排程服務運行時持有檔案句柄,
del 失敗 (共用違規)。
- 安全性/系統事件日誌由 **EventLog 服務** 獨佔,**關鍵服務不可停止** (SCM 拒絕)。
- 解決路徑:
- 可停止服務 → Stop Service → 刪除 → Start Service (IIS/FTP/排程)。
- 不可停止服務 → 僅能透過 **事件檢視器遠端連線** 手動清除 (極慢),或需核心模式驅動程式/繞過檔案鎖定 (屬高階攻擊技術,本文不展開)。
C++ 服務控制核心 API 封裝
// 停止服務
BOOL StopService(LPCTSTR name) {
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
SC_HANDLE svc = OpenService(scm, name, SERVICE_STOP | SERVICE_QUERY_STATUS);
SERVICE_STATUS ss;
BOOL ok = ControlService(svc, SERVICE_CONTROL_STOP, &ss);
CloseServiceHandle(svc); CloseServiceHandle(scm);
return ok;
}
// 啟動服務
BOOL StartService(LPCTSTR name) {
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
SC_HANDLE svc = OpenService(scm, name, SERVICE_START);
BOOL ok = StartService(svc, 0, NULL);
CloseServiceHandle(svc); CloseServiceHandle(scm);
return ok;
}
// 查詢狀態
DWORD GetServiceState(LPCTSTR name) {
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
SC_HANDLE svc = OpenService(scm, name, SERVICE_QUERY_STATUS);
SERVICE_STATUS ss; QueryServiceStatus(svc, &ss);
CloseServiceHandle(svc); CloseServiceHandle(scm);
return ss.dwCurrentState;
}
// 刪除目錄下符合模式檔案
void DeleteFiles(LPCTSTR dir, LPCTSTR pattern) {
TCHAR path[MAX_PATH]; PathCombine(path, dir, pattern);
WIN32_FIND_DATA fd; HANDLE h = FindFirstFile(path, &fd);
if (h != INVALID_HANDLE_VALUE) {
do { TCHAR f[MAX_PATH]; PathCombine(f, dir, fd.cFileName); DeleteFile(f); }
while (FindNextFile(h, &fd));
FindClose(h);
}
}
完整清除流程 (主邏輯)
int main() {
TCHAR sysDir[MAX_PATH]; GetSystemDirectory(sysDir, MAX_PATH);
TCHAR winDir[MAX_PATH]; lstrcpy(winDir, sysDir); // 取父目錄
PathRemoveFileSpec(winDir);
// 1. IIS
if (GetServiceState(_T("W3SVC")) == SERVICE_RUNNING) {
StopService(_T("W3SVC")); Sleep(1000);
DeleteFiles(PathCombine(sysDir, _T("LogFiles\\W3SVC1")), _T("*.log"));
StartService(_T("W3SVC"));
}
// 2. FTP
if (GetServiceState(_T("MSFTPSVC")) == SERVICE_RUNNING) {
StopService(_T("MSFTPSVC")); Sleep(1000);
DeleteFiles(PathCombine(sysDir, _T("LogFiles\\MSFTPSVC1")), _T("*.log"));
StartService(_T("MSFTPSVC"));
}
// 3. 排程
if (GetServiceState(_T("Schedule")) == SERVICE_RUNNING) {
StopService(_T("Schedule")); Sleep(1000);
DeleteFile(PathCombine(winDir, _T("SchedLgU.txt")));
StartService(_T("Schedule"));
}
// 4. 其餘鬆散日誌 (無服務鎖定)
DeleteFiles(PathCombine(sysDir, _T("LogFiles")), _T("*.*"));
DeleteFiles(PathCombine(sysDir, _T("dtclog")), _T("*.*"));
DeleteFiles(PathCombine(sysDir, _T("config")), _T("*.evt"));
DeleteFiles(sysDir, _T("*.log"));
DeleteFiles(sysDir, _T("*.txt"));
DeleteFiles(winDir, _T("*.log"));
DeleteFiles(winDir, _T("*.txt"));
return 0;
}
防禦與審計建議 (藍隊視角)
- 日誌集中轉發:配置 Windows Event Forwarding (WEF) / Syslog / SIEM 即時轉發,**本地刪除不影響上游存證**。
- 日誌檔案完整性監控 (FIM):監控
%SystemRoot%\system32\config\*.evt、%SystemRoot%\system32\LogFiles\ 變更,觸發告警。
- 服務狀態監控:監控 W3SVC、MSFTPSVC、Schedule、EventLog 服務停止/啟動事件 (Event ID 7036/7040)。
- 權限最小化:非管理員帳號無權停止服務、刪除系統目錄檔案、載入驅動程式。
- 啟用「安全性日誌」保護:
HKLM\SYSTEM\CurrentControlSet\Services\Eventlog\Security\Retention 設為 0 (不覆寫) + 定期備份 .evt。
總結
Windows 2000 日誌清除核心在於 **服務控制管理器 (SCM) API** 停止鎖定檔案的服務、刪除檔案、重啟服務。EventLog 服務不可停止,需遠端事件檢視器或核心技術繞過。藍隊應部署**集中日誌、FIM、服務狀態監控**三重防線,使本地清除失去意義。
- 上一篇文章: SQLite 入門實戰(三):點命令大全 — 顯示格式、分隔符、標題、寬度、NULL 值、配置檔持久化
- 下一篇文章: SQL Server 取得多欄位中的最大值與最小值
Copyright ©
程式碼之家 All Rights Reserved