Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Отладка резидентной программы
Посл.ответ Сообщение

Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 декабря 2011 18:14
· Личное сообщение · #1

Здраствуйте!

Пишу резидентный перехватчик прерывания. Задача состоит в том чтобы немного изменить данные, которые записываются в файл(функция 40h).
Прерывание int 21h (функция 09h) - я успешно перехваываю, но мне нада зделать перехват функции 40h- запис в файл. Когда я изменяю hook_function equ 09h на 40h то прога вылетает, тоесть мне не удается сделать перехват функции 40 h.

+ как сделать отладку резидентной части , а то я работаю вслепую.

[CODE]
.286
code segment
org 100h
assume cs:code,ds:code

hook_interrupt equ 21h ;номер периравання, що перехоплюється
hook_function equ 09h ;функція 40h - Запис даних у файл

start:
jmp init

;-----------------------------------------------;
; Обробник переривання ;
; int 21h (резидентна частина) ;
;-----------------------------------------------;
hooker proc
;зберігаєм флаги
pushf

;ехо з резидента
@1:
cmp cx,09988h
jne @2
mov cx,09999h

;команда на самовигрузку
@2:
cmp cx,08888h
jne next
je self_unload

next:
;цільова функція?
cmp ah,hook_function
je ok
;відновлюєм флаги
popf
;передача керування старому вектору
jmp dword ptr cs:[old_int_vect]

ok:
push ds
push dx
push cs ;забезпечити звертання до змiнних
pop ds ;без використання префiксу cs:

mov dx,offset hooker_string
pushf
;передача керування старому вектору
call dword ptr cs:[old_int_vect]
pop dx
pop ds
popf

jmp hooker_exit

self_unload:
;Восстановим вектор hook_interrupt
cli
mov ah,25h ; Функция установки вектора
mov al,21h
lds dx,cs:old_int_vect ; Заполним DS:DX
call dword ptr cs:[old_int_vect]
sti

mov ah,0Eh
mov al,'O'
int 10h

mov ah,0Eh
mov al,'K'
int 10h

;Получим из PSP адрес собственного окружения и выгрузим его
mov es,cs:2ch ; ES ? окружение
mov ah,49h ; Функция освобождения блока памяти
int 21h

;Выгрузим теперь саму программу
push cs ; Загрузим в ES содержимое CS, т.е. сегментный адрес PSP
pop es
mov ah,49h ; Функция освобождения блока памяти
int 21h



;push ds
;mov ax,cs ;звільнення блоку пам’яті
;mov ds,ax ;оточення
;mov es,cs:2ch
;mov ah,49h
;int 21h
;pop ds

;mov ax,cs ;звільнення пам’яті
;mov es,ax ;блоку програми
;mov ah,49h
;int 21h

hooker_exit:
iret
hooker endp
;-----------------------------------------------;
; Кінець обробника ;
;-----------------------------------------------;

old_int: ;змiннi для збереження старої адреси
old_int_vect dd ? ;старий вектор переривання hook_interrupt
hooker_string db 'Target function was hooked!',0Dh,0Ah,'$'
hooker_string1 db 'Self unloading...',0Dh,0Ah,'$'

;-----------------------------------------------;
; Блок ініціалізації (нерезидентна частина) ;
;-----------------------------------------------;
init:
mov cx,09988h

mov ah,09h
lea dx,msg5
int 21h

cmp cx,09999h
je unload

install:
;отримати адресу попереднього вектора
mov ah,35h
mov al,hook_interrupt
int 21h

;переривання hook_interrupt
mov word ptr old_int_vect,bx ;зберегти молодше слово адреси в old_ip
mov word ptr old_int_vect+2,es ;зберегти старше слово адреси в old_cs

;встановити нову адресу вектора
;cli
mov ah,25h
mov al,hook_interrupt
mov dx,offset hooker
int 21h
;sti

;повідомлення про успішну ініціалізацію резидента
mov ah,09h
lea dx,msg1
int 21h

mov dx,offset install ;завершити роботу i залишити резидентною
int 27h ;частину програми по мiтку install

unload:
;повідомлення про те що резидент вже загружений
lea ax,msg3
call print
;вигрузка резидента
lea ax,msg4
call print

call unload_hooker

;lea ax,msg6
;call print

int 20h

;-------------------------------------------------------------
unload_hooker proc
mov cx,08888h

mov ah,09h
lea dx,msg5
int 21h

;ax=offset old_int

;перевірка того, чи наш обробник перший в ланцюзі переривань
;mov ah,35h
;mov al,hook_interrupt
;int 21h






;cmp word ptr old_int_vect,bx
;mov word ptr old_int_vect+2,es ;зберегти старше слово адреси в old_cs

;mov ax,es
;cmp ax,word ptr[new_int]

;jne CANT_CLOSE
;cmp bx,word ptr[new_int+2]
;je CAN_CLOSE
;IRET
;якщо обробник не перший
;то відіслати йому запит на дезактивацію
;;CANT_CLOSE:
;mov ax,4567h
;int 1Ch
;lea dx,TEXT3
;mov ah,09h
;int 21h
;якщо обробник перший, то встановити старий обробник
;CAN_CLOSE:
; cli
; mov ax,251Ch
; pop ds
; pop bx
; int 21h
;
; push cs
; pop ds
; mov ah,49h
; int 21h
; sti

; mov ah,09h
; lea dx,TEXT2
; int 21h
; IRET


ret
unload_hooker endp

;посимвоотний друк
print proc
push si
push bx

mov si,ax
mov ah,0Eh

p:
lodsb
cmp al,'$'
je end_print
int 10h
jmp p

end_print:
pop bx
pop si

ret
print endp
;-------------------------------------------------------------
msg1 db 'Resident was activated...',0Dh,0Ah,'$'
msg2 db 'Resident was deleted from memory...',0Dh,0Ah,'$'
msg3 db 'Resident is in memory...',0Dh,0Ah,'$'
msg4 db 'Unloading resident...',0Dh,0Ah,'$'
msg5 db 'Getting answer from resident...',0Dh,0Ah,'$'
msg6 db 'Resident was unloaded...',0Dh,0Ah,'$'
new_int dd ?

ends
end start

[/CODE]

спасибо!



Ранг: 222.2 (наставник), 115thx
Активность: 0.140.01
Статус: Участник

Создано: 07 декабря 2011 18:30
· Личное сообщение · #2

int 3 записать в новый обработчик прерывания. Отлаживать любым отладчиком программу, которая вызовет перехваченное прерывание.

-----
все багрепорты - в личные сообщения




Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 07 декабря 2011 20:20
· Личное сообщение · #3

У тебя в одном месте стоит константа, в другом (проверка резидента) напрямую вызывается с ah=09h
Что хочешь получить? И откуда скопипащен этот дикий код?



Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 07 декабря 2011 22:48
· Личное сообщение · #4

ну этот "дикий" код несовсем скопипащен....это я над ним шаманил....

ща попробую int 3...



Ранг: 72.1 (постоянный), 30thx
Активность: 0.050
Статус: Участник

Создано: 07 декабря 2011 23:42
· Личное сообщение · #5

Помню, под ДОС deglucker был отладчик такой. Да и старый добрый TurboDebugger мне до сих пор помогает.



Ранг: 9.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 08 декабря 2011 00:50
· Личное сообщение · #6

скомпилировал

прога та же...перехват функции 09h int21h, но я вставил туда int 3

запустил...работает

дальше нашол такой мануал:
---------------------------
При компиляции или ассемблировании резидентной программы обеспечьте наличие в ней отладочной информации.
Запустите отладчик и загрузите программу.
Установите точку останова в начале резидентной части кода. +++тут по идеи поставил в начале int 3

С помощью команды Run Run запустите рабочую часть программы. +++ запустил

Отладьте рабочую часть программы с помощью обычных методов.

+++остановилось здесь:

но!!! дальше nop'a отладка не идет. Жму F7,F8 - доходит до nop`a и возвращается на int 3....ну ладно дальше я хочу сделать TD резидентом, но получаю сообщение типа can't go resident....

закрыл TD (alt+x) и запускаю прогу wfile.exe, которая должна вызвать 09h int 21h, а мой обработчик хукнуть вызов. Но ничего не происходит. Походу обработчик не остался в памяти.

Что я не так делаю?

Затем выйдите из TSR. Резидентная часть остается в памяти.
Чтобы сделать резидентным отладчик, выберите команду File Resident. На TSR это не повлияет. После этого вы можете вернуться в DOS и вызвать TSR.
В командной строке DOS нажмите оперативные клавиши вызова резидентной программы и работайте с ней как обычно.
Выйдите из TSR. Теперь выполняется резидентная часть TSR, и отладчик обнаруживает точку останова. Вы можете отлаживать резидентный код.
---------------------------



Ранг: 301.4 (мудрец), 194thx
Активность: 0.170.01
Статус: Участник

Создано: 08 декабря 2011 09:19
· Личное сообщение · #7

Я бы посоветовал вам все это дело запускать в dosbox или нативном DOS, а не в командной строке винды


 eXeL@B —› Программирование —› Отладка резидентной программы
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати