Консультация № 189642
08.07.2016, 19:00
0.00 руб.
0 7 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Скажите пожалуйста книга Калашникова О.А глава 13 как мы "прыгаем" в область 7-й страницы
jmp dword ptr cs:[Off_move] если Off_move - содержит только смещение метки Lab_jmp, а сам сегмент в Seg_mov,
а переменную Seg_mov мы используем только для копирования кода в область 7-й страницы.
Допустим если в предыдущих главах мы в переменную Int_21h_vect сохраняли и сегмент и смещение и после вызывали call dword prt cs:[Int_21h_vect], то было всё понятно, а как это происходит в файле virus13.com



Обсуждение

давно
Старший Модератор
31795
6196
08.07.2016, 19:30
общий
08.07.2016, 19:34
Адресаты:
Сравните это:
[code lang=asm h=50]Int_21h_vect dd ?[/code]
и это
[code lang=asm h=50]Off_move dw offset Lab_jmp
Seg_move dw 0BF00h[/code]
Оба участка занимают 4-е байта и записывали их так:
[code lang=asm h=50] mov word ptr Int_21h_vect,bx
mov word ptr Int_21h_vect+2,es[/code]
Просто в вирусе сегмент записывать не нужно, он уже есть, т.е. зарание определен, и переходить мы будем также как и примере резидента.
[code lang=asm h=50]jmp dword ptr cs:[Off_move][/code]
[code lang=asm h=50]jmp dword ptr cs:[Int_21h_vect][/code]
Тут ключевое слово dword
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
400156
9
08.07.2016, 20:57
общий
Ну вот смотрите мы загружаем вирус допустим в сегмент 1F6D:100, потом копируем вирус в сегмент 0BF00:100.
У нас получается два одинаковый кода в разный сегментах(по разным адресам) 1F6D:100 и 0BF00:100. Когда мы выполняем команду (находясь в сегменте 1F6D)
jmp dword ptr cs:[Off_move], то мы записываем в CS то что находится в Off_move и переходим по этому адресу. Но в переменной Off_move содержит же только
смещение (одно слово), как команда jmp понимает что надо перейти на сегмент 0BF00. Допустим если мы записали вот так :
Off_move dd ?
mov word ptr Off_move,offset Lab_jmp
mov word ptr Off_move+2,0BF00h
Тогда понятно, что Off_move содержит сегмент и смещение и командой jmp dword ptr cs:[Off_move] мы переходим с сегмента 1F6D на сегмент 0BF00 со смещением Lab_jmp. И продолжаем выполнение программы в сегменте 0BF00.
давно
Старший Модератор
31795
6196
08.07.2016, 22:07
общий
Адресаты:
Нет!!!
Своими словами
Цитата: novice
Допустим если в предыдущих главах мы в переменную Int_21h_vect сохраняли и сегмент и смещение

Вы показали, что поняли как происходит дальний переход в резидентах,
Т.е. строка
[code lang=asm h=50]jmp dword ptr cs:[Int_21h_vect][/code]
читает 4-е байта по адресу Int_21h_vect, первые два байта загружает как смещение в IP, вторые в сегмент CS.

Теперь строка из вируса
[code lang=asm h=50]jmp dword ptr cs:[Off_move][/code]
аналогично читает 4-е байта и аналогично их загружает. Т.е. все происходит правильно, как в резиденте: первые два байта загружает как смещение в IP, вторые в сегмент CS.
Я Вам писал:
Цитата: Зенченко Константин Николаевич
ключевое слово dword

4-е байта, что в резидентах, что в вирусе, не обращайте внимание на dd, dw - это директива компилятору зарезервировать количество байт и всё. Важно какую команду будет выполнять процессор, а это переход по 4-м байтам сегмент:смещение(но блягодаря интелу всё наоборот в памяти смещение:сегмент).

Вы наверное не понимаете, почему вирус себя копирует, копирует именно в этот сегмент.
Как и настоящий биологический вирус (отсюда и название), вирус скрывается.
СОМ-файлы очень редко когда используют всю видеопамять полностью, в 64-х килобайтах есть: 256-ть байт системного загрузчика, х/з(хто знает) сколько стека, куча данных и ещё и код. т.е. для работы достаточно нескольких видеостраниц, таких глобальных проэктов я не помню(т.к. перекючая видеостраницы, можно быстро менять изображения на эране). Вирус себя прячет в последнюю, очередь использования которой маловероятно когда наступит. После перехода в видеостраницу вирус начинает активно искать СОМ-файлы, и закончив поиск передает управление обратно зараженной программе, востановив первые байты(переход на вирус[он дописывает себя в конец программы] и маркер уже зараженности[чтобы программы не росли бесконечно]), чтобы пользователь ничего не заметил.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
09.07.2016, 10:32
общий
Адресаты:
Но в переменной Off_move содержит же только смещение (одно слово), как команда jmp понимает что надо перейти на сегмент 0BF00

Команды jmp word ptr и jmp dword ptr - это разные команды. Первая меняет только смещение в текущем сегменте, вторая же меняет и смещение и сегмент, загружая их из двух соседних слов, адрес пары смещение:сегмент берется из команды.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400156
9
09.07.2016, 10:36
общий
Спасибо вроде разобрался!!!
давно
Посетитель
7438
7205
09.07.2016, 10:45
общий
Адресаты:
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Старший Модератор
31795
6196
13.07.2016, 10:14
общий
это ответ
Здравствуйте, novice!

Ключевым словом в обоих командах является dword, именно оно заставляет компилятор генерровать код дальнего косвенного перехода. Т.е. процессор выполняя команду, читает 4-е байта по указанному адресу и записывает их в IP(первые два - смещене) и CS(вторые два - сегмент).
В главе о резидентах, читался адрес старого обработчика прерывания и записывался в переменную Int_21h_vect(смещение:сегмент). В главе о вирусах, мы записываем только смещение, т.к. адрес сегмента определен зарание, т.е. в этот сегмент будет переносится, а затем и исполнятся код вируса.

Удачи!
5
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа