Бутенко, В. В. Механизмы отладки кода / В. В. Бутенко, Д. С. Бутенко. — Текст : непосредственный // Актуальные вопросы технических наук : материалы III Междунар. науч. конф. (г. Пермь, апрель 2015 г.). — Пермь : Зебра, 2015. — С. 12-14. — URL: https://moluch.ru/conf/tech/archive/125/7395/ (дата обращения: 10.07.2023).
Отладка — важный этап разработки ПО, на котором обнаруживают, локализуют и устраняют ошибки. Не менее важен инструмент отладки и понимание принципов его работы.
Отладчик — это инструмент анализа программ в реальном времени, позволяющий выполнять пошаговую трассировку, отслеживать значения переменных в процессе выполнения программы, обрабатывать точки прерывания, манипулировать таблицами символов и т.д [1].
Всё семейство отладчиков можно разделить на три группы: отладчики режима пользователя, отладчики режима ядра и эмулирующие отладчики.
Отладчики режима ядра
Отладчики этой группы взаимодействуют с ядром процессора. Фактически отладчик режима ядра глобально перехватывает системные функции, которые отвечают за доступ к памяти, создание и завершение процессов. Используют они регистры отладки [2].
PYCHARM ДЛЯ PYTHON. 2 ЧАСТЬ. DEBUGGER
Регистры отладки введены в процессоры начиная с Intel 80386. Они являются привилегированным ресурсом и доступны программе либо в режиме реальной адресации, либо в защищённом режиме с наивысшим уровнем привилегий (CPL = 0).
Всего существует восемь регистров отладки (DR0 — DR7). Они позволяют ставить контрольные точки на чтение и запись областей памяти и портов ввода-вывода.
DR7 является управляющим регистром, координирующим работу точек останова.
Биты 0–7 (Li/Gi) — разрешения локальных и глобальных контрольных точек.
Биты 8–9 (Le/Ge) — соответствие контрольных точек данных.
Бит 13 (GD) — предназначен для защиты отладчика (запрет доступа к регистрам отладки).
Биты 18–19, 22–23, 26–27, 30–31 (LENi) — задают длину проверяемого значения для каждой контрольной точки.
Биты 16–17, 20–21, 24–25, 28–29 (Rwi) — задают для каждой контрольной точки тип действия, при котором она должна сработать.
Биты 10–12, 14–15 — зарезервированы.
DR6 содержит информацию о том, какая из точек останова вызвала особую ситуацию отладки.
Биты 0–3 (B0 — B3) — устанавливаются при встрече соответствующей контрольной точки.
Бит 13 (BD) — устанавливается когда следующая команда читает или записывает один из отладочных регистров.
Бит 14 (BS) — устанавливается, если ловушка отладки генерируется из-за включенного пошагового режима.
Бит 15 (BT) — устанавливается перед входом в обработчик прерываний отладки.
Биты 4–12, 16–31 — зарезервированы.
DR5 — DR4 зарезервированы, любая попытка доступа к этим регистрам будет сопровождаться 6h прерыванием (неопределённый код операции).
DR3 — DR0 содержат линейные адреса четырёх точек останова. Сравнение этих адресов производится до трансляции физического адреса. Каждая из четырёх точек останова отдельно описывается в регистре DR7.
Уроки Python / Как отлаживать код в Пайтон / Программирование
Также в целях отладки используются некоторые специальные регистры MSR. Эти регистры не являются стандартными, их количество и назначение различны в различных моделях процессора. Как правило это регистры DebugCtlMSR (управляющий регистр), LastBranchToIP, LastBranchFromIP (регистры адресов последнего перехода, прерывания или особой ситуации), LastExceptionToIP, LastExceptionFromIP (регистры адресов последнего перехода перед последним прерыванием, особой ситуацией).
Отладчики режима пользователя
Отладчики этой группы используют отладочный интерфейс прикладного программирования Debugging API и взаимодействуют с процессором через операционную систему.
Этот интерфейс позволяет создать событийно-управляемый отладчик. Это значит, что такой отладчик будет получать управление с возникновением некоторого события в процессе отладки.
Принципы взаимодействия с Debugging API
Debugging API позволяет загрузить программу, подсоединиться к ней для отладки, получить низкоуровневую информацию (ID процесса, адрес входной точки и т. д.), получить уведомления о запуске или уничтожении процесса.
Чтобы создать пpоцесс для отладки, необходимо вызвать функцию CreateProcess с флагом DEBUG_PROCESS. Windows будет посылать уведомления о важных отладочных событиях, котоpые пpоисходят в отлаживаемом пpоцессе. Он будет немедленно замоpожен, пока пpогpамма не выполнит то, что должна. Если отлаживаемый пpоцесс создаст дочеpние пpоцессы, Windows также будет посылать уведомления о пpоисходящих в них отладочных событиях. Отключить эту возможность можно заменив флаг DEBUG_PROCESS на DEBUG_ONLY_THIS_PROCESS.
Подсоединиться к уже выполняющемуся пpоцессу возможно с помощью функции DebugActiveProcess.
Когда пpоцесс создан или пpисоединён, он замоpаживается, пока пpогpамма не вызовет WaitForDebugEvent. Функция блокиpует вызывающий поток, пока не пpоизойдет ожидаемое событие или не истечёт заданный вpеменной интеpвал. Для продолжения выполнения отлаживаемого процесса служит функция ContinueDebugEvent. Она продолжает выполнение потока, который был остановлен произошедшим событием. Подобный цикл должен повторяться пока отлаживаемый процесс не завершится.
Как только начнётся отладка программы, отсоединиться от процесса будет невозможно до его завершения.
Так как в одно и тоже время может быть запущено несколько программ, Windows даёт каждому потоку небольшой временной интервал, по истечению которого поток замораживается и запускается следующий, согласно приоритету. Но перед тем как запустится другой поток, Windows сохраняет значения регистров текущего.
Когда случается отладочное событие, Windows замоpаживает отлаживаемый пpоцесс, сохраняя значения регистров. Получить эти значения возможно с помощью функции GetThreadContext, а изменить их функцией SetThreadContext [3].
Трассировка отлаживаемого процесса
Пошаговая отладка, или трассировка, — это возможность пpедоставленная самим пpоцессоpом. Восьмой бит pегистpа флагов называется trap-флаг. Если этот флаг (бит) установлен, пpоцессоp pаботает в пошаговом pежиме. Пpоцессоp будет генеpиpовать отладочное исключение после каждой инстpукции. После того, как сгенеpиpовано отладочное исключение, trap-флаг автоматически очищается.
Для перехода в пошаговый режим вызываем GetthreadContext, указав CONTEXT_CONTROL в ContextFlags, чтобы получить значение флагового pегистpа. Устанавливаем trap-бит в поле regFlag стpуктуpы CONTEXT. Вызываем SetThreadContext. Ждем отладочного события. Отлаживаемый пpоцесс будет запущен в пошаговом pежиме. После выполнение каждой инстpукции будут получены значение EXCEPTION_DEBUG_EVENT, EXCEPTION_SINGLE_STEP и trap-флаг очистится.
Для трассировки следующей функции необходимо установить trap-флаг снова [4].
Эмулирующий отладчик — это отладчик, который самостоятельно интерпретирует и выполняет команды программы. Такой отладчик эмулирует выполнение всех потенциально опасных действий, которые программа может использовать для выхода из-под контроля исследователя. Однако основная проблема создания эмулирующих отладчиков заключается в том, что иногда им приходится эмулировать реальное периферийное оборудование, а это чрезвычайно сложная задача
Эмулирующие отладчики находятся ниже виртуального процессора, для отлаживаемого процесса они совершенно невидимы. Кроме того, они не используют никаких ресурсов эмулируемого процессора. А благодаря дополнительному кольцу защиты, работая в котором гипервизор может перехватывать все события, требующие внимания с его стороны [5].
Эмулирующий отладчик интерпретирует и выполняет машинные инструкции программы (например, вместо mov bx, 4 они присваивают переменной, соответствующей регистру bx — скажем, reg_bx — число 4). Существуют также отладчики с неполной эмуляцией, которые эмулируют только опасные команды, а остальные выполняют на реальном процессоре.
Такие отладчики нейтрализуют практически все методы противодействия отладке: блокировку прерываний и устройств, работу с контроллерами через порты, подсчеты контрольных сумм для выявления контрольных точек, контроль стека, а также, методы основанные на особенностях процессора и DOS.
Отладчик является активным инструментом и позволяет проследить процесс выполнения по шагам, получая в любой момент всю информацию о текущем состоянии программы или вносить изменения в порядок ее выполнения. Важно понимать механизм его работы, хотя бы для того, чтобы понимать как выполняется программа и как повлиять на процесс её выполнения, замораживая процессы, потоки и изменяя его алгоритм.
1. Отладчик ядра [Электронный ресурс] URL: https://ru.wikipedia.org/wiki/Отладчик_ядра
2. Архитектура и система команд микропроцессоров x86 [Электронный ресурс] URL: http://www.club155.ru/programming/
3. Basic Debugging. Debugging Reference [Электронный ресурс] URL: https://msdn.microsoft.com/en-us/library/windows/desktop/ms679276 %28v=vs.85 %29.aspx
4. Win32 API — Debugging API [Электронный ресурс] URL: http://www.wasm.ru/wault/article/show/1001028
5. Искусство дизассемблирования. К. Касперски, Е. Рокко. Спб.: БХВ — Петербург, 2008. — 896 стр. ISBN 978–5-9775–0082–1
6. Программирование на ассемблере на платформе x86–64. Аблязов Р. Спб.: ДМК Пресс, 2011. — 304 стр. ISBN 978–5-94074–676–8
7. Ассемблер — это просто. Калашников О. Спб.: БХВ — Петербург, 2011. — 336 стр. ISBN 978–5-9775–0591–8
8. Реверсинг и защита программ от взлома. Панов А. Спб.: БХВ — Петербург, 2006. — 207 стр. ISBN 5–94157–889–7
9. Создание защищённых от вторжения прикладных программ. Джеймс К., Прайс М. Спб.: ДМК Пресс, 2009. — 457 стр. ISBN 978–5-94074–466–5
10. Программирование на ассемблере. Одиноков В., Колубинский В. Спб: Горячая Линия — Телеком, 2011. — 312 стр. ISBN 978–5-99–12–0162–9
11. Assembler. Программирование на языке ассемблера IBM PC. Пильщиков В. Спб.: Далог МИФИ, 2005. — 301 стр. ISBN 5–86404051–7
12. Ассемблер для Win32. Галисеев Г. Спб.: Вильямс, 2007. — 368 стр. ISBN 978–5-8459–11–97–1
Основные термины (генерируются автоматически): отлаживаемый процесс, API, бит, Отладчик, отладчик режима ядра, пошаговый режим, регистр, регистр отладки, особая ситуация, отладочное исключение.
Похожие статьи
Расширение отладочного интерфейса PyDbg для.
определенных блоков кода для удостоверения отсутствия изменений, сделанных из-за отладки); детектирование на основе аппаратного обеспечения и регистров (проверка состояния специальных
Данное значение является номером порта отладчика для процесса.
Использование отладочной платы STM32F7 Discovery для.
3) создание/отладка кода программы микроконтроллера для управления устройством.
После того, как будет написан и полностью отлажен код программы, задуманный
Интегрированный в плату ST-LINK/V2–1 предоставляет встроенный в схему отладчик и программатор для STM32.
Разработка и отладка программного обеспечения для подавления.
В данной статье описана спроектированная программа, представляющая виртуальную программу для подавления артефактов в электрокардиограмме, написанная в среде Mathcad. Так же был построен график спектральной области.
Лабораторный стенд для отладки периферийных схем.
Библиографическое описание: Каримова Н. О. Лабораторный стенд для отладки
Эти устройства выполняют свои задачи путем управления микропроцессорным ядром
Гарвардская архитектура основывается на наборе регистров с разделенными шинами и.
Методика исследования вредоносных программ с использованием.
. инженерии (отладчики, дизассемблеры), так и различные системы и утилиты
системы, мониторинга реестра и мониторинга процессов в режиме реального времени.
на уровне режима ядра, в отличие от инструментов, устанавливающих перехваты на библиотеки API.
Разработка веб-портала для информационной поддержки.
+ — — — + Встроенный отладчик.
Были разобраны основные техники и методы тестирования, произведен выбор библиотек, повышающих эффективность отладки и тестирования.
Восстановление простых линейных и итерационных функций.
В качестве основного инструмента используется встроенный отладчик и функция dbstop.
Выход из режима отладки либо переход к следующей точке останова осуществляется нажатием на клавишу F5.
Разумеется, процесс восстановления долог и трудоёмок, однако других.
Анализ уязвимости переполнения буфера | Статья в журнале.
На рисунке 2 (до команды отладчика dd esp) представлен дизассемблированный код начала функции display. Видно, что по адресу 0040134d происходит выполнение команды lea, которая в данном случае загружает в регистр eax указатель на область памяти в стеке.
Современные системы автоматизированного динамического.
Дизассемблер и отладчик являются неотъемлемыми программами при ручной обратной разработке образцов для анализа.
Ядром процесса анализа является библиотека CuckooMonitor.
Поэтому процесс создается в замороженном режиме.
Источник: moluch.ru
Как работает отладчик?
Как технически реализованы функции остановки и дальнейшего исполнения нативной программы? Как реализован просмотр стека, регистров и памяти? В случае интерпретатора, понятно. Ему можно скомандовать «остановись», «покажи стек» потому что интерпретатор отдельная программа со своим интерфейсом.
А вот при нативной отладке происходит какое-то волшебство, программа и отладчик работают на одном процессоре, но отладчик при этом управляет другой программой и видит все ее кишки. Как работает это волшебство?
Отслеживать
задан 12 сен 2019 в 8:19
6,853 2 2 золотых знака 23 23 серебряных знака 43 43 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В процессорах есть аппаратная поддержка отладчика. Команды останова, бит пошагового выполнения программ и прочие чудеса. Все это обычно работает на системном уровне приоритета. В старых процессорах (до 80386) бит пошагового выполнения был, а аппаратных приоритетов еще не было. Там отладчики работали в режиме пользователя.
Впрочем, там и ОС работала в режиме пользователя. 🙂 Если конечно DOS можно назвать ОС.
Давно это было. Подробнее Вам надо читать описание аппаратной архитектуры процессоров. Причем поддержка отладчика теперь есть во всех более-менее уважающих себя процессорах типа ARM и прочих. В старых процессорах типа однокристаллок 51 серии от INTEL этой поддержки нет.
Когда я этим занимался, то все работали под DOS и отладчики и программа работали в реальном режиме. Тогда в системе команд процессора была однобайтовая команда программного прерывания.
Если пользователь ставил точку останова в программе, то отладчик модифицировал программу пользователя, записывая в начало ассемблерной последовательности (которая реализует Сишную команду) эту самую однобайтовую команду программного прерывания. Когда (и если) программа проходила через эту точку, возникало программное прерывание, которое обрабатывал отладчик. Он останавливал программу пользователя, считывал все регистры общего назначения, и другую информацию, интересную для программиста типа содержимого стека, сегментных регистров, сегментов памяти и прочего. И всю эту информацию распихивал по окнам и останавливался. Когда пользователь снимал точку останова, то отладчик восстанавливал программу пользователя, записывая вместо этой самой однобайтовой команды прерывания старую инструкцию.
Также был так называемый Т-бит в регистре флагов процессора. Если в этот Т-бит записать единицу, то процессор вырабатывал Т-прерывание со своим отдельным вектором после выполнения каждой инструкции. Это Т-прерывание тоже обрабатывалось отладчиком и с его помощью можно было реализовать пошаговое выполнение программы. По этому прерыванию отладчик тоже собирал всю информацию о состоянии процессора и представлял эту информацию в удобном для человека виде в разных окнах.
Как сейчас сделано я точно не знаю, но думаю что тоже что-то вроде этого. За исключением того, что теперь, конечно, отладчик работает в системном режиме процессора, а программа пользователя работает в пользовательском режиме процессора.
Источник: ru.stackoverflow.com
Введение в отладчик OllyDbg
Как сам писал автор, Олег Юшук, “OllyDbg это 32-битный отладчик на уровне ассемблера под операционную систему Windows. Его функционал заточенный под работу с бинарным кодом делает этот отладчик чрезвычайно полезным в случае, когда необходимо отладить программу без доступа к ее исходному коду.” Олли это также динамический отладчик. Это значит, что она позволяет пользователю менять код программы прямо по-ходу исполнения. Это очень важно, в случаях когда мы экспериментируем с бинарником, пытаясь понять как тот работает. Помимо этого, Олли обладает множеством полезных функций, что делает ее одним из лучших отладчиков для реверс-инжиниринга (мы сейчас не говорим об отладке на уровне ядра).
Описание
Вот картинка основного окна Олли:
Как видно, основное окно CPU разбито на четыре части: Disassembly (дизассемблер), Registers (регистры), Stack (стек) и Dump (дамп). Ниже будет представлено описание каждой секции.
1. Disassembly (дизассемблер)
В этой секции находится дизассемблированный код загруженного в Олли бинарника. Тут отображаются команды в бинарном виде и в виде ассемблерных инструкций. Первая колонка содержит адрес в памяти соответствующей инструкции. Вторая колонка – это то, что называют опкоды (операционные коды) – в языке ассемлера каждая инструкция соответствует как минимум одному коду (или нескольким).
Это тот код, который непосредственно понимает и исполняет процессор. Эти опкоды образуют машинный язык, язык компьютера. Если бы вы посмотрели на исполняемый файл через хекс-редактор вы бы увидели набор этих кодов и ничего больше. Одна из основных задач Олли переводить этот машинный язык в форму, более понятную человеку – в язык ассемблера. Третья колонка как раз и отображает команды в формате языка ассемблера.
Возможно, тому, кто не знает ассемблера эти команды кажутся такими же непонятными как машинный код, но по мере практики становится понятно, что язык ассемблера гораздо проще для восприятия и понимания, чем сырой машинный код.
Последняя колонка это комментарии, оставленные Олли. Иногда они могут содержать имя вызываемой API-функции (если Олли смогла ее определить), например CreateWindow или GetDlgItemX. Олли также пытается помочь нам в понимании кода, давая имена функциям, которые не являются API-функциями. Например на картинке выше, видно вызовы функций с именами “ImageRed.00510C84″ и “ImageRed.00510BF4″.
Может быть это и не очень-то говорящие имена, но в процессе анализа мы можем понять, что делает та или иная функция и дать ей более осмысленное имя. В этой колонке мы может также писать свои комментарии. Для этого нужно дважды щелкнуть по одной из линий на этой колонке и высветится окно, куда свой комментарий и необходимо ввести. Эти комментарии сохранятся автоматически, и будут отображаться и в следующие разы.
2. Register (регистры)
Каждый процессор обладает набором регистров. Регистры представляют собой временные хранилища информации, что-то вроде переменной в высокоуровневых языках программирования. Вот более детальный вид окна регистров:
На самом верху вы видим непосредственно регистры процессора. Регистры поменяют свой цвет с черного на красный, если они были изменены в результате выполнения предыдущей команды. Можно также дважды кликнуть по какому либо регистру и понять его значение самому. Регистры широко используются для различных целей, как мы увидим в будущем.
Средняя секция содержит так называемые флаги, которые меняют свое значение в результате определенных операций (например при сравнение двух чисел: если они равны тогда во флаг записывается единица, нет – то ноль). Они тоже играют важную роль.
Последняя секция содержит FPU-регистры или регистры математического сопроцессора.
Они используются, когда процессор проводит операции над вещественными числами. В процессе реверс-инжиниринга не так часто приходится с ними сталкиваться, в основном когда имеешь дело с шифрованием.
3. Stack (стек)
Стек – это секция памяти зарезервированная для хранения временного списка данных. Эти данные включают в себя указатели к адресам в памяти, строки, переменные и, очень важно, адреса возвратов – места в программе куда необходимо вернуться после выполнения функции. Когда в программе в каком-либо месте вызывается какая-либо функция мы передаем этой функции управление, что бы она могла выполнить то, что нужно. Но в конце это функции необходимо вернуться туда, откуда он была вызвана и продолжить дальше исполнять следующие команды. Для этого и нужен адрес возврата.
Вещь, которую нужно знать о стеке это то, что это структура, работающая по принципу “первый вошел – последний вышел”. Представьте себе стопку листов. Мы можем либо положить на эту стопку еще один лист, либо снять верхний. Что бы добраться например, до четвертого листа сверху, нам необходимо перед этим снять три листа, которые выше него. Так, в общих чертах, и работает стек.
На этой картинке, первый столбец это адрес в памяти каждого элемента, второй столбец – это шестнадцатеричный код – значение, которое хранятся в стеке и последний столбец это комментарии Олли, о каждом элементе – то что он смогла установить. Например, на картинке напротив верхнего элемента стека стоит комментарий “RETURN to kernel…” Это адрес, который процессор расположил на стеке, что бы знать куда вернуться, когда текущая функция будет исполнена.
Если мы захотим изменить какой-либо элемент стека, нужно кликнуть по нему правой кнопкой мыши и в открывшемся меню выбрать пункт “modify”.
4. Dump (дамп)
Раннее в этом туториале, когда мы говорили о “сырых” опкодах которые процессор непосредственно считывает и исполняет, я упомянул, что мы может посмотреть эти коды в хекс-редакторе. Секция Dump в Олли как раз и предсталяет собой простой встроенный хекс-редатор. В нем мы можем посмотреть на сырой код программы, расположенный в оперативной памяти. Помимо шестнадцатеричных кодов, тут также можно увидеть символы, которые соответствуют тем или иным кодам, согласно ASCII. Итак, первая колонка в окне секции Dump – это адреса в памяти, вторая – сырой бинарный код, представленный в шестнадцатеричном формате, третья – символы.
Тулбар
Давайте теперь рассмотрим тулбар, который предоставляет нам Олли
Здесь расположены основные функции для запуска кода. Имейте также ввиду, особенно если вы новичек, все эти кнопки дублируются в вернем выпадающем меню в разделе “Debug”, так что если вы не уверены что означает та или иная кнопка – можете посмотреть там.
Я сделаю несколько заметок об функциях некоторых кнопок. “Re-load” означает перезапуск приложения с последующей остановкой на точке входа. Все изменения, внесенные вами в код, будут удалены, некоторые брейкпоинты (точки останова) будут отключены и приложение прервет исполнение кода. “Run” и “Pause” делают то, что следует из их названия. “Run” – запускает исполнение кода, “Pause” – временно останавливает, с возможностью потом продолжить с этого момента. “Step In” означает выполнить одну строчку кода и затем остановиться. Если этой строчкой кода является вызов функции, то мы переходим внутрь этой функции. “Step Over” делает тоже самое, но не заходит внутрь функций, а исполняет их целиком за один раз. “Animate” это тоже самое как постоянно жать “Step-In” или “Step-Over” но делать это достаточно медленно, чтобы успевать самому видеть ход исполнения. Эта функция не так часто используется, но бывает интересно посмотреть за ходом исполнения кода, особенно в случаях когда мы имеем дело с самомодифицирующемся кодом и можем вживую наблюдать за его изменениями. Похоже, я забежал слишком вперед.
Рассмотрим теперь иконки для управления окнами:
Каждая из этих иконок открывает окно, некоторые из которых пользуются часто, некоторые – редко. Что бы лучше самому с ними разобраться можно просто покликать на все подряд и посмотреть какое окно, открывает каждая кнопка. Каждая эта кнопка дублируется в верхнем выпадающем меню в разделе “View”, так что можете также заглянуть туда. Давайте пройдемся по нескольким основным окнам прямо сейчас.
1. (M)emory (память)
Окно “Memory” отображает все блоки памяти, выделенные программой. Это включает основные секции запущенного приложения (в данном случае “Showstr” в столбце “Owner”). Ниже вы также можете видеть множество других секций – это DLL, который программа загрузила в память и планирует использовать. Если дважды кликнуть по какой либо из этих строчек, откроется окно показывающее дизассемблированный код (или просто шестандцатеричный дамп) этой секции. Это окно также показывает тип каждого из блоков, права доступа, размер и адрес в памяти, где эта секция загружена.
2. (P)atches (патчи)
Это окно отображает все патчи, которые вы сделали. Патч означает изменение в коде. Заметьте, что в столбце “State” отображается значение “Active”. Это означает, что все изменения, сделанные в коде, актуальны на данный момент. Если вы перезапустите приложение, кликнув на “Re-load”, все изменения сбросятся и в столбе “State” напротив каждого сделанного вами патча появится значение “Disabled”.
Вы также можете активировать-деактивировать патчи если кликните на выбранный вами патч, удерживая кнопку пробела. С столбце “Old” отображается оригинальная строчка кода, в стобце “New” – измененная.
3. (B)reakpoints (точки останова)
В этом окне отображены все поставленные вами брейкпоинты. Как мы увидим дальше это окно часто используется при отладке.
4. (K)all Stack (вызовы в стеке)
Как видно, автор программы выбрал не совсем верную букву для этой иконки, т.к. английское слово Call вообще-то начинается с “C” 🙂
Это окно отличается от того стека, который мы видели ранее. Оно дает гораздо больше информации о вызовах, сделанных в коде программы, значениях которые передаются вызванным функциям, и много чего еще.
В следующем туториале я выложу свою “прокаченную” версию Олли с расширенным функционалом:
Контекстное меню
В завершении я бы хотел также быстро представить контекстное меню Олли, которое открывается при клике левой кнопкой мыши. Оно предоставляет довольно много полезных функций, так что не плохо было бы с ним ознакомится. Если мы кликнем правой кнопкой мыши в секции дизассемблера мы увидим следующее:
Я пройдусь по самым часто-используемым функциям, с остальными вы разберетесь сами, по мере накопления опыта.
“Binary” – редактирование бинарных данных побайтого. Это место где вы можете изменить строчку “Не зарегистрировано” на “Зарегистрировано” 🙂
“Breikpoints” – установка брейкпоитов (точек останова) на какую-либо строчку кода. Существует несколько типов брейкпоинтов, мы подробнее рассмотри их в следующем туториале.
“Search for” предоставляет функции по поиску данных в бинарнике, таких как строки, вызовы функций и т.д.
“Analysis” заставляет Олли заново провести процесс анализ кода, с которым вы сейчас работаете. Иногда Олли затрудняется отличить код от данных (т.к. с точки зрения процессора это все лишь набор битов), и эта функция заставляет Олли учитывать то, в каком месте кода вы сейчас находитесь и попытаться понять, как эта секция должна будет выглядеть.
Также обратите внимание, что мое меню немного отличается от вашего, т.к. я установил себе некоторые плагины, которые добавляют в Олли определенный функционал. Я подробнее расскажу об этом в дальнейшем.
Источник: codeby.school