- •Системное программирование на макроассемблере 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
- •Неразрешённые внешние ссылки
- •Выполнение работы
- •Программные инструменты для работы
- •Изготовление файлов для сравнений
- •Восстановление структуры двоичного представления объектного файла
- •Анализ неразрешенных внешних ссылок в объектном файле
- •Состав отчета по работе
- •Исполнение программы под отладчиком
- •Оперативная память «физическая» и виртуальная
- •Выполнение работы
- •Подготовка текстовых файлов для работы
- •Исследование структуры ехе-файла
- •Исследование выполнения программы под отладчиком
- •Карта размещения программы в виртуальной оперативной памяти
- •Действительные ссылки, бывшие раньше неразрешенными
- •Состав отчета по работе
- •Вопросы для самопроверки
- •Рекомендованная литература
Восстановление структуры двоичного представления объектного файла
Рассмотрите дамп. Он получен с помощью системной утилиты dumpbin, которая создана именно для удобного и структурированного показа пользователям содержимого объектных файлов и исполняемых ехе-модулей.
Но наша задача состоит в изучении бинарника. Мы должны установить, где в нем находятся его функциональные части и, по возможности, структуру самих этих частей.
Задача будет решаться методом сопоставления. Мы будем в дампе находить очередную отдельную часть и по ее данным в бинарнике будем находить начало этой же части и ее конец. В тексте бинарника будем отделять найденную часть от остального текста линиями. Можно делать это карандашом на распечатке бинарника, а можно вносить эти линии в Worde прямо в документ (из опыта подскажем, что лучше всего графическая форма «ступенчатая линия»
При установлении соответствия числовых и символьных данных в дампе и бинарнике следует учитывать вот что.
Компилятор при создании объектного файла пишет в него числа либо как двухбайтные поля (16-битные целые), либо как 4-байтные поля (32-битные целые), причем вы столкнетесь и с первым, и со вторым вариантом. Текстовую информацию компилятор записывает в формате «байт на символ». Эти части бинарника легко опознать по колонке 3 (рис. 4.1). К примеру, текстовое поле «.text» во второй строке примера рис. 4.1 соответствует байтам «2E 74 65 78 74» в этой же строке, колонка 2.
Кроме того, что числа могут представляться двумя или четырьмя байтами, следует учитывать, что в дампе числа «для читателя-человека» приводятся в в 16-ричной системе счисления в позиционной записи (самый младший разряд справа), а в бинарнике они записываются «для компьютера» в «физическом» представлении по принципу «младшие байты чиса – по младшим адресам, старшие – по старшим». Например, в дампе читаем число 14С (все числа записываются в 16-ричной системе). В бинарнике это два байта «4С 01». В дампе число представлено «5346D91E», в бинарнике оно видно как бы «вывернутым задом наперед» - «1E D9 46 53». Это нужно учитывать при выполнении работы.
Замечание о переводе английских терминов в дампе. Большинство терминов переводятся без проблем, но о некоторых надо сказать особо.
Термин “Raw Data” означает «необработанные данные». Это последовательности байтов, которые dumpbin переносит из объектного файла в файл дампа «как есть», ничего не расшифровывая. Это нам на руку, потому что дает возможность идентифицировать в бинарнике эти части секций просто побайтным сравнением.
Рисунок 4.2 – Вид распечатки размеченного файла бинарного представления объектного файла.
Термин “Relocations” означает «неразрешенные ссылки в секции кода». Таблица “Relocations #1” описывает, где в секции номер 1 (ее имя .text, а по смыслу это секция кода) находятся эти поля, каким именам (“symbols”) исходного текста они соответствуют, и приводит ряд других сведений о них. Одна из ваших задач по расшифровке объектного файла – составить обоснованные предположения об информации, содержащейся в этой таблице.
Ну, и слово «symbol». В англоязычных текстах по программированию его следует понимать как «имена объектов». Так что заголовок «COFF Symbol Table» следует понимать как «Таблица имен сущностей в объектном файле типа COFF».
Всё, начинайте работу.
Задача – найти в бинарнике участки, соответствующие частям дампа, озаглавленным заголовками: «File header values», «Section header #1», «Raw data #1» , «Relocations #1» , «Section header #2» , «Raw data #2 2» , «Section header #3» , «Raw data #3» , «Linker directives» , «Coff symbol table ».
Провести разграничительные линии между найденными частями в бинарнике. Каждую такую часть подписать ее заголовком на правом свободном поле (вот для чего нужна альбомная ориентация листа бинарника).
Имена программных секций и их hex-представление в бинарнике (.text, .data, .drectve) выделить цветным маркером.
Составить структуру объектного файла (бинарника) в соответствии с проделанной работой в формате «Название части – смещение в бинарнике».
Примерный вид размеченного бинарника показан на рис.4.2.