Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
18.12.2013, 13:38  [ТС]
ГЛАВА 18
ПРОЧИЕ ОЧЕНЬ ПОЛЕЗНЫЕ КОМАНДЫ
(окончание)

Команда NOP

(Нет операции = NO OPERATION)
Синтаксис команды:
NOP
Семантика команды: пустая команда.
Алгоритм работы: не производит никаких действий. Более тщательный анализ машинного кода 90h показывает, что на самом деле это команда обмена содержимого регистра EAX с регистром EAX – XCHG EAX,EAX, что эквивалентно «ничего не выполнять».
Опкод команды xchg eax,reg32 90+rd
Опкод Команда
XCHG EAX,EAX 90h
XCHG ECX,EAX 91h
XCHG EDX,EAX 92h
XCHG EBX,EAX 93h
XCHG ESP,EAX 94h
XCHG EBP,EAX 95h
XCHG ESI,EAX 96h
XCHG EDI,EAX 97h
Применение: очень распространенная хакерская команда с машинным кодом 90h. Команда NOP, занимая один байт, может использоваться для резервирования места в сегменте кода или организации программной задержки. В примере, приведенном в описании команды HLT, команда NOP используется для создания задержки при синхронизации работы микропроцессора и аппаратуры компьютера. Чаще всего команда NOP используется хакерами для затирания «ненужных» фрагментов кода в чужой программе, например, вызов процедур, отвечающих за идентификацию пользователя или ограничению числа запусков программы. Эквивалентное действие выполняет команда перехода на следующий адрес за командой перехода – JMP $+2 (машинный код EB 00), но это уже двухбайтовая команда. В таблице приведены другие «ничегонеделающие» команды
Длина в байтах команда Hex-код
1 xchg eax,eax 90
2 mov eax,eax 8B C0
2 lea eax,[eax] 8D 00
2 jmp short $+2 EB 00
3 shl eax,0 C1 E0 00
3 shr eax,0 C1 E8 00
3 lea eax,[eax] 8D 04 20
3 lea eax,[eax] 8D 40 00
4 lea eax,[eax+00] 8D 44 20 00
4 shrd eax,eax,0 0F AC C0 00
5 jmp $+5 E9 00 00 00 00
6 lea eax,[eax+00000000] 8D 80 00 00 00 00
7 lea eax,[eax+00000000] 8D 84 20 00 00 00 00
7 lea eax,[eax*1+00000000] 8D 04 05 00 00 00 00
7
db 0EAh;jmp far ptr a1
dd a1
dw 1Bh;значение в cs
a1:
4000C4: EACB0040001B00
4000CB: ...

Команда BOUND
(Контроль нахождения индекса массива в границах =
Check array BOUNDS)
Синтаксис:
BOUND <Array_Index>,<границы массива>
Семантика команды: проверка нахождения значения индекса Array_Index в границах массива.
Алгоритм работы: сравнить значение в регистре Array_Index с двумя значениями (Lower_Bound и Upper_Bound), расположенными последовательно в ячейке памяти, адресуемой операндом границы массива. Диапазон значений индекса Array_Index определяется используемым регистром Array_Index:
  • если это 16-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего (Lower_Bound) и верхнего (Upper_Bound) индексов границы массива;
  • если это 32-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных двойных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего (Lower_Bound) и верхнего (Upper_Bound) индексов границы массива;
Если в результате проверки значение из регистра вышло за пределы указанного диапазона значений, то возбуждается прерывание INT 5h (#BR), если нет, программа продолжает выполнение.
Применение: команда BOUND используется для контроля выхода за нижнюю или верхнюю границы массива. Значения этих границ помещаются в два последовательных слова (двойных слова) в памяти.
Адрес этих слов (двойных слов) указывается операндом границы массива.
Далее по ходу работы программы значение в регистре индекс сравнивается со значениями этих двух границ, и если нижняя граница (Lower_Bound) https://www.cyberforum.ru/cgi-bin/latex.cgi?\leq индекс (Array_Index) https://www.cyberforum.ru/cgi-bin/latex.cgi?\leq верхняя граница (Upper_Bound), то программа продолжает выполнение. В противном случае генерируется INT 5 (#BR).
Далее в программе обработки прерывания INT 5 выполняется необходимая корректировка и возврат в основную программу. Если корректировка не выполнена, то по умолчанию из прерывания управление возвратится на вызвавшую его инструкцию bound, что снова вызовет прерывание и в итоге зацикливание.
Инструкция bound не поддерживается в режиме x64 и поэтому имеет, скорее, исторический интерес.
Инструкция не изменяет состояние флагов.
Псевдокод:
IF 64bit Mode
THEN #UD;
ELSE
IF (ArrayIndex < LowerBound OR ArrayIndex > UpperBound)
THEN
(* Below lower bound or above upper bound *)
IF <equation for PL enabled>
THEN BNDSTATUS ← 0
#BR;
END IF;
END IF;
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;Фрагмент обработки массива с размерностью элементов в слово
;область данных
BOUNDMAS LABEL WORD
LOW_BOUND DW 0 ;нижняя граница
UPP_BOUND DW 200 ;верхняя граница
MAS DW 100 DUP (?)
XOR DI,DI ;очистка индексного регистра
CYCL: MOV AX,MAS[DI] ;перебор элементов массива
ADD DI,2
BOUND DI,BOUNDMAS
;если значение в DI не будет попадать в границы, то будет вызван
;обработчик прерывания #5, где можно скорректировать значение IP/EIP
;в стеке с тем, чтобы выйти из бесконечного цикла, например, на метку
;М2 или выполнить другие действия
JMP CYCL
М2:
Или ещё один полный пример использования bound для подсчёта количества чисел массива, входящих в некий диапазон
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
LOCALS
 
.model small
 
.stack 200h
 
.data
        CrLf            db      0Dh, 0Ah, '$'
        msgResult       db      'Count: ', '$'
        msgPressAnyKey  db      0Dh, 0Ah, 'Press any key to exit...', '$'
        BoundMas        label   word
                LowBound        dw      -10
                HighBound       dw      20
        Array           dw      -19, -10, -11, -12,\
                                -13,  14,  15,  16,\
                                 17,  18,  19,  20, 21
        ArrayLen        dw      ($-Array)/2
 
.data?
        Count           dw      ?
        OldInt05h       dd      ?
.code
.386
 
;новый обработчик прерывания int 05h для обработки команды bound
NewInt05h       proc
        ;основное действие прерывания - уменьшение счётчика
        dec     [Count]
        ;для остановки генерации прерывания
        ;регистр приводится к требуемым границам
        mov     ax,     [LowBound]
        ;завершаем цепочку обработчиков прерывания:
        ;нам печать экрана не нужна, а полезная работа уже выполнена
        iret
        ;если бы восстанавливалась цепочка обработчиков
        ;jmp    far ptr [OldInt05h]
NewInt05h       endp
 
;Вывод на экран целого 16 разрядного беззнакового числа
;на входе:
;  ax - целое 16 разрядное беззнаковое число
ShowUInt16       proc
        push    bx
        mov     bx,     10
        xor     cx,     cx      ;символов в модуле числа
        @@div:
                xor     dx,     dx
                div     bx
                push    dx
                inc     cx      ;количество цифр в числе
                or      ax,     ax
        jnz     @@div
        mov     ah,     02h
        @@store:
                pop     dx
                add     dl,     '0'
                int     21h
        loop    @@store
        pop     bx
        ret
ShowUInt16       endp
 
main    proc
        ;инициализация сегментного регистра ds адресом сегмента данных
        mov     ax,     @data
        mov     ds,     ax
 
        ;перехват Int 05h
        mov     ax,     3505h
        int     21h
        mov     word ptr [OldInt05h+0], bx
        mov     word ptr [OldInt05h+4], es
        push    ds
        mov     ax,     cs
        mov     ds,     ax
        mov     ax,     2505h
        mov     dx,     offset cs:NewInt05h
        int     21h
        pop     ds
 
        ;обработка массива
        lea     si,     [Array]
        mov     cx,     [ArrayLen]
        mov     [Count],        cx
        cld
        @@For:
                lodsw
                bound   ax,     dword ptr [BoundMas]
        loop    @@For
 
        ;восстановление Int 05h
        push    ds
        mov     ax,     2505h
        lds     dx,     [OldInt05h]
        int     21h
        pop     ds
 
        ;вывод результата
        mov     ah,     09h
        lea     dx,     [msgResult]
        int     21h
        mov     ax,     [Count]
        call    ShowUInt16
        ;ожидание нажатия любой клавиши
        mov     ah,     09h
        lea     dx,     [msgPressAnyKey]
        int     21h
 
        mov     ah,     00h
        int     16h
 
        ;завершение программы
        mov     ax,     4C00h
        int     21h
main    endp
 
end     main
BUGAGA – программа-шутка
Запускаем программу notepad.exe, пишем слово: «bugaga» или «bu» или просто «b» – результат всё равно будет одним и тем же – поэтому остановимся на однобуквенном варианте. Сохраняем документ под именем bugaga.com и запускаем. Открывается консольное окно, в котором ничего не происходит, висит курсор и все. Возвращаемся в файл-менеджер (или Проводник) и запускаем bugaga.com еще раз. Во втором окне курсор скачет по всему окну, а в первом курсор пропадает вообще. Программа грузит процессор на все 100%. Если к компьютеру подключен LPT-принтер, на него вываливаются пустые страницы.
Открываем файл bugaga.com любым дизассемблером.
Получаем текст программы из одной команды:
команда текст hex-код
bound si,[di+67h] bug627567h
При старте com-программы содержимое регистров AX=BX=SI=DI=0, в ячейке ds:[67h]=0020h, команда bound сравнивает значение в регистре SI с диапазоном значений в ячейках, на которые указывает DI+67h, первое значение – это нижний индекс, второе – верхний. Так как значение в SI за пределами указанного диапазона значений, то возбуждается прерывание с номером 5. Если удерживать клавишу ctrl – увеличивается скорость перемещения курсора. Программа выкидывает ВО ВСЕ ВЫХОДНЫЕ ПОТОКИ пробелы. Принтер пробелы не печатает, а просто двигает головку. Так как приведение регистра si к проверяемому диапазону не происходит, то происходит зацикливание программы.
2
Закрытая тема Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
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 . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru