Консультация № 38981
30.03.2006, 17:26
0.00 руб.
0 6 2
Почему послу выполнения этого кода:
jmp dword ptr cs:[Off_move]
в программе которая изложена ниже, мы переходим не сегмент 0BF00h

.286
cseg SEGMENT
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Begin:
jmp Init

Off_move dw offset Lab_jmp
Seg_move dw 0BF00h

Off_return dw offset Lab_return
Seg_return dw ?

Open_file proc
mov ax,3D02h
int 21h
mov Handle,ax
mov bx,ax
ret

Handle dw 0FFFFh
Open_file endp

Close_file proc
cmp Handle,0FFFFh
je No_close

mov bx,Handle
mov ah,3Eh
int 21h

No_close:
ret
Close_file endp

Find_first proc
mov ah,4Eh
xor cx,cx
mov dx,offset Mask_file
int 21h
ret
Mask_file db ‘*.com‘,0
Find_first endp

Find_next proc
xor dx,dx
xor cx,cx
mov ah,4Fh
int 21h
ret
Find_next endp

Infect_file proc
clc

ret
Infect_file endp
Init:
mov es,Seg_move
mov di,100h
mov cx,offset Finish-100h


mov si,100h
rep movsb


jmp dword ptr cs:[Off_move]

Lab_jmp:
nop
nop

push cs
pop ds

mov Seg_return,ss

mov ah,1Ah
xor dx,dx
int 21h

call Find_first
jc Nomore_files

Inf_file:
call Infect_file
jnc Nomore_files

call Find_next
jnc Inf_file

Nomore_files:
jmp dword ptr cs:[Off_return]

Lab_return:
push cs
push cs
pop ds
pop es

mov ah,1Ah
mov dx,80h
int 21h

ret

Finish equ $

CSEG ends
end Begin

Обсуждение

давно
Посетитель
7438
7205
30.03.2006, 17:57
общий
это ответ
Здравствуйте, Platon!
Так команда jmp dword ptr cs:[Off_move] и делает косвенный межсегментный
переход на адрес, хранимый по адресу cs:[Off_move], причем смещение
хранится по указанному адресу, а сегмент по адресу cs:[Off_move+2]
PS Обрати внимание на "словечко" dword после jmp-а
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
31.03.2006, 07:23
общий
Я, с вами совершенно согласен, но в переменнойoff_move содержится только смещение lab_jmp (Off_move dw offset Lab_jmp), а cs указывает на текущий сегмент, но не на 0BF00h. И как можна так прыгнуть?????
давно
Посетитель
7438
7205
31.03.2006, 15:45
общий
Команда jmp dword ptr загружает и смещение, и сегмент. Сегмент берется из следующего слова, как раз 0BF00h
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
31.03.2006, 15:55
общий
Тебя сбило с толку, что Off_move - адрес слова.Дело в том, что если бы мы не сказали jmp dword ptr,а просто jmp cs:[Off_move], то, действительно, мыбы прыгнули в пределах старого сегмента.Но, сказав jmp dword ptr [], мы указали трансляторусформировать команду межсегментного перехода.При этом указанный адрес уже интерпретируется какадрес двойного слова, содержащее в себе смещение и сегмент
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
31.03.2006, 19:38
общий
это ответ
Здравствуйте, Platon!
Как поживаете?

> В программе которая изложена ниже, мы переходим не сегмент 0BF00h
>> Этот вопрос я понел двояко т.е.
1. Почему мы переходим не на сегмент 0BF00h?
2. Почему мы переходим на сегмент 0BF00h?
Ответ к первому вопросу:
Я пропустил вашу программу через отладчик и у меня всё работало нормально т.е.
был переход на сегмент 0BF00h после выполнения команды jmp dword ptr cs:[Off_move].
Ответ к второму вопросу:
сегмент 0BF00h - это сегмент седьмой страницы дисплея, туда происходит как я понимаю копирование тела вируса, почему? Этим сегментом практически не пользуются программы, следовательно мы не затрём код какой-нибудь программы.

С, Уважением MnEm0n!C.

Неизвестный
31.03.2006, 21:49
общий
Большое вам спасибо, Игорь Витальевич, я всё понял!!!!!
Форма ответа