首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

DOS 病毒原理歷史研究:COM/EXE 檔案感染機制與組合語言實作分析

     編輯:關於C++

聲明:本文為計算機病毒歷史與技術原理學術研究,分析 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

病毒引導塊 (@@Start)

  1. 檢查駐留:INT 21h AH=4D4Dh 自定義中斷,若已駐留 (返回 4D4Dh) 則跳轉執行原程式。
  2. 安裝駐留 (@@Install):
    • 遍歷 MCB 鏈找到最後一塊記憶體。
    • 縮減最後塊大小,騰出病毒所需空間 (高端記憶體)。
    • 將病毒本體複製至高端記憶體。
    • 攔截 INT 21h:保存原向量,設定新處理程序 @@NewInt21。
  3. 觸發條件:檢查系統時間 (INT 21h AH=2Ch),若達 22:30 則呼叫 @@DisplayMsg 顯示訊息。
  4. 執行原程式:
    • COM 檔:恢復原始 4 位元組 (INT 20h + 2 位元組),JMP 100h。
    • EXE 檔:恢復原始 SS:SP、CS:IP,RETF 遠返回。
  5. INT 21h 處理程序 (@@NewInt21) - 感染核心

    攔截三大檔案操作功能:

    • AH=4Bh (Exec - 執行程式)
    • AH=43h (Get/Set File Attributes)
    • AH=3Dh (Open File)

    流程:

    1. 檢查副檔名 (`.COM` 或 `.EXE`)。
    2. 以讀寫模式開啟檔案 (AX=3D02h)。
    3. 讀取檔頭判斷真實格式 (MZ 標誌) 與感染標誌 ('V' 或 'VV')。
    4. 檢查檔案大小限制 (COM < 0xFD00h, EXE 檔頭 < 8 段落)。
    5. 將病毒本體附加至檔案末尾。
    6. 修改檔頭:
    ; COM 檔: 植入 JMP 病毒入口 (E9xxxxx) + 'V' 標誌
    ; EXE 檔: 修改 CS:IP 指向病毒入口,SS:SP 設為病毒堆疊,CheckSum='VV',重新計算 Pages/ModSize

    關鍵技術細節

    歷史意義與演進

    • DOS 病毒依賴實模式無保護記憶體、直接硬體存取、中斷向量表可自由修改等特性。
    • Windows 9x 仍支援 DOS 盒子與 V86 模式,此類病毒曾在 9x 系統傳播。
    • NT 核心 (NT/2000/XP+) 引入記憶體保護、特權環、驅動程式簽名、完整性機制,徹底阻斷此類用戶模式病毒生存空間。
    • 現代惡意代碼演進為:PE 檔案感染 (Windows)、ELF 感染 (Linux)、巨集/腳本病毒、無檔案攻擊、供應鏈投毒等,核心邏輯 (掛鉤、注入、持久化、逃避檢測) 同源異流。

    防禦啟示

    1. 記憶體保護:硬體級頁面保護 (NX/DEP) 防止代碼在數據區執行。
    2. 中斷/系統呼叫表保護:核心修補防護 (PatchGuard)、驅動簽名強制。
    3. 檔案完整性監控:關鍵系統檔案雜湊基線比對 (Windows Resource Protection、Tripwire)。
    4. 行為阻擋:HIPS/EDR 攔截可疑檔案修改、記憶體注入、異常進程樹。
    5. 最小權限原則:標準用戶無法寫入系統目錄、修改啟動項、安裝驅動。

    研究 DOS 病毒技術,不僅是懷舊,更是理解「代碼注入、掛鉤、持久化、逃避」這四大惡意代碼核心戰術在最原始環境下的純粹形態,為現代防禦體系設計提供歷史鏡鑑。

    1. 上一篇文章:
    2. 下一篇文章:
    Copyright © 程式碼之家 All Rights Reserved
    技術點實作細節
    記憶體駐留利用 MCB 縮減最後記憶體塊,病毒常駐高端記憶體,屬於 TSR (Terminate Stay Resident) 技術。
    INT 21h Hook通用檔案操作入口,攔截開啟/執行/屬性修改,實現「接觸式感染」。
    格式自動識別不信任副檔名,讀取檔頭 MZ 標誌判斷 EXE/COM,避免感染誤判。
    感染標誌COM: 第 4 位元組='V';EXE: CheckSum='VV',防止重複感染導致檔案膨脹。
    大小限制避免感染過大檔案導致載入失敗或引起懷疑。
    32 位指令混用.386 + MOVZX ESP, SP 等,展示向 32 位過渡期技術。