聲明:本文為計算機病毒歷史與技術原理學術研究,分析 DOS 時代病毒感染機制,旨在理解早期惡意代碼演進,嚴禁用於製作或傳播惡意軟體。
本範例為基於 v0 病毒改良的 DOS 檔案感染型病毒,支援同時感染 .COM 與 .EXE 可執行檔,採用 16/32 位混合編碼 (`.386`),透過 TASM32/TLINK 編譯連結,再用 Debug 產出 .COM 格式釋出檔。
; DOS 記憶體控制塊 (MCB) 部份結構
DosMcb Struc
Flag db ? ; 'M'=非最後塊, 'Z'=最後塊
Owner dw ? ; 0008h=系統擁有, 0=空閒
Sizes dw ? ; 區塊大小 (段落數, 1段=16bytes)
DosMcb Ends
; EXE 檔頭結構
ExeHeader Struc
Flags dw 'ZM' ; MZ 標誌
ModSize dw ? ; 最後頁位元組數
Pages dw ? ; 頁數 (512bytes/頁)
Reloc dw ? ; 重定位項數
MeSize dw ? ; 檔頭段落數
MinMem dw ? ; 最小所需記憶體 (段落)
MaxMem dw ? ; 最大所需記憶體 (段落)
StartSs dw ? ; 初始 SS
StartSp dw ? ; 初始 SP
CheckSum dw ? ; 檢查和
StartIp dw ? ; 初始 IP
StartCs dw ? ; 初始 CS (相對)
RelocOff dw ? ; 重定位表偏移
ExeHeader Ends
VirusSize = OFFSET @@End - OFFSET @@Start
VirusMemSize = OFFSET @@MemEnd - OFFSET @@Start
INT 21h AH=4D4Dh 自定義中斷,若已駐留 (返回 4D4Dh) 則跳轉執行原程式。INT 21h:保存原向量,設定新處理程序 @@NewInt21。INT 21h AH=2Ch),若達 22:30 則呼叫 @@DisplayMsg 顯示訊息。INT 20h + 2 位元組),JMP 100h。RETF 遠返回。攔截三大檔案操作功能:
AH=4Bh (Exec - 執行程式)AH=43h (Get/Set File Attributes)AH=3Dh (Open File)流程:
AX=3D02h)。; COM 檔: 植入 JMP 病毒入口 (E9xxxxx) + 'V' 標誌
; EXE 檔: 修改 CS:IP 指向病毒入口,SS:SP 設為病毒堆疊,CheckSum='VV',重新計算 Pages/ModSize
| 技術點 | 實作細節 |
|---|---|
| 記憶體駐留 | 利用 MCB 縮減最後記憶體塊,病毒常駐高端記憶體,屬於 TSR (Terminate Stay Resident) 技術。 |
| INT 21h Hook | 通用檔案操作入口,攔截開啟/執行/屬性修改,實現「接觸式感染」。 |
| 格式自動識別 | 不信任副檔名,讀取檔頭 MZ 標誌判斷 EXE/COM,避免感染誤判。 |
| 感染標誌 | COM: 第 4 位元組='V';EXE: CheckSum='VV',防止重複感染導致檔案膨脹。 |
| 大小限制 | 避免感染過大檔案導致載入失敗或引起懷疑。 |
| 32 位指令混用 | .386 + MOVZX ESP, SP 等,展示向 32 位過渡期技術。 |