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