Board logo

标题: 毛毛虫病毒分析 [打印本页]

作者: ko20010214     时间: 2002-10-21 00:00    标题: 毛毛虫病毒分析

毛毛虫病毒的引导部分:
判断c:command.com最后两个字节是否为0C0AH,不是,就传染。
然后把病毒引导到内存最高端,占2KB空间
修改21H中断,截获DOS功能调用的1AH,11H,12H。
毛毛虫病毒的传染部分:
占据原com文件前0CH个字节,修改CS和IP值,使程序转到病毒程序,原来的0CH个字节被转移到文件尾部病毒程序中位移量为0BH的位置,当染上病毒的com文件运行时,首先将病毒驻留内存,然后将0CH字节移回,执行原com文件。修改int21H入口,改在XXXX:04A8H处。
毛毛虫病毒的表现部分:
修改int 1CH的入口,改在XXXX:06B0H处。
毛毛虫病毒的图形代码:
在XXXX:069AH处有
20 07 0F 0A 0F 0A 0F 0A 0F 0A 0F 0A 0F 0A 0F 0A 0F 0A F7 0E EE 0C
虫身为8个0FH符号连接而成,属性为0AH,即为绿色
虫颈为1个F7H符号组成,属性为0EH,为黄色
虫嘴为1个EEH符号组成 ,属性为0CH,为红色
把ES设定在B800H处,不断变换DI值,调用int1CH.
在Debug状态下激活毛毛虫病毒:
mov ax,yyyy
mov ds,ax
mov dx,6b0
mov ax,251c
int 21h

作者: kickout     时间: 2002-10-28 00:00
下面是我在98年写的一个小程序,模仿毛毛虫病毒发作的现象,有兴趣可以粘贴下去用masm或tasm编辑成EXE文件运行一下看。
==============================
dseg segment
  data1 db " The MaoMaoChong is Coming  Back ! !! !!!",0ah,0dh
        db "      ------Writen By Y.L.N 04/18/98 ",0ah,0dh
        db "            GOOD LUCK For YOU ! !! !!!",0AH,0DH,"$"
  data2 db 0Fh, 0Ah, 0Fh, 0Ah,0Fh, 0Ah, 0Fh, 0Ah, 0Fh, 0Ah, 0Fh, 0Ah, 0Fh, 0Ah, 0Fh, 0Ah, F7h, 0Eh, EEh, 0Ch,0ah,0dh,'$'

  cury db 00       ;hang
  curx db 00       ;lie
dseg ends
stack segment stack
sta      dw 100 dup(?)
stack ends
  code segment
  assume cs:code,ds:dseg,es:dseg
  main proc
  start:
        push ds
        xor ax,ax
        push ax
        mov ax,dseg
        mov ds,ax
        mov es,ax

        mov ah,02h     ;set cursor
        mov dh,cury
        mov dl,curx
        int 10h

       mov dx,offset data1        ;print string
       mov ah,09h
       int 21h

        mov dh,03h             ;reset cursor
        mov dl,00h
        mov cury,dh
        mov curx,dl

   loop1:
        inc dl
        mov curx,dl
        cmp dl,69
        jng old
        cmp dl,79
        jng repeat
        mov dl,00
        mov curx,dl
        inc dh
        mov cury,dh
        cmp dh,23
        jng old
        mov dh,03h
        mov cury,dh
        jmp eed
old:    xor ax,ax                  ;draw MaoMAoChong
        mov ax,offset data2
        mov bp,ax
        mov ah,13h
        mov al,10b
        mov bh,0
        mov cx,0ah
        int 10h
        mov cx,077fh            ;delay
  delay1:
        push cx
        mov cx,0bfh
  delay11:
        loop delay11
        pop cx
        loop delay1
repeat:
        mov dl,curx
        add dl,+11
        mov ah,02h               ;set cursor
        mov dh,cury
        int 10h
        xor ax,ax
        mov ah,08h         ;push a chart
        mov bh,00h
        int 10h
        mov dl,curx
        mov ah,02h               ;set cursor
        mov dh,cury
        int 10h

        mov ah,0eh            ;clear MaoMaoChong's tial
        mov bl,00000101b
        mov cx,1
        int 10h
        mov cx ,077fh              ;delay
   delay2:
        push cx
        mov cx,0bfh
   delay21:
        loop delay21
        pop cx
        loop delay2
       jmp loop1                   ;loop until the world is coming to end
   eed:
        mov ah,00                    ;show a page and exit
        int 21h

       main endp
        code ends
        end start
===========================
可能delay的那一段要改一下,因为我原来是在486,顶多586的机器上编辑的。现在CPU速度快,要把delay里的循环数加大,虫子才不会跑得太快,呵呵。。。

data2 后面的8个0Fh,0Ah,本来可以简单地写成 db 08h DUP(' '),这里的'    '里看起来是空白的,实际是在DOS下用ALT键+015(小键盘),ALT键+010(小键盘)敲进去的字符。因为这样看起来象是空白的,所以还是用比较土的办法输入,不用这种简写法。

我喜欢DOS有很大一点就是可以在DOS下编程对屏幕进行精确地控制,很好玩。呵呵。。。
希望这样的有趣的小程序能激起大家对DOS的一些些兴趣。