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

📄 int386.asm

📁 usb加密狗复制小工具 ┆加密狗信息复制工具
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;****************************************************************************
;*                                                                          *
;* cane - A softdog killer                                                  *
;* Copyright (C) 1996, by Li Wen_Xian                                       *
;* All rights reserved.                                                     *
;*                                                                          *
;* This file is: INT386.ASM, the VM interrupt handlers                      *
;*                                                                          *
;****************************************************************************

INCLUDE         EQUMAC.INC
INT386_FILE     EQU     1
INCLUDE         EXTERNAL.INC

;fake segment for far ret interrupts
;(this segment has no descriptor in GDT/LDT)
QISR            SEGMENT PARA PUBLIC 'CODE16' USE16
                ASSUME  CS:QISR
;push   sacrifical words for IRET to eat.
;PL0 stack controls return anyway
QIRET:
                PUSH    0
                PUSH    0
                PUSH    0
                IRET
QISR            ENDS

;IDT    segment
IDTABLE         SEGMENT
IDTBEG          EQU             $
                DQ              TOPINT+1 DUP (0)
IDTEND          EQU             $
IDTABLE         ENDS

;ISR segment
DEFINT          MACRO           N
INT&N           LABEL           FAR
                DB              6AH
                DB              N
                JMP             NEAR PTR INTDUMP
                ENDM

ISR             SEGMENT
                ASSUME  CS:ISR
ISRBEG          EQU             $

;This code defines interrupt handlers form 0 to TOPINT
;(TOPINT is defined in EQUMAC.INC)
;The interrupt code assumes these routines are the same
;size -- even if the assembler tells you that some of
;them can be compatcted with an override -- don't do it
;Also, don't let the assembler make multiple passes to
;compact this code automatically.
INTNO           =       0
                REPT    TOPINT+1
                DEFINT  %INTNO
INTNO           =       INTNO+1
                ENDM
;Debug dump messages
MESSAGEA        DB      'INT=',0
STKM            DB      'Stack dump:',0
TASKM           DB      'TR=',0
RTABLE          DB      'G'
                DB      'F'
                DB      'D'
                DB      'E'
GTABLE          DB      'DISIBPSPBXDXCXAX'
MEMMESS         DB      'Memory Dump:',0

;****************************************************************************
;All interrupts come here                                                   *
;We check for the interrupt # pushed on the stack and                       *
;vector accordingly. This adds some interrupt latency,                      *
;but simplifies IDT construction.                                           *
;****************************************************************************

INTDUMP         LABEL   NEAR

                PUSHAD
                PUSH    ES
                PUSH    FS
                PUSH    GS

                MOV     AX,SEL_DATA0     ;ES  --->  SEL_DATA0
                MOV     ES,AX
                MOV     AX,SEL_DATA      ;FS  --->  SEL_DATA
                MOV     FS,AX
                MOV     ECX,[ESP+2CH]
                AND     ECX,000000FFH
                MOV     [ESP+2CH],ECX    ;interrupt no.

                MOV     ECX,[ESP+2CH]    ;INT No
                CMP     ECX,00H          ;DIVIDE BY 0 INTERRUPT
                JZ      INT00H
                CMP     ECX,01H          ;STEP
                JZ      INTNN
                CMP     ECX,02H          ;NMI
                JZ      INTNN
                CMP     ECX,03H          ;BREAKPOINT INTERRUPT
                JZ      INTNN
                CMP     ECX,04H          ;OVERFLOW INTERRUPT
                JZ      INTNN
                CMP     ECX,08H
                JB      NOTINT08_0F
                CMP     ECX,0FH
                JA      NOTINT08_0F
                SUB     CL,08H
                MOV     AL,0BH    ;write OCW3
                OUT     20H,AL
                IN      AL,20H    ;READ ISR
                SHR     AL,CL
                AND     AL,01H
                JZ      NOTHARDINT
INTNN:
                MOV     EAX,[ESP+38H] ;OLD FLAGS
                AND     EAX,0FFFFFEFFH ;CLEAR TF
                MOV     [ESP+38H],EAX

                MOV     EAX,[ESP+40H] ;OLD SS
                SHL     EAX,4
                MOV     EBX,[ESP+3CH] ;OLD ESP
                SUB     EBX,6
                AND     EBX,0FFFFH
                ADD     EBX,EAX

                MOV     ECX,[ESP+38H] ;OLD FLAGS
                MOV     EAX,[ESP+34H] ;OLD CS
                AND     EAX,0FFFFH
                SHL     ECX,10H
                OR      EAX,ECX
                MOV     ES:[EBX+2],EAX
                MOV     EAX,[ESP+30H] ;OLD EIP
                MOV     ES:[EBX],AX

                MOV     EAX,[ESP+3CH] ;OLD ESP
                SUB     EAX,6
                AND     EAX,0FFFFH
                MOV     [ESP+3CH],EAX ;NEW ESP

                MOV     EAX,[ESP+38H] ;FLAGS
                AND     EAX,0FFFFFDFFH ;CLEAR IF
                MOV     [ESP+38H],EAX

                MOV     EBX,[ESP+2CH]  ;INT NO
                MOV     EAX,ES:[EBX*4]
                MOV     EDX,EAX
                SHR     EDX,10H
                AND     EAX,0FFFFH
                MOV     [ESP+30H],EAX
                MOV     [ESP+34H],EDX

                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                IRETD
INT00H:
                MOV     EAX,[ESP+38H] ;OLD FLAGS
                AND     EAX,0FFFFF606H ;CLEAR EXCEPT DF IF PF
                MOV     [ESP+38H],EAX
                JMP     INTNN

NOTINT08_0F:
                CMP     ECX,70H    ;8259A 2
                JB      NOTHARDINT
                CMP     ECX,77H
                JA      NOTHARDINT
                SUB     CL,70H
                MOV     AL,0BH   ;WRITE OCW3
                OUT     20H,AL
                IN      AL,20H   ;READ ISR
                SHR     AL,2
                AND     AL,01H
                JZ      NOTHARDINT
                MOV     AL,0BH   ;WRITE OCW3
                OUT     0A0H,AL
                IN      AL,0A0H   ;READ ISR
                SHR     AL,CL
                AND     AL,01H
                JZ      NOTHARDINT
                JMP     INTNN
NOTHARDINT:
                MOV     EAX,[ESP+34H] ;OLD CS
                SHL     EAX,4
                MOV     EBX,[ESP+30H] ;OLD EIP
                ADD     EBX,EAX
                MOV     EAX,ES:[EBX-4] ;the interrupt instruction
                AND     EAX,00FF0000H
                CMP     EAX,00CD0000H
                JNZ     NOTINTNN
                MOV     EAX,ES:[EBX-4]
                SHR     EAX,24
                CMP     EAX,[ESP+2CH]
                JNZ     NOTINTNN
                CMP     EAX,15H
                JZ      INT15H
                CMP     EAX,21H
                JZ      INT21H
                JMP     INTNN
INT21H:
                MOV     AX,WORD PTR [ESP+28H]
                CMP     AX,0FEFEH
                JZ      GETPSP
                CMP     AX,0FEFFH
                JZ      BACKTOREAL
                CMP     AX,0FEFDH
                JZ      GETBUFADDR
                CMP     AX,0FEFCH
                JZ      SETBUFADDR
                JMP     INTNN
SETBUFADDR:
                MOV     AX,SEL_UDATA
                MOV     GS,AX
                MOV     EAX,[ESP+1CH]     ;OLD EBX
                MOV     GS:PORTDATAADDR,EAX
                ADD     EAX,2
                MOV     GS:CURBLOCKADDR,EAX
                MOV     WORD PTR [ESP+28H],0  ;set eax
                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                IRETD
GETBUFADDR:
                MOV     AX,SEL_UDATA
                MOV     GS,AX
                MOV     EAX,GS:PORTDATAADDR
                MOV     [ESP+24H],EAX                ;ecx the address
                MOV     AX,0H
                MOV     WORD PTR [ESP+28H],AX
                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                IRETD
GETPSP:
                MOV     AX,FS:_PSP
                MOV     WORD PTR [ESP+28H],AX
                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                IRETD

BACKTOREAL:
                MOV     AL,20H
                CMP     FS:_PC386,0
                JNZ     SHORT NOTANAT1
                OUT     0A0H,AL
NOTANAT1:
                OUT     20H,AL          ;just in case hardware did it
                MOV     EAX,SEG _RTCSIP
                SHL     EAX,4
                MOV     EBX,OFFSET _RTCSIP
                ADD     EBX,EAX
                MOV     AX,WORD PTR [ESP+30H]    ;OLD IP
                MOV     WORD PTR ES:[EBX],AX
                MOV     AX,WORD PTR [ESP+34H]    ;OLD CS
                MOV     WORD PTR ES:[EBX+2],AX
                MOV     AX,WORD PTR [ESP+38H]    ;OLD FLAG
                MOV     WORD PTR ES:[EBX+4],AX
                MOV     AX,WORD PTR [ESP+44H]    ;OLD ES
                MOV     WORD PTR ES:[EBX+6],AX
                MOV     AX,WORD PTR [ESP+48H]    ;OLD DS
                MOV     WORD PTR ES:[EBX+8],AX
                MOV     AX,WORD PTR [ESP+40H]    ;OLD SS
                MOV     WORD PTR ES:[EBX+0AH],AX
                MOV     AX,WORD PTR [ESP+14H]    ;OLD BP
                MOV     WORD PTR ES:[EBX+0CH],AX
                MOV     AX,WORD PTR [ESP+3CH]    ;OLD SP
                MOV     WORD PTR ES:[EBX+0EH],AX
                MOV     AX,WORD PTR [ESP+0CH]    ;OLD DI
                MOV     WORD PTR ES:[EBX+10H],AX
                MOV     AX,WORD PTR [ESP+10H]    ;OLD SI
                MOV     WORD PTR ES:[EBX+12H],AX
                MOV     AX,WORD PTR [ESP+20H]    ;OLD DX
                MOV     WORD PTR ES:[EBX+14H],AX
                MOV     AX,WORD PTR [ESP+24H]    ;OLD CX
                MOV     WORD PTR ES:[EBX+16H],AX
                MOV     AX,WORD PTR [ESP+1CH]    ;OLD BX
                MOV     WORD PTR ES:[EBX+18H],AX
                MOV     AX,WORD PTR [ESP+28H]    ;OLD AX
                MOV     WORD PTR ES:[EBX+1AH],AX

                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                BACK2REAL
INT15H:
                MOV     EAX,[ESP+28H]    ;OLD EAX
                SHR     EAX,8
                AND     EAX,0FFH         ;OLD AH
                CMP     EAX,87H
                JZ      TRANSDATA
                CMP     EAX,88H
                JZ      MEMORYCHECK
                JMP     INTNN
TRANSDATA:
                MOV     AX,SEL_GDT       ;GS  --->  SEL_GDT
                MOV     GS,AX
                MOV     EAX,[ESP+44H]    ;OLD ES
                AND     EAX,0FFFFH
                SHL     EAX,4
                MOV     EBX,[ESP+10H]    ;OLD SI
                AND     EBX,0FFFFH
                ADD     EBX,EAX
                MOV     EAX,ES:[EBX+10H]   ;SOURCE
                MOV     GS:[SEL_15S],EAX
                MOV     EAX,ES:[EBX+14H]
                MOV     GS:[SEL_15S+4],EAX
                MOV     EAX,ES:[EBX+18H]   ;DESTINATION
                MOV     GS:[SEL_15D],EAX
                MOV     EAX,ES:[EBX+1CH]
                MOV     GS:[SEL_15D+4],EAX
                MOV     CX,WORD PTR [ESP+24H]    ;TRANS LEN
                MOVZX   ECX,CX
                PUSH    DS
                MOV     AX,SEL_15S
                MOV     DS,AX            ;SOURCE      TRANS
                MOV     AX,SEL_15D
                MOV     ES,AX            ;DESTINATION TRANS
                XOR     ESI,ESI
                XOR     EDI,EDI
                CLD
                REP     MOVSW
                POP     DS
                MOV     [ESP+28H],EAX
                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                IRETD
MEMORYCHECK:
                MOV     AL,31H
                OUT     70H,AL
                IN      AL,71H
                SHL     EAX,8
                MOV     AL,30H
                OUT     70H,AL
                IN      AL,71H
                AND     EAX,0FFFFH
                MOV     [ESP+28H],EAX
                POP     GS
                POP     FS
                POP     ES
                POPAD
                ADD     ESP,4
                IRETD
NOTINTNN:                                ; Is trap
                MOV     ECX,[ESP+2CH]
                CMP     ECX,0DH
                JNZ     NOTGP

                ;Is 13, general protect error
                MOV     EAX,[ESP+34H+4]  ;OLD CS
                AND     EAX,0FFFFH
                SHL     EAX,4
                MOV     EBX,[ESP+30H+4]  ;OLD EIP
                ADD     EBX,EAX
                MOV     EAX,ES:[EBX]     ;current instruction
                AND     EAX,0FFH
                CMP     EAX,0FH
                JNZ     NOTMOV           ;NOT mov instruction
                MOV     EAX,ES:[EBX]     ;current instruction
                SHR     EAX,8
                AND     EAX,0FFH
                CMP     EAX,22H
                JZ      SKIPINSTRUCTION
                CMP     EAX,23H
                JZ      SKIPINSTRUCTION
                CMP     EAX,26H
                JZ      SKIPINSTRUCTION
                CMP     EAX,20H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -