- •Системное программирование на макроассемблере masm32
- •Содержание
- •Вступление
- •Префиксы «венгерской» нотации типов данных в описаниях вызовов функций аpi Win32 (Win64)
- •Работа с консолью
- •Цель работы
- •Теоретические сведения
- •Консоль
- •Начальные настройки
- •Как в cmd.Exe выделять-копировать-вставлять текст
- •История ввода команд
- •Заменяющие символы в шаблонах имён
- •Выполнение работы
- •Навигация по дискам и папкам
- •Поиск файлов и папок по имени или шаблону
- •Копирование, перенос, переименование и удаление файлов
- •Создание и уничтожение папок
- •Создание текстового файла
- •Просмотр содержимого файлов
- •Поиск файлов, содержащих нужную строку
- •Состав отчета по работе
- •Состав пакета масм
- •Последовательность создания исполняемого ехе-модуля на масм
- •Режимы компоновки
- •Выполнение работы
- •Создание консольной программы
- •Создание программы с графическим интерфейсом
- •Использование шаблона простой программы
- •Состав отчета по работе
- •Параметризация макросов
- •Уникальность меток при макрорасширениях
- •Макроконстанты
- •Макропеременные и макровычисления
- •Увидеть работу макрогенератора
- •Расширенный листинг
- •Выполнение работы
- •Макроопределение и макрорасширение
- •Повторение строк repeat
- •Цикл for
- •Анализ расширенного листинга программы
- •Состав отчета по работе
- •Потоки вывода и ввода
- •Вывод и ввод в консольных приложениях
- •Invoke GetStdHandle,std_output_handle ; манипулятор возвращен в еах, ...
- •InputBuffer db 25 dup (0) ; вводной буфер фрагмент 3
- •Высокоуровневый консольный ввод-вывод с использованием макросов
- •Макрос консольного вывода print
- •Макросыконсольного вводаinput и inkey
- •Преобразование строки в число
- •Inkey "Жду кнопочку."
- •Преобразование числа в строку
- •Выполнение работы
- •Invoke ExitProcess,0 ; выход в Windows
- •Эксперимент 1. Ввод-вывод функциями Win32
- •Эксперимент 2
- •Эксперимент 3
- •Эксперимент 4
- •Состав отчета по работе
- •Последовательное выполнение команд
- •Передача управления в другое место кода
- •Возврат управления в основную программу
- •Метка_к5:
- •Jmp Метка_к5
- •Call метка_процедуры
- •Передача параметров в процедуру
- •Внутренние переменные в процедурах
- •Как компилятор ml.ExEпомогает организовать работу с процедурами
- •Автоматическое создание пролога и эпилога
- •Автоматическое размещение внутренних переменных
- •Повышение надежности и облегчение вызовов – макрос invoke
- •Выполнение работы
- •Invoke ExitProcess,0 ; выход в Windows
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Исполнение программы под отладчиком
В отладке готовых программ огромную помощь программистам оказывают специальные программы – отладчики.
Они выполняют роль своеобразной оболочки, внутри которой открывают ехе-файл, который загружается в память в полноценный образ программы. Различие с обычным способом загрузки-исполнения программы состоит в том, что в «обычном» способе программу исполняет напрямую процессор, а «под отладчиком» первичным процессом исполнения является отладчик, а отлаживаемая программа выступает в роли вторичного процесса, запускаемого и контролируемого из первого. Это позволяет получать всю информацию о размещении программы в виртуальной памяти ее процесса, видеть каждый байт любой секции, при желании – пошагово (отдельными машинными командами) исполнять программу, наблюдая изменения в памяти и регистрах процессора, и делать еще много чего, что описано в руководствах по использованию отладчиков.
Существуют отладчики «уровня ядра операционной системы» и «уровня приложения». Первые позволяют отлаживать даже саму операционную систему как программное приложение. Вторые работают только с прикладными программами, и не вмешиваются в работу ОС, она сама исполняет код отладчика. Мы будем работать с отладчиком уровня приложения. Вы вольны выбирать любой доступный вам отладчик, но мы, руководствуясь имеющимся опытом, рекомендуем OllyDbgстабильной версииv.1.10, доступный по ссылке (это сплошная (!) строка)
https://sites.google.com/site/systempromasm/glavnaa-stranica/resursy/ollydbg110xp-%D0%A0%D0%90%D0%91%D0%9E%D0%A7%D0%98%D0%99.rar?attredirects=0&d=1
Скачайте и установите на свой компьютер эту программу.
Приемлемое по полноте описание отладчика OllyDbgвы найдете по ссылке
http://exelab.ru/art/?action=view&id=284,
а здесь мы опишем только самое основное, без чего непонятно будет, что и как мы делаем в этой работе. Итак, скриншот отладчика – рис. 5.2.
Рисунок 5.2 – Скриншот отладчика OllyDbg 1.1 с открытым в нем файлом coff1.exe. а – фрейм кода; б – окно оперативного вывода; в – фрейм данных; г – фрейм стека; д – фрейм регистров.
Окно отладчика показывает пять фреймов (подокон).
Верхний левый фрейм (а) показывает секцию кода программы в виде таблицы со структурой
Смещение |
Машинный код |
Дизассемблер |
Пояснение |
00401034 |
Е8 В9000000 |
CALL <JMP.&kernel32.ExitProcess> |
ExitProcess |
Третья колонка «Дизассемблер» содержит текст, который отладчик получает обратным переводоммашинного кода команды в ассемблерную запись. Машинный код читается из ехе-файла. Обратный перевод машинного кода в ассемблер и называется дизассемблированием. Существуют отдельные программы-дизассемблеры, выполняющие эту работу (например,Disasm). Здесь мы видим, что отладчикOllyDbgвключает в себя дизассемблер как одну из своих функциональных возможностей.
Под фреймом кода находится маленькое окошко (б) консольного оперативного вывода результатов выполнения каждой очередной команды в пошаговом режиме.
Нижний левый фрейм (в) показывает секцию данных в точно таком формате, какой использует знакомый вам по прошлой работе HexWorkshop:
00403000 44 33 22 11 88 77 66 55 41 42 43 44 45 46 00 CC D3"€wfUABCDEF.М
Это смещение, затем 16 байт hex-числами, затем те же байты символами (см заголовок таблицы этого фрейма, там написано «Address,Hexdump,ASCII»).
Нижний правый фрейм (г) показывает секцию системного стека программы в период ее исполнения. Формат «Смещение; 4 байта в hex-формате; Пояснение».
Верхний правый фрейм (д) показывает состояние процессора после каждой команды. Видны значения регистров и флагов. Красным выделяются значения, которые изменились последней выполненной командой.
Команда File–Openоткрывает в отладчике нужный ехе-файл. Далее можно выполнить программу пошагово.F8 исполняет одну очередную команду и, если это команда вызова подпрограммы (процедуры)CALL, в тело подпрограммы заход не производится, сразу показывается результат ее выполнения. Если на командеCALLнажатьF7, произойдет переход в тело процедуры на ее первую команду.
Рассуждая о выполнении любой программы, не следует забывать, что, как бы там ни было, мы всегда работаем в многозадачной ОС Windows, в защищенном режиме работы процессора. В силу этого компоновщиком всегда дополнительно включаются в любую программу вызовы процедур ядра операционной системы для выполнения необходимых подготовительных действий (помимо кода, который написал сам программист). Эти действия нужны для организации выполнения нового процесса, модификации сегментных регистров и т.п. Здесь, при выполнении данной лабораторной работы, «код программиста» начинает пошагово выполняться под отладчиком с того момента, когда указатель очередной команды во фрейме кода установится на смещение 00401000 (это примерно после 13 нажатий наF8 от момента открытия программы в отладчике).
В любой момент пошагового выполнения программы под отладчиком можно выполнить команду Debug-Restart(Ctrl-F2), и программа опять вернется в исходное состояние.