
;              DBG16_04.ASM - программа к Главе № 16

; (С) Авторские права на файлы-приложения принадлежат автору книги
; "Ассемблер? Это просто! Учимся программировать под MS-DOS"
; Автор: Калашников Олег Александрович (e-mail: Assembler@Kalashnikoff.ru)
;	 http://www.Kalashnikoff.ru

; --- Ассемблирование (получение *.com файла) ---
;При использовании MASM 6.11 - 6.13:
;ML.EXE dbg16_04.asm /AT

;При использовании TASM:
;TASM.EXE dbg16_04.asm
;TLINK.EXE dbg16_04.obj /t/x


;                   ===  Защита от отладчиков ===

; Способ четвертый (самый надежный из наших примеров):

;Установить вектора 21h и 10h прерываний на 03 и 01 соответсвенно,
;а затем вызывать не int 21h (int 10h), а int 3 (int 1).

CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h

Begin:
       xor ax,ax
       mov es,ax		;Обнуляем ES

       mov ax,es:[10h*4]	;Получить смещение адреса обработчика
				;10h-ого прерывания из таблицы
				;векторов прерываний
       mov es:[1*4],ax		;Поместить его в 01-ое прерывание

       mov ax,es:[10h*4+2]	;Получить сегмент
       mov es:[1*4+2],ax	;Поместить его в 01-ое прерывание

       ;__________________

       mov ax,es:[21h*4]	;Получить смещение адреса обработчика
				;21h-ого прерывания из таблицы
				;векторов прерываний
       mov es:[3*4],ax		;Поместить его в 03-ое прерывание

       mov ax,es:[21h*4+2]	;Получить сегмент 21h-ого прерывания
       mov es:[3*4+2],ax	;Поместить его в 03-ое прерывание


       mov ax,0003h		;Чистим экран
       int 1			;Вместо int 10h

       mov ah,9			;Вывести сообщение
       mov dx,offset Message
       int 3			;Вместо int 21h (да еще на 1 байт короче!)

       ret

Message db 'DBG16_04.COM - порядок!$'

CSEG ends
end Begin