CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP INSTALL D_OK DB 'OK, passed...',0DH,0AH,24H TEMP_BX DW ? OFF1 DW ? SEG1 DW ? INT1: MOV TEMP_BX,BX ;save bx MOV BX,SP ;BX=SP=0016h MOV BX,SS:[BX] XOR BYTE PTR DS:[BX],55H ;decode MOV BX,TEMP_BX IRET INSTALL: MOV AX,3501H ;保存原 INT 1 中断向量 INT 21H MOV OFF1,BX ;设置新 INT 1 到 offset int1 MOV SEG1,ES MOV AX,2501H MOV DX,OFFSET INT1 INT 21H XOR BYTE PTR X1,55H ;这些指令是先把以下 XOR BYTE PTR X2,55H ;的一些指令加密 XOR BYTE PTR X3,55H ;当然,在应用时就不会有这些指令了 XOR BYTE PTR X4,55H XOR BYTE PTR X5,55H XOR BYTE PTR X6,55H XOR BYTE PTR X7,55H XOR BYTE PTR X8,55H XOR BYTE PTR X9,55H PUSHF POP AX OR AX,0100H PUSH AX POPF ;打开单步跟踪 NOP ;由于单步跟踪要在执行下一条指令后才激活 X1: ;所以这儿是一条 NOP 指令 MOV AH,9 X2: MOV DX,OFFSET D_OK X3: INT 21H X4: PUSHF X5: POP AX ;从 X1 到 X9 的指令要在 X6: AND AX,0FEFFH ;执行中才由 INT 1 逐句解开 X7: PUSH AX X8: POPF X9: NOP MOV AX,2501H ;把 INT 1 复原 LDS DX,DWORD PTR OFF1 INT 21H INT 20H