Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/2256: Рейтинг темы: голосов - 2256, средняя оценка - 4.63
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16373 / 7685 / 1080
Регистрация: 11.11.2010
Сообщений: 13,759
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
Закрытая тема Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru