Вопрос № 17474: Добрый день. Я снова вернулся к изучению резидентных программ. Мне не совсем понятны следующие строки(отмечены v):
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Start:
jmp Init
Int_21h_proc proc
pushf <...Вопрос № 17487: Всем хорошего здоровья. :)
Пробую загрузить программу в SoftICE 4.2.7 (WinXP sp1). Делаю так:
1) Компилирую программу так:
C:Masm32Binml.exe /c /coff /Zi proga.asm
C:Masm32Binlink.exe /SUBSYSTEM:CONSOLE /DEBUG /DEBUGTYPE:CV /LIB...Вопрос № 17489: Здравствуйте уважаемые эксперты!
Недавно я начел изучать язык ASSEMBLER по рассылке О. Калашникова. До вчерашнего дня все работало нормально, а после того как я написал пример Prog02 и запуситл его, вылетила вот такая мессага (см. приложение). У ...Вопрос № 17493: Привет!
Я создаю raw-socket и включаю promiscious mode(SIO_RCVALL), т.е. моя прога получает все пакеты которые проходят с моего компа.
Вопрос: как сделать чтоб моя прога получала только заголовки TCPIP-пакета?...Вопрос № 17501: Здраствуйте. У меня следующая проблема. Я написал такую програмку. Но при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать? ...
Вопрос № 17474
Добрый день. Я снова вернулся к изучению резидентных программ. Мне не совсем понятны следующие строки(отмечены v):
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Start:
jmp Init
Int_21h_proc proc
pushf
cmp ah,9
je Ok_09
popf
v jmp dword ptr cs:[Int_21h_vect] ;что это значит
Ok_09:
push ds
push dx
push cs
pop ds
mov dx,offset My_string
pushf
v call dword ptr cs:[Int_21h_vect] ;что это значит
pop dx
pop ds
popf
v iret ;чем отличается от ret
Int_21h_vect dd ?
My_string db 'Моя строка!$'
int_21h_proc endp
Init:
mov ah,35h
mov al,21h
int 21h
mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es
mov ax,2521h
mov dx,offset Int_21h_proc
int 21h
mov dx,offset Init
int 27h
CSEG ends
end Start
Отправлен: 25.02.2005, 13:45
Вопрос задал: psevdo (статус: 1-ый класс)
Всего ответов отправлено: 3
Отвечает: Котиев Зураб
Добрый день.
В переменную Int_21_vect ты сохраняешь истинный адресс(вектор) прерывания 21h т.е. кодовый сегмент прерывания и смещение в нем.
Потом с помощью инструкций
mov ax,2521h
mov dx,offset Int_21h_proc
int 21h
ты заменяешь обработчик int 21h своим обработчиком
pushf
cmp ah,9
je Ok_09
popf
jmp dword ptr cs:[Int_21h_vect] ;что это значит
Ok_09:
ты проверяешь переданные в прерывание параметры , и если ah рано 9 (т.е. это вывод строки) работаешь дальше, а если нет ты просто передаешь управление штатному обработчику
предварительно очистив стек от сохраненного туда регистра флагов.
теперь о ret и iret.
инструкция call кладет в стек адресс возврата (т.е. адресс следующей за ней инструкции).
ret снимает со стека этот адресс и заносит его в ip.
инструкции call far и retf работают аналогично только в стек заносится и снимается еще и cs ,потому что управление передаетя в другой кодовый сегмент(дальний вызов).
инструкция int "номер прерывания" заносит в стек регистр флагов ,регистр cs,и адресс возврата(вызов прерывания всегда дальний вызов).Выход из прерывания производится командой iret (Interrupt RETurn).
iret соответственно восстанавливает со стека регистр флагов и все остальное.
push cs
pop ds
mov dx,offset My_string
pushf
call dword ptr cs:[Int_21h_vect] ;что это значит
после того как ты заменил указатель на строку своим указателем ты делаешь вызов "настоящего" прерывания int21h
командой call(здесь важный момент) а не int 21h.
Прерывание отработав вызовет iret а если ты не сохранил в стеке регистр флагов то прерывание возьмет со стека неизвестно что,(допустим ты вызвал прерывание из вложенной процедуры ,то оно снимет со стека адресс возврата из этой процедуры и вернет управление эта процедура неизвестно куда;одним словом висяк).
Поэтому при передаче управления прерыванию командой call необходимо сохранить в стеке регистр флагов:
pushf
call dword ptr cs:[Int_21h_vect];
Ответ отправил: Котиев Зураб (статус: 1-ый класс)
Отправлен: 25.02.2005, 15:52
Отвечает: Стас
Здравствуйте, psevdo!
jmp dword ptr cs:[Int_21h_vect] - безусловный переход по адресу хранящемуся в переменной Int_21h_vect, куда ранее поместили "старый обработчик" прерывания.
call dword ptr cs:[Int_21h_vect] - тоже самое, только после выполнения "старого обработчика", программа продолжится со следующей команды.
iret ;отличается от ret тем что дополнительно восстанавливает флаги из стека (POPF)
ЛЮБОЙ обработчик прерывания заканчивается IRET или "имитируется" IRET например так:
RETF 2 - если нужно сохранить флаги.
Кстати, а ты знаешь чем RET от RETF отличается? А то может тебе почитать о командах ассемблера.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 26.02.2005, 00:19
Отвечает: Евгений Иванов
Здравствуйте, psevdo!
jmp dword ptr cs:[Int_21h_vect] - это переход на следующий вектор прерываний в цепочке обработки прерываний.
call dword ptr cs:[Int_21h_vect] - это вызов настоящего прерывания, которое будет, как тут предполагается, работать.
iret ;чем отличается от ret - вызов прерываний идёт через технологию INT, так что нужно использовать iret. Отличие от ret - сохраняются флаги.
Удачи!
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 26.02.2005, 01:11
Вопрос № 17487
Всем хорошего здоровья. :)
Пробую загрузить программу в SoftICE 4.2.7 (WinXP sp1). Делаю так:
1) Компилирую программу так:
C:Masm32Binml.exe /c /coff /Zi proga.asm
C:Masm32Binlink.exe /SUBSYSTEM:CONSOLE /DEBUG /DEBUGTYPE:CV /LIBPATH:c:masm32lib proga.obj
2) Запускаю "Start SoftICE".
3) Запускаю "Loader 32".
4) "File" - "Open".
5) Открываю "proga.exe".
6) Меню "Module" - "Load".
На сколько я понимаю здесь должен загрузиться "SoftICE". Программа загружается, а SoftICE нет. Что я делаю неправильно?
Заранее благодарен.
Отправлен: 25.02.2005, 18:43
Вопрос задал: Гнедов Павел Владимирович (статус: Посетитель)
Всего ответов отправлено: 1
Отвечает: Стас
Здравствуйте, Гнедов Павел Владимирович!
SoftIce либо не загружен(есть внизу Loaderа надпись SoftIce active?), либо не ловит начала проги, тогда поставьте первой командой Int 3, а softice дайте(ctrl-d) комманду i3here on.
Ответ отправил: Стас (статус: Практикант)
Отправлен: 25.02.2005, 23:59
Вопрос № 17489
Здравствуйте уважаемые эксперты!
Недавно я начел изучать язык ASSEMBLER по рассылке О. Калашникова. До вчерашнего дня все работало нормально, а после того как я написал пример Prog02 и запуситл его, вылетила вот такая мессага (см. приложение). У меня Windows XP sp1. Рассскажите пожалуйста в чем проблема и как её устронить.
Заранее благодарен.
Приложение:
Отправлен: 25.02.2005, 19:41
Вопрос задал: Gorodjaaan (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: AxMAD
Здравствуйте, Gorodjaaan!
Всё очень просто переходите или чисто в Ms-DOS или под Windows 9x !!!
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 26.02.2005, 16:42
Отвечает: Boriss
Здравствуйте, Gorodjaaan!
То есть, различие поведения надо искать в изменении вида запуска программы. Вы одинаково делали это?
Ответ отправил: Boriss (статус: Профессионал)
Отправлен: 01.03.2005, 16:46
Вопрос № 17493
Привет!
Я создаю raw-socket и включаю promiscious mode(SIO_RCVALL), т.е. моя прога получает все пакеты которые проходят с моего компа.
Вопрос: как сделать чтоб моя прога получала только заголовки TCPIP-пакета?
Отправлен: 25.02.2005, 20:48
Вопрос задал: valix (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Bob Johnson
Здравствуйте, valix! AFAIK - никак... Никакого фильтра повесить невозможно, надо получать все пакеты и фильтровать руками.
* EMan2.0: ---===*** Debug mode ***===---
Ответ отправил: Bob Johnson (статус: Академик)
Отправлен: 26.02.2005, 16:09
Отвечает: AxMAD
Здравствуйте, valix!
так параметр IPPROTO_IP зачем!
s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
Ответ отправил: AxMAD (статус: Студент)
Отправлен: 26.02.2005, 17:09
Вопрос № 17501
Здраствуйте. У меня следующая проблема. Я написал такую програмку. Но при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать?
Да и еще одно: как при запуске программы она может определить полностью свою длинну, окромя:
mov plen, offset endpr-offset progenrpoint
А как программа при запуске может узнать свое имя полностю с адресом.
Да, а как организовать поик необходимого файла?
Например: File.ext а вдруг он в ДОСе как FILE.EXT, file.ext? Я имею в виду проблемы с регистром.
Заранее вам благодарен.
Ну и в конце отвечу на один вопрос Калашникову.
Ваша программы, котороя дописывается в конец сом файлов с некоторыми сом будет работать некорректно потому, что они имеют структуру ехе программ. Даже command.com в WinMe имеет в начале MZ и длинну что-то около 84 кб? Вообще как такое может быть? А прога format.com Win2000 вообще под DOSом запустить нелзя!:
«This program cannot be run in DOS mode.»!!!
Приложение:
Отправлен: 25.02.2005, 22:14
Вопрос задал: Nieh (статус: Посетитель)
Всего ответов отправлено: 2
Отвечает: Евгений Иванов
Здравствуйте, Nieh!
Обрабатывай ошибки правильно, посмотри 59h функцию.
Поиск - есть расширенные функции для работы с длинными именами файлов. Вот там доступен и регистр, и длина.
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 26.02.2005, 01:18 Оценка за ответ: 4
Отвечает: Котиев Зураб
Здравствуйте, Nieh!
при запуске, скажем, какой либо программы с СD, или с дискетки, защищенной от записи, DOS страшно ругается. (Ошибка записи: повторить, отменить, игнорировать). Как этого избежать?
надо написать обработчик Int 24h. Этот обработчик должен устанавливать собственную
реакцию на критическую ошибку.Нормальный обработчик INT 24H - это код, который выдает сообщение:
Abort, Retry, Ignore? _
чтобы этого избежать надо вернуть управление прерванной програм-
ме,поместив предварительно в регистр AL код " 3 ":
new_24h: mov al,3
iret
Да, а как организовать поик необходимого файла?
Например: File.ext а вдруг он в ДОСе как FILE.EXT, file.ext? Я имею в виду проблемы с регистром.
для ДОСа не имеет значения регистр. Но если ты работаешь напрямую с диском (допустим через int 13 или порты) приведи имя файла к верхнему регистру просто обнулив пятый бит в символах имени.
command.com в WinMe имеет в начале MZ и длинну что-то около 84 кб?
Ты сам ответил:
они имеют структуру ехе программ.Они являются exe прграммами. А расширение com оставлено для совместимости.Format.com из win2000 вообще является PE(portable executable) файлом.
А как программа при запуске может узнать свое имя полностю с адресом
Смотри DTA .
как при запуске программы она может определить полностью свою длинну
Ну например открыть себя как файл и вызвать
mov ax,4202h
int 21h
это тебе вернет длину файла в DX:AX.
Ответ отправил: Котиев Зураб (статус: 1-ый класс)
Отправлен: 26.02.2005, 14:59 Оценка за ответ: 5