|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Май 27, 2004 14:35:19 Вопрос вот в чем. Хочу написать резидент, который ведет журнал обращения к портам. В принципе, можно повесить на таймер и опрашивать порты, при изменении значения сохранять в файл. Однако такой путь не совсем устраивает. Если другой вариант (типа отлавливания команд in и out и соответсвенно регистров dx и al)???????? На худой конец, киньте, пожалуйста ссылочку на резидентный монитор портов под ДОС |
|
|
Дата: Май 27, 2004 14:55:06 Гым. Вот если память не женщина и мне не изменяет, то в реальном режиме мониторить порты просто нельзя. Это только виртуальную машину писать.. Ну или эмулятор =) |
|
|
Дата: Май 27, 2004 16:58:46 kabancho Начиная с процессоров Pentium можно ставить точки останова не только на обращение по определенным адресам памяти, но и на обращение к портам ввода вывода. Правда точек останова по обращению к портам таким образом получится не более 4 (число регистров отладки dr0-dr3 c адресами точек останова равно 4). Если надо, то могу дать пример своей программы-монитора обращений к портам (в реальном режиме под ДОС). Надо давать, или сам знаешь как писать такую программу? |
|
|
Дата: Май 27, 2004 17:02:19 Icebp Можно мне тоже? =) Я не знаю %-) |
|
|
Дата: Май 27, 2004 17:27:00 Icebp Если не трудно, вышли на chugun@rambler.ru И если не сложно, можно несколько пояснений. я, в общем-то, ламер, и проги пишу еле-еле. Что такое "точка останова"??? И заодно вопрос. Неужели нельзя перехватывать команды in и out? |
|
|
Дата: Май 27, 2004 21:23:36 Если программа никак не защищается, то перехват можно сделать, к примеру, через функции менеджера типа EMM (основано на битах доступа в карте ввода-вывода):
.586p
MaxPackets equ 1000 ; Packets in ring buffer
PortArea equ 10h ; ports to trap
DosSelector equ 0D8h ; Dos area selector
VectorDosFlag equ 28h
VectorKeyboard equ 09h
HotKey equ 1208h ; alt+Scroll Lock, 0208h - left alt
Color equ 45 ; Color Of Frame
; Debug Packet structure
DebugStruct struc
PackNum dw ? ; Number of packet - like CRC
RegEAX dd ? ; eax after exception command
RegEDX dd ? ; edx after exception command
Opcodes db 4 dup(?) ; opcodes of previous commands
DebugStruct ends
text segment byte public use16
assume cs:text,ds:text
org 100h
begin:
; Go to ini-section
jmp @@InitWatcher
Table02815 label word
PortIO0 dw ?
HadlerOfs0 dw offset @@ExceptionHandler
PortIO1 dw ?
HadlerOfs1 dw offset @@ExceptionHandler
PortIO2 dw ?
HadlerOfs2 dw offset @@ExceptionHandler
PortIO3 dw ?
HadlerOfs3 dw offset @@ExceptionHandler
PortIO4 dw ?
HadlerOfs4 dw offset @@ExceptionHandler
PortIO5 dw ?
HadlerOfs5 dw offset @@ExceptionHandler
PortIO6 dw ?
HadlerOfs6 dw offset @@ExceptionHandler
PortIO7 dw ?
HadlerOfs7 dw offset @@ExceptionHandler
PortIO8 dw ?
HadlerOfs8 dw offset @@ExceptionHandler
PortIO9 dw ?
HadlerOfs9 dw offset @@ExceptionHandler
PortIOA dw ?
HadlerOfsA dw offset @@ExceptionHandler
PortIOB dw ?
HadlerOfsB dw offset @@ExceptionHandler
PortIOC dw ?
HadlerOfsC dw offset @@ExceptionHandler
PortIOD dw ?
HadlerOfsD dw offset @@ExceptionHandler
PortIOE dw ?
HadlerOfsE dw offset @@ExceptionHandler
PortIOF dw ?
HadlerOfsF dw offset @@ExceptionHandler
@@ExceptionHandler:
; Protected mode handler
;
; Values EMM386 I/O dispatch function is called with:
; CX = Ring0 code selector for I/O handler's segment
; DS = Ring0 data selector for I/O handler's segment (alias of CS)
; EDX = faulting I/O address
; ECX = direction (00000008h for byte output, 00000000h for byte input)
; (reportedly 00h for byte/word input, 04h for byte/word output
; under DOS 6.22 EMM386)
; EAX = data in/out
;Return: (via FAR RET)
; CF clear if I/O access successfully virtualized
; CF set if access not virtualized (default handler will be called to
; perform the I/O)
;BUG: 32-bit I/O on trapped ports hangs the DOS 6.22 EMM386
;
;; call Sound
; Save registers
pusha
push es
push eax
; Needed to store packet ?
cmp byte ptr ds:TESTT,0
jz @@SkipWriteLog
; Save debug data in Packet
mov dword ptr ds:DebugPacket.RegEAX,eax
mov dword ptr ds:DebugPacket.RegEDX,edx
; It's output ?
test ecx,ecx
jnz @@Output
pop eax
pop es
popa
; Emulate input
stc
retf
@@Output:
push DosSelector
pop es
mov bx,[ebp+08h]
mov eax,dword ptr es:[bx-4]
mov dword ptr ds:DebugPacket.Opcodes,eax
; Increment Flag
inc word ptr ds:PacketNum
mov ax,word ptr ds:PacketNum
mov ds:DebugPacket.PackNum,ax
; Store Packet in RingBuffer
mov bx,ds:HeadPo
cmp bx,MaxPackets
jb @@InRange
xor bx,bx
@@InRange:
mov ax,size DebugStruct
push ax
mul bx
inc bx
mov ds:HeadPo,bx
pop cx
add ax,offset RingBuffer
mov di,ax
mov si,offset DebugPacket
pushf
cld
push ds
pop es
rep movsb
popf
; Restore registers and exit
@@SkipWriteLog:
pop eax
pop es
popa
stc
retf
@@NewInt28Handler:
pusha
push ds
push es
push cs
pop ds
; Check DOS flag
lds di,ds:dos_addr
cmp byte ptr ds:[di+1],1
ja @@DosIsBusy
push cs
pop ds
push cs
pop es
;
; Check for a Packet(s)
;
@@CheckForPacket:
mov bx,ds:TailPo
cmp word ptr ds:HeadPo,bx
jz @@NoDataForLog
cli
cmp bx,MaxPackets
jb @@TailInRange
xor bx,bx
@@TailInRange:
mov ax,size DebugStruct
push ax
mul bx
inc bx
mov ds:TailPo,bx
pop cx
add ax,offset RingBuffer
mov si,ax
mov di,offset OutDebugPacket
cld
rep movsb
sti
;
; Open log file and add packet
;
mov ax,6C00h ; Функция DOS 6Ch
mov bx,2 ; доступ - на чтение/запись
mov cx,0 ; атрибуты - обычный файл
mov dx,11h ; открыть файл, если он существует,
; создавать, если нет
mov si,offset LogFileName ; DS:SI - имя файла
int 21h ; создать/открыть файл
jc @@LogOpenErr
mov bx,ax ; идентификатор файла - в ВХ
mov ax,4202h ; Set to end of file
xor cx,cx
mov dx,cx
int 21h
; Write packet to log
mov ah,40h
mov cx,size DebugStruct
mov dx,offset OutDebugPacket
int 21h
mov ah,68h ; сбросить буфера на диск
int 21h
mov ah,3Eh ; закрыть файл
int 21h
jmp @@CheckForPacket
@@LogOpenErr:
@@NoDataForLog:
@@DosIsBusy:
; Restore regs and jump
pop es
pop ds
popa
jmp dword ptr cs:Old28hHandler
@@NewInt09Handler:
pusha
push ds
push es
push cs
pop ds
MOV AX,40h
MOV ES,AX
xor bx,bx
MOV AX,ES:[0017h]
and ax,HotKey ; AND AL,3
cmp ax,HotKey ; CMP AL,3
JNZ @Exit
XOR TESTT,1
JZ @NO_RUS
MOV BH,Color
jmp @@DisplayFrame
@NO_RUS:
@@DisplayFrame:
MOV AX,1001h
INT 10H
call Sound
@EXIT:
PUSHF
CALL DWORD PTR OLD_9H
pop es
POP DS
popa
IRET
; Sound proc
Sound Proc near
pusha
mov al,0B6H
out 43h,al
MOV AX,0110dH
OUT 42H,AL
MOV AL,AH
OUT 42H,AL
IN AL,61H
OR AL,3
OUT 61h,AL
xor CX,CX
@Wait:
loop @Wait
and AL,11111100b
OUT 61H,AL
popa
retn
Sound Endp
PacketNum dw 0 ; Packet number
HeadPo dw 0 ; Pointer to Head of RingBuffer
TailPo dw 0 ; Pointer to Tail of RingBuffer
DebugPacket DebugStruct <>
RingBuffer db (size DebugStruct * MaxPackets) dup(?)
Port dw ?
StartSel dd ?
dos_addr dd ?
Old28hHandler dd ?
LogFileName db 'c:\temp\watch!.log',0
LogDescr dw ?
OutDebugPacket DebugStruct <>
OLD_9H dd ?
TESTT db 0
;
; Initialization part *********************************************************
;
@@InitWatcher:
mov dx,offset Start
call @@Message
; Read Command Line
mov bx,80h
; cx= lenght of CMD
xor cx,cx
mov cl,[bx]
; check lenght
test cx,cx
jnz @@CommLineSet
mov dx,offset NoCmd
call @@Message
retn
@@CommLineSet:
; put number of port to dx
dec cx
cld
lea si,[bx+2]
xor dx,dx
@@PutNumbToAX:
shl dx,4
lodsb
sub al,'0'
cmp al,9
jbe @@TransDone
sub al,('A'-'0')-10
@@TransDone:
or dl,al
loop @@PutNumbToAX
mov Port,dx
;
; Check Windows present
;
mov ax,1600h
int 2Fh
or al,al
jz @@Nowin
cmp al,80h
jz @@Nowin
mov dx,offset NotWorkUnderWin
call @@Message
retn
@@Nowin:
; Check Int 67h vector - emm
push ds
push 0
pop ds
mov ax,ds:[019Ch]
or ax,ds:[019Eh]
pop ds
jz @@NoEMM
; Check EMM
mov ax,0FFA5h
int 67h
cmp ax,845Ah
jz @@EMMExist
; If EMM no present...
@@NoEMM:
mov dx,offset NoEmmMsg
call @@Message
retn
@@EMMExist:
; Set protected mode ports handler
mov ax,4A15h
mov bx,0000h ; 0-function
mov dx,ds:Port
add dx,(PortArea - 1)
shl edx,16
mov dx,ds:Port ; port low, port hi
mov cx,PortArea ; PortArea ; ports number
mov si,offset Table02815
mov ds:[si],dx ; base port number to structure
pusha
mov cx,10h
@@SetPorts:
mov ds:[si],dx
add si,4
inc dx
loop @@SetPorts
popa
mov di,offset @@InitWatcher ;; - offset begin
int 2Fh
jnc @@EMMOK
jmp @@NoEMM
@@EMMOK:
; Set new int 28h handler
mov ax,(35H shl 8) + VectorDosFlag
int 21h ; Get old HookedVector to es:bx
mov word ptr ds:Old28hHandler,bx
mov word ptr ds:Old28hHandler+2,es
mov dx,offset @@NewInt28Handler
mov ah,25h
int 21H ; Set new Vector
; Set keyboard handler
mov ax,(35H shl 8) + VectorKeyboard
int 21h ; Get old HookedVector to es:bx
mov word ptr OLD_9H,bx
mov word ptr OLD_9H+2,es
mov dx,offset @@NewInt09Handler
mov ah,25h
int 21H ; Set new Vector
; Trap set mesasge
mov dx,offset TrapSetMsg
call @@Message
mov dx,offset Finish
call @@Message
; Terminate and stay resident
push ds
mov dx,offset @@InitWatcher
int 27h
@@Message:
mov ah,09h
int 21h
retn
Start db 'Start !',13,10,'$'
NoCmd db 'No specified symbols in CMD !',13,10,'$'
NotWorkUnderWin db 'Not work under windows !',13,10,'$'
NoEmmMsg db 'No EMM or EMM error !',13,10,'$'
TrapSetMsg db 'Trap setted !',13,10,'$'
Finish db 'Finish !',13,10,'$'
SaveCS dw ?
SaveIP dw ?
Text Ends
end begin
|
|
|
Дата: Май 31, 2004 12:20:02 _Chingachguk_ Угу. Только это в режиме v86. Icebp Если не трудно, мне бы таки хотелось посмотреть на монитор портов под реальный режим. |
|
|
Дата: Июн 1, 2004 17:58:41 Anonimka Извиняюсь за задержку. Просто программа у меня была дома и вот только сегодня я ее принес (до этого все забывал). Там вначале надо разрешить расширения отладки (бит 3 в регистре CR4), потом идет инициализация самих регистров отладки. Если что то непонятно, то спрашивай. 1359843414__IO_MON.ASM |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.066 |