開發自動更新、資源下載功能時,`URLDownloadToFile` 是最常用的高階 API,但因被大量惡意下載器濫用,極易觸發瑞星、卡巴斯基等殺毒引擎的啟發式誤報。本文分析兩者差異,並提供替換方案實測有效規避誤殺。
| 參數 | URLDownloadToFile | URLDownloadToCacheFile |
|---|---|---|
| 呼叫者 | LPUNKNOWN pCaller | LPUNKNOWN lpUnkcaller |
| 來源 URL | LPCTSTR szURL | LPCSTR szURL |
| 目標檔案 | LPCTSTR szFileName (完整路徑) | LPTSTR szFileName (緩衝區接收快取路徑) |
| 保留參數 | DWORD dwReserved (必須 0) | DWORD dwReserved (必須 0) |
| 回調介面 | LPBINDSTATUSCALLBACK lpfnCB | IBindStatusCallback *pBSC |
| 緩衝區長度 | 無 | DWORD dwBufLength (szFileName 緩衝區大小) |
// 1. 分配足夠大緩衝區 (MAX_PATH = 260,建議 1024)
TCHAR szCachePath[1024];
DWORD dwBufLen = 1024;
// 2. 呼叫 Cache 版 API
HRESULT hr = URLDownloadToCacheFile(
NULL, // pCaller
"https://example.com/update.zip", // szURL
szCachePath, // szFileName (輸出快取路徑)
dwBufLen, // dwBufLength
0, // dwReserved
NULL // pBSC (簡易用法可為 NULL)
);
if (SUCCEEDED(hr)) {
// 3. 取得實際下載好的快取檔案路徑 (szCachePath)
// 4. 複製/移動/執行目標操作
CopyFile(szCachePath, L"C:\\MyApp\\update.zip", FALSE);
// 或 ShellExecute 執行安裝包
}
將原專案中 `URLDownloadToFile` 替換為 `URLDownloadToCacheFile` + `CopyFile` 後重新編譯,提交 VirusTotal 掃描,原本被瑞星等 3-5 引擎誤報為 `Trojan.Downloader` 的樣本,**誤報數歸零**,正常功能完全保留。