eXeL@B —› Программирование —› Отладка резидентной программы |
Посл.ответ | Сообщение |
|
Создано: 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] спасибо! |
|
Создано: 07 декабря 2011 18:30 · Личное сообщение · #2 |
|
Создано: 07 декабря 2011 20:20 · Личное сообщение · #3 |
|
Создано: 07 декабря 2011 22:48 · Личное сообщение · #4 |
|
Создано: 07 декабря 2011 23:42 · Личное сообщение · #5 |
|
Создано: 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, и отладчик обнаруживает точку останова. Вы можете отлаживать резидентный код. --------------------------- |
|
Создано: 08 декабря 2011 09:19 · Личное сообщение · #7 |
eXeL@B —› Программирование —› Отладка резидентной программы |