Консультация № 188847
23.02.2016, 15:30
0.00 руб.
0 16 1
Здравствуйте

Читаю книгу Калашникова дошел до главы 24.
У меня стоит Windows XP SP3 + MASM 6.11 + CPU x86 (AMD)

С резидентами до этого момента экспериментировал в DOSbox + MASM 6.11 + DosNavigator. Дело в том, что перехваченные прерывания надо постоянно сбрасывать (чтобы переписать код и т. д.) путем перезагрузки системы. Свою реальную ОС я не хочу по 100 раз за час перезагружать, VirtualBox тоже по-моему не подходит - при постоянных перезагрузках перелопачивать сотни мегабайт на диске. Поэтому выбрал DOSbox. Мне часто приходилось перезагружать ДОСю по нескольку раз за 15 мин., пока писал код на Assembler:
Нажал Alt+X - вышел из DosNavigator -> ввел exit - вышел из DOSbox (перехваченные прерывания сброшены).
Запустил DOSbox (все прерывания оригинальные) -> автозапуск DosNavigator -> пара нажатий на клаве -> текущая папка выбрана -> открыл/подправил исходник .ASM -> Ctrl-O - выбрал введенные команды выполнил -> что-то не так - к пункту #1.
То есть избавиться от всех своих обработчиков прерываний можно за 15 сек. и начать все сначала.

В 24 главе идет переход на 32-битные регистры. Тут совсем путаница. Нужен MASM32 и отладчик 32-bit. То есть делать все это в Windows. В реальной ОСи не хочу экспериментировать с резидентами/перехватом прерываний.

Восстанавливать обработчики прерываний и выгружать резиденты я пока не умею.
Рассматриваю даже возможность установки Windows 98 на VirtualBox. Может быть ее можно быстрее перезагружать чем WinXP. Стоит ли на это тратить время?

Какие еще могут быть варианты?
Как удобнее организовать свою работу со всем этим?

Обсуждение

давно
Посетитель
7438
7205
23.02.2016, 15:40
общий
Адресаты:
32-битные регистры вполне можно использовать и под ДОС-ом.
Только скажите компилятору .386
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
23.02.2016, 15:52
общий
23.02.2016, 15:52
Адресаты:
В реальной ОСи не хочу экспериментировать с резидентами/перехватом прерываний
У Вас и не получится ОС не даст!
Точнее, можно, но только надо писать системные драйвера, а это намного сложнее И это совсем не то, что Вы сейчас изучаете...
Так что пишите смело, Вы ничего не поломаете!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
23.02.2016, 15:58
общий
Адресаты:
Цитата: YwaN
Восстанавливать обработчики прерываний и выгружать резиденты я пока не умею.

Значит Вам пока рано главу 24 учить. Возвращайтесь пока в 10-ю. Без четкого понимания резидентов: запуск, повторный запуск, перехват прерываний, обработка прерваний, выгрузка(востановление прерываний и завершение работы) эту область асссемблера нужно обходить.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399551
10
23.02.2016, 18:53
общий
[q=31795][/q]
По-моему я уже все до 24 главы уже неплохо освоил, пришлось для этого попотеть. Тщательно анализировал код, ставил эксперименты, смотрел в отладчике. Но только в книге про выгрузку резидентов и восстановление прерываний что-то не особо сказано.

Пробовал сам прописывать сохраненный адрес оригинального обработчика прерывания в таблицу векторов с запретом и без запрета прерываний - что-то не работает. Но я еще похимичу с этим и, если что, задам вопрос здесь.

Сразу скажу, что использую на 97% только то, чему научился из книги.
давно
Старший Модератор
31795
6196
24.02.2016, 11:37
общий
Адресаты:
Цитата: YwaN
По-моему я уже все до 24 главы уже неплохо освоил, пришлось для этого попотеть. Тщательно анализировал код, ставил эксперименты, смотрел в отладчике. Но только в книге про выгрузку резидентов и восстановление прерываний что-то не особо сказано.

Глава 27.

Для простого случая, когда после Вашего резидента не запускался другой резидент - чем отличается установка своего обработчика от востановления старого?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399551
10
24.02.2016, 20:27
общий
24.02.2016, 20:30
Цитата: Лысков Игорь Витальевич
У Вас и не получится smile ОС не даст!
Точнее, можно, но только надо писать системные драйвера, а это намного сложнее smile И это совсем не то, что Вы сейчас изучаете...
Так что пишите смело, Вы ничего не поломаете!


О, Вы наставили меня на путь истинный . Просто я не знал, что нужно всего-то перезапустить консоль. Проверил с MASM 6.15 и AFD Pro под WindXP перехват прерывания - теперь все работает, как надо!

Цитата: Зенченко Константин Николаевич
Значит Вам пока рано главу 24 учить. Возвращайтесь пока в 10-ю. Без четкого понимания резидентов: запуск, повторный запуск, перехват прерываний, обработка прерваний, выгрузка(востановление прерываний и завершение работы) эту область асссемблера нужно обходить.


Прочел сегодня 24-ю главу и узнал, что для назначения нового вектора в DS нужен сегмент оригинала, а не только смещение в DX.

Вот, набросал код. Работает как часы, пришлось с регистрами повозиться:

my_resid.asm

[code lang=asm h=300]CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h

Begin:

jmp INIT

INT21 proc
cmp ah, 9
jz PRINT ;Печатаем новую строку.
cmp ah, 0FFh
jz RET_FF ;Даем знать, что мы уже в памяти.
cmp ah, 0EEh
jz RET_ADDR ;Возвращаем вектор оригинала в ES:BX.
cmp ah, 99h
jz REST ;Восстанавливаем оригинал.

jmp dword ptr cs:[ADDR_INT21]

PRINT:
push ds
push dx

push cs
pop ds

lea dx, MES_HACKED
pushf
call dword ptr cs:[ADDR_INT21]

pop dx
pop ds
iret

RET_FF:
mov al, 0FFh
iret

RET_ADDR:
push cs
pop es
lea bx, ADDR_INT21
iret

REST:
mov ax, 2521h
push ds
push cs
pop ds
mov dx, word ptr ADDR_INT21
mov bx, word ptr ADDR_INT21 + 2
mov ds, bx
pushf
call dword ptr cs:[ADDR_INT21]
pop ds
iret

ADDR_INT21 dd 0

MES_HACKED db 0Ah, 0Dh, 'ХАКНУТО_!!!', 0Ah, 0Dh, '$'
INT21 endp

INIT:
mov ax, 0FF00h ;Мы еще в памяти?
int 21h

cmp al, 0FFh
jnz NEXT ;Нет? Тогда перехват.

mov ah, 0EEh
int 21h
mov ah, 9
lea dx, MES_IN_MEMORY
pushf
call dword ptr es:[bx]
int 20h

NEXT:
mov ax, 3521h
int 21h

mov word ptr ADDR_INT21, bx
mov word ptr ADDR_INT21 + 2, es

mov ax, 2521h
lea dx, INT21
int 21h

lea dx, INIT
int 27h

MES_IN_MEMORY db 0Ah, 0Dh, 'Резидент уже в памяти.', 0Ah, 0Dh, '$'

CSEG ends
end Begin
[/code]

... и подопытный кролик
my_test.asm

[code lang=asm h=300]CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h

Begin:

mov ah, 9
lea dx, MES_TEST_1
int 21h

mov ah, 10h
int 16h

mov ah, 99h
int 21h

mov ah, 9
lea dx, MES_TEST_2
int 21h

mov ah, 10h
int 16h

int 20h

MES_TEST_1 db 0Ah, 0Dh, 'Будет перехвачено.', 0Ah, 0Dh, '$'
MES_TEST_2 db 0Ah, 0Dh, 'Восстановлено.', 0Ah, 0Dh, '$'

CSEG ends
end Begin
[/code]

давно
Посетитель
399551
10
24.02.2016, 20:34
общий
24.02.2016, 20:34
Только неясно пока, как выгрузить резидент правильно: int20h/ret или освободить память? После восстановления он ведь в памяти болтается
давно
Посетитель
7438
7205
24.02.2016, 23:08
общий
Адресаты:
Когда программа остается резидентом, то она фактически перестает быть программой, а простым куском памяти, содержащий некоторые вектора прерываний, плюс, возможно, запрошенные сегменты памяти.
Чтобы выгрузить резидент, необходимо восстановить измененные вектора прерываний и освободить, возможно, запрошенную память и память самого резидента.
При восстановлении векторов есть одна проблема: если после резидента на тот же вектор "сядет" другой резидент, то корректное восстановление векторов неочевидно. Если восстановить "в лоб", то последующий резидент просто "потеряется".
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
24.02.2016, 23:09
общий
Адресаты:
А программки посмотрю и покритикую завтра, хорошо?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
25.02.2016, 12:01
общий
25.02.2016, 15:50
Адресаты:
В принципе неплохо
Действительно, не хватает освобождения памяти.
Кстати, кроме освобождения сегмента самого резидента, надо еще освободить сегмент окружения.
Не забудьте переконвертировать в 866 кодировку. Иначе фразы "ХАКНУТО" и "Резидент уже в памяти" будут крякозябрами
[code lang=asm h=200]
CSEG segment
assume cs:CSEG, ss:CSEG, ds:CSEG, es:CSEG
org 100h

Begin:

jmp INIT

INT21 proc
cmp ah, 9
jz PRINT ;Печатаем новую строку.
cmp ah, 0FFh
jz RET_FF ;Даем знать, что мы уже в памяти.
cmp ah, 0EEh
jz RET_ADDR ;Возвращаем вектор оригинала в ES:BX.
cmp ah, 99h
jz REST ;Восстанавливаем оригинал.

jmp dword ptr cs:[ADDR_INT21]

PRINT:
push ds
push dx

push cs
pop ds

lea dx, MES_HACKED
pushf
call dword ptr cs:[ADDR_INT21]

pop dx
pop ds
iret

RET_FF:
mov al, 0FFh
iret

RET_ADDR:
push cs
pop es
lea bx, ADDR_INT21
iret

REST:
mov ax, 2521h
push ds
push cs
pop ds
mov dx, word ptr ADDR_INT21
mov bx, word ptr ADDR_INT21 + 2
mov ds, bx
pushf
call dword ptr cs:[ADDR_INT21]
pop ds
mov ax, cs:[2ch]
mov es, ax
mov ah, 49h
int 21h
push cs
pop es
mov ah, 49h
int 21h
iret

ADDR_INT21 dd 0

MES_HACKED db 0Ah, 0Dh, 'ХАКНУТО_!!!', 0Ah, 0Dh, '$'
INT21 endp

INIT:
mov ax, 0FF00h ;Мы еще в памяти?
int 21h

cmp al, 0FFh
jnz NEXT ;Нет? Тогда перехват.

mov ah, 0EEh
int 21h
mov ah, 9
lea dx, MES_IN_MEMORY
pushf
call dword ptr es:[bx]
int 20h

NEXT:
mov ax, 3521h
int 21h

mov word ptr ADDR_INT21, bx
mov word ptr ADDR_INT21 + 2, es

mov ax, 2521h
lea dx, INT21
int 21h

lea dx, INIT
int 27h

MES_IN_MEMORY db 0Ah, 0Dh, 'Резидент уже в памяти.', 0Ah, 0Dh, '$'

CSEG ends
end Begin
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
25.02.2016, 12:08
общий
это ответ
Здравствуйте, YwaN!
Досовские программы в ХР необходимо запускать из консоли
Для использования 32-битных регистров в 16-битных досовских программах достаточно указать в тексте .386
В процессе обсуждения в мини-форуме научились выгружать резидент из памяти.
Удачи в изучении Ассемблера!
5
Грамотная консультация.<br>Хороший и отзывчивый специалист.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399551
10
25.02.2016, 16:07
общий
Цитата: Лысков Игорь Витальевич
Не забудьте переконвертировать в 866 кодировку. Иначе фразы "ХАКНУТО" и "Резидент уже в памяти" будут крякозябрами smile


Я пишу код в AkelPad и кодировку установил по умолчанию 866. От-туда и скопировал исходники
давно
Посетитель
7438
7205
25.02.2016, 16:13
общий
25.02.2016, 16:14
Адресаты:
Если скопировать весь текст в редактор обратно, то получите ANSI
Впрочем можете скопировать только нужный кусочек[code lang=asm] REST:
mov ax, 2521h
push ds
push cs
pop ds
mov dx, word ptr ADDR_INT21
mov bx, word ptr ADDR_INT21 + 2
mov ds, bx
pushf
call dword ptr cs:[ADDR_INT21]
pop ds
mov ax, cs:[2ch]
mov es, ax
mov ah, 49h
int 21h
push cs
pop es
mov ah, 49h
int 21h
iret
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399551
10
25.02.2016, 16:38
общий
25.02.2016, 16:41
[q=7438][/q]

Как раз хотел спросить про освобождение памяти, но Вы меня опередили

Наконец-то с резидентами все прояснилось.

Есть еще вопросы. Но, думаю, лучше для них создать отдельные темы наверно, чтобы все в кучу не мешать.
давно
Посетитель
7438
7205
25.02.2016, 16:45
общий
Адресаты:
Цитата: YwaN
Есть еще вопросы. Но, думаю, лучше для них создать отдельные темы наверно, чтобы все в кучу не мешать.
Правильно думаете Спрашивайте, ответим, разложим по полочкам
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
25.02.2016, 16:53
общий
Адресаты:
Кстати, чтобы указать адресата, не стоит использовать цитирование. Оно служит для цитирования кого-то, т.е. напомнить, о чем идет речь.
Для указания адресата следует использовать либо список "Кому:", либо нажать на фото(аватар) адресата. Во втором случае появится в тексте [ forid=XXXXXX ] (без пробелов), в обоих случаях сообщение отправится нужному адресату.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа