· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Как написать монитор портов под ДОС

Посл.отвђт Сообщен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