Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...

Глава 3. Терминология

  1. Исполняемый модуль – файл, готовый к конкретному выполнению (производится на микропроцессоре либо интерпретируется другой программкой).

  2. Тестируемый код – код, который подвергается анализу и тестированию. Генерируется компилятором.

  3. Начальный код – тестируемый код, загруженный в память и находящийся в Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... секциях кода PE-файла. При работе метода блокируется вызовом функции VirtualProtect с параметром PAGE_NOACCESS (см. параграф 5.2.2, “Блокировка секций кода”).

  4. Начальный текст программки – программка на одном из языков программирования (С_/_С Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...++, Pascal, JAVA и т.д.)

  5. T-код (T-инструкции) – код, который внедряется в тестируемый код. Собирает информацию о ходе выполнения программки.

  6. Измененный (либо сгенерированный) код – тестируемый код с внедренными в него T-инструкциями Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.... Он уже расположен в памяти и готов к выполнению.

  7. Управляющие исключения – исключения, которые инициализируются при воззвании к заблокированным секциям кода (параграф 5.2.2, “Блокировка секций кода”). Необходимы для управления процессом построения Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... нового кода.

  8. Глобальный обработчик исключений – функция, которая вызывается при появлении всех исключений хоть какого вида (параграф 5.2.1, “Глобальный обработчик исключений”). Нужен, в главном, для обработки управляющих исключений.

  9. Сплайсинг [31] функции – метод перехвата вызовов функции, сущность которого заключается Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... в изменении первых ее б. Подробнее будет описан в параграфе 5.2.1 “Глобальный обработчик исключений”.

  10. Исключение типа Access Violation – исключение нарушения прав доступа. Появляется, к примеру, при воззвании к невыделенной памяти либо Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... при попытке записи в область памяти, для которой разрешено только чтение.

  11. Регистр EIP – регистр микропроцессора, содержащий адрес-смещение последующей аннотации, подлежащей выполнению.

  12. Точка останова – это намеренное прерывание выполнения программки, при котором Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... производится вызов отладчика.

  13. Функция KiUserExceptionDispatcher – функция системной динамической библиотеки ntdll.dll. Является принципиальной частью механизма обработки исключений в пользовательском режиме. Более подробное описание в параграфе 5.2.1 “Глобальный обработчик исключений”.

  14. Профилирование – сбор черт работы Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... программки, таких как время выполнения отдельных фрагментов (обычно подпрограмм), число правильно предсказанных условных переходов, число кэш промахов, инфы об использовании памяти и прочее.

  15. Профайлер (профилировщик) – инструмент, выполняющий профайлинг (профилирование) программ.

  16. Семплирование (в профайлинге) – статистический способ Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., который выявляет узенькие места в производительности. Сбор сведений производится с определенной частотой либо при появлении определенных событий.

  17. Динамическая рекомпиляция – переписывание в памяти участков кода программки во время ее выполнения. Применяется в профайлерах Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., эмуляторах, виртуальных машинах для прибавления в начальный код дополнительных инструкций, трансляции кода одной платформы в другую и т.д.

  18. Аннотации перехода – аннотации типа CALL, JMP, Jxx, LOOP / LOOPxx и Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... RET.

Глава 4. Подобные продукты

Начнем обзор с традиционных отладчиков. В текущее время очень популярны последующие разработки для ОС Windows:

Как ни удивительно, они тоже занимаются модификацией исполняемого кода в памяти: даже самый простой отладчик умеет оперировать точками останова. Существует два вида точек Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... останова: аппаратные [4] и программные (аннотация INT_3). Но из-за того, что количество аппаратных точек ограничено 4-мя, то в большинстве случаев употребляют аннотацию INT_3. Практически происходит внедрение этих аннотации в программный код Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., и с помощью их приложение останавливается в определенный момент и делается его анализ. А это и есть тема курсовой работы.

Сейчас нам необходимо упомянуть некие известные профилировщики, которые употребляются более нередко.

Intel VTune Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... Performance Analyzer [22] – коммерческое приложение для анализа производительности программ на компьютерах, использующих микропроцессоры компании Intel. Инструмент делает огромное количество функций профилировки:

Большая часть из перечисленных функций делает и продукт AMD CodeAnalyst [2] компании AMD, хотя по способностям до профайлера VTune ему еще очень далековато. В отличие от VTune, он делает Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... профилировку лишь на микропроцессорах AMD. Является бесплатным.

Разглядим другие профиляторы, в базе которых лежит динамическая рекомпиляция. Вот некие из их:

Лицезреем, что динамическая перекомпиляция удачно применяется для анализа производительности программ и анализа использования памяти (поиск утечек и др.). По сути, использовать технику Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... перекомпиляции кода можно еще обширнее. В качестве примера можно отметить виртуальные машины, такие как VMware и VirtualBox, которые употребляют эту технику для эмуляции привилегированных инструкций [19].

^ Глава 5. Мысль способа

Основная мысль способа заключается Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... в модификации секций кода PE файлов, загруженных в память, добавлении нужных нам инструкций таким макаром, чтоб отредактированная программка сама собирала всю статистику, что нас интересует.


5.1. Методы внедрения

Записать нужные аннотации в исполняемый Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... код можно несколькими методами:


^ 5.1.1. Принципно вероятные методы внедрения

Начать можно Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... со метода, который содержит в себе физическое изменение PE файла на жестком диске. Т.е. еще незагруженный файл мы должны проанализировать, добавить в него наш код, выслать на выполнение и неким методом Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... получать нужную нам информацию. В данном случае файл модифицируется только в один прекрасный момент, но на техническом уровне воплотить это очень трудно из-за того, что полный разбор генерируемого собирателями кода – очень томная задачка Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., требующая написания эмулятора выполнения, и даже если такая работа будет произведена, это не обережет программку от вероятных ошибок, возникающих после прибавления в нее новых инструкций. Нужен контроль над действиями программки, которые могут привести Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... к ее краху, и своевременное предупреждение юзера о их.

Дальше разглядим метод, в каком конфигурации вносятся в адресное место процесса, т.е. уже после загрузки исполняемого модуля в память Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.... В данном случае нам раскрывается большущее огромное количество средств для заслуги нашей цели.

Один из вероятных методов внедрения в чужой код – конкретное редактирование физической памяти либо страничного файла (файла подкачки). Этот метод очень привязан Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... к архитектуре системы, и для реализации необходимо иметь полное представление о принципах ее работы. Итак, представим, что программка загружена в память, и мы желаем внести в ее исполняемый код некие Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... конфигурации. Начнем с того, что в хоть какой момент времени, кроме неких случаев (ОС может по тем либо другим причинам воспрещать выгрузку страничек), нужная нам страничка может находиться как в оперативки, так и быть Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... выгруженной на диск. Последующая неувязка заключается в необратимости процесса трансляции виртуального адреса в физический, который был описан в параграфе 1.3.3 “Страничная организация памяти”. Архитектура микропроцессора позволяет проводить преобразование исключительно в одну сторону, в Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... оборотную сторону аппаратной реализации не существует (для промышленных нужд не нужна), потому придется делать это самим. Из-за таких особенностей системы, задачка существенно усложняется. К счастью, в Windows NT существует довольно Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... средств, чтоб избежать настолько близкого общения с операционной системой. К тому же, в Windows прямой доступ к физической памяти (объект Device\PhysicalMemory) из пользовательского режима был запрещен [30]. Из всего произнесенного можно заключить, что этот Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... способ можно удачно использовать [25] разве что в вирусах и троянах, так как им не надо создавать очень кропотливый анализ памяти: в большинстве случаев они обходятся поиском заблаговременно определенных сигнатур.


^ 5.1.2. Реализуемый способ

В методе Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., которому посвящена эта работа, мы не будем воспользоваться такими низкоуровневыми особенностями системы и писать собственные драйвера.

Использовать способ можно будет:

В первом случае наш код будет загружаться в адресное место тестируемого процесса средствами OC как DLL модуль при помощи вызова системной Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... API функции – LoadLibrary (этот вызов должен выполняться самой тестируемой программкой). Потом при выполнении процесс будем останавливать, рассматривать с текущего положения (положение определяется регистром EIP) как это может быть, создавать копию этой части кода Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... с необходимыми нам переменами и продолжать выполнение уже на сделанной последовательности инструкций, ждя пока микропроцессор не передаст выполнение на неанализированный код, что повлечет за собой очередной пуск метода анализа бинарного исполняемого Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... кода. Более тщательно процесс внедрения будет описан дальше.

Во 2-м случае довольно особенным методом загрузить вышеуказанную DLL в адресное место процесса. Это будет выполняться с внедрением системных API: выделение памяти Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... в чужом адресном пространстве (VirtualAllocEx), запись данных в эту память (WriteProcessMemory) и создание потока, принадлежащего чужому процессу (CreateRemoteThread). В работе этот вариант использования способа мы рассматривать не будем.

^ 5.2. Способ модификации кода

В нашем способе мы Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... не будем изменять исполняемый код – мы будем его писать в памяти поновой, только с подходящими нам переменами. Опишем более тщательно этапы работы способа.


^ 5.2.1. Глобальный обработчик исключений

Первым шагом способа будет созданием процедуры, которая получает Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... управление при любом возникающем в процессе исключения.

Существует два механизма Win32 обработки исключений:

Можно отыскать огромное количество статей для обоих из этих устройств, потому их описание в этой работе будет опущено.

Весь Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... цикл жизни [9] исключений в системе смотрится так:

  1. Микропроцессор генерирует исключение.

  2. Ядро операционной системы перехватывает и обрабатывает сгенерированное исключение.

  3. Управление передается функции KiUserExceptionDispatcher из системной библиотеки ntdll.dll, расположенной на прикладном уровне. В Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... качестве характеристик в стек помещаются структуры, содержащие описание исключения (EXCEPTION_RECORD) и контекст потока на момент генерации микропроцессором исключения (CONTEXT).

  4. Дальше приложение, используя один из 2-ух устройств – SEH либо VEH, обрабатывает исключение (либо Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... не обрабатывает, что приводит к аварийному окончанию программки)

Из этого больше всего нас будет заинтересовывать функция KiUserExceptionDispatcher. Все исключения, которые попадают на пользовательский уровень, проходят через эту функцию. Как следует, необходимо научиться Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... перехватывать ее вызовы.

Введем понятие сплайсинга [31] функций. Грубо говоря, сплайсинг это замена кода функции. Этот способ нередко применяется при перехвате вызовов API функций: определяется адресок перехватываемой функции, и её 1-ые 5 б Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... заменяются длинноватым JMP – переходом по адресу обработчика.

Н
рис. 4
а схеме (см. рис. 4) видно, что 1-ые три аннотации функции заменяются на одну пятибайтовую аннотацию JMP – переход уже на наш код, в каком можно Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... сделать все что угодно. На примере, изображенном на схеме, мы поначалу сохраняем все регистры в стеке аннотацией PUSHAD (по мере надобности можно еще сохранять там же флаги – аннотация PUSHF), вызываем обработчик Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., за ранее поместив в стек его характеристики, восстанавливаем значения регистров (аннотация POPAD), а потом начинаем выполнение перекрытых инструкций и остального кода, будто бы и не было никакого внедрения.

Этим приемом воспользуемся и мы Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.... Чтоб перехватить все пользовательские исключения, возникающие в процессе, применим способ сплайсинга API функций для функции KiUserExceptionDispatcher.


^ 5.2.2. Блокировка секций кода

Разглядим функцию VirtualProtect [18] из библиотеки kernel32.dll. Она позволяет изменять атрибуты защиты обозначенного региона виртуального Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... адресного места. В качестве 1-го из характеристик ей передается 4-х байтовое число – атрибуты защиты [15]:

На всякий случай снова повторимся, что при 32-битной страничной адресации на микропроцессорах компании Intel атрибуты Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... чтения и выполнения вполне эквивалентны, потому нереально запретить чтение при установленных правах на выполнение и напротив.

Итак, при запуске PE файла, каждой секции, загружаемой в память, проставляются атрибуты защиты, которые Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... зависят от соответственного параметра в заголовке секции. Тот же параметр определяет, содержит ли секция код либо данные (по правде сказать, если проставлен флаг секции кода, то это еще ничего не означает, потому будем Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... полагаться на добросовестность компоновщика).

Итак, вторым шагом в способе будет проставление всем страничкам секций кода атрибута PAGE_NOACCESS, при всем этом хоть какое воззвание к ним будет инициализировать в микропроцессоре Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... исключение #GP либо Access Violation на пользовательском уровне, которое мы сможем перехватить при помощи нашего глобального обработчика исключений.


^ 5.2.3. Инициализация управляющего исключения

После блокировки секций кода, хоть какое воззвание к страничкам памяти, относящимся к этим Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... секциям, будет вызывать исключение. Потому во всех потоках процесса, в каких на этот момент исполняется код данного модуля, будет инициализировано управляющее исключение и управление передастся глобальному обработчику исключений.


^ 5.2.4. Перехват управляющего исключения

Представим Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., что глобальный обработчик изловил исключение. Проверим, что:

Если не выполнено 1-ое условие, то исключение было вызвано кое-чем другим в программке, не из-за выполненных модификаций. Исключение нужно передать далее функции KiUserExceptionDispatcher Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность....

Если же не выполнено 2-ое условие, то необходимо инспектировать адресок, к которому происходило воззвание. В случае если адресок показывает не на секцию кода, то ошибка произошла не по нашей вине, и Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... необходимо передать исключение далее. В неприятном случае делаем вывод, что в секции кода содержатся данные, которые приложение пробует прочесть либо перезаписать. Здесь нам ничего не остается, как снять запрет на доступ к страничке Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... либо окончить выполнение приложения.

Итак, если оба условия выполнены, то делаем вывод о том, что нам пришло управляющее исключение.


^ 5.2.5. Пошаговый анализ тестируемого кода

Последующий шаг начинается сходу после того, как мы Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... поняли, что перехватили управляющее исключение. И из этого исключения мы извлекаем информацию об адресе его появления. Может быть два варианта:

Начнем со Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... второго варианта – код не обрабатывался. Тогда начинаем анализ машинного кода, начиная с этого адреса. Естественно, необходимо за ранее сохранить раздельно все содержимое секций кода (из-за того, что из заблокированных страничек чтение будет Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... запрещено и нашему коду). Имея на руках дизассемблер длин инструкций (“аппарат”, который рассматривает машинный код микропроцессора только для оценки количества б, которые занимает текущая команда, и определяет, когда начинается последующая аннотация), будем просматривать Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... команду за командой, уделяя повышенное внимание операторам перехода:

Для всех переходов существует два метода использования: переход по Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... фиксированному и вычисляемому адресу. Когда адресок фиксирован, то на шаге анализа мы можем проанализировать и код, на который осуществляется переход. Другая ситуация обстоит с вычисляемыми переходами (к примеру, аннотации ”CALL Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..._EAX” либо ”JMP_[ECX_+_0x4]”). Их можно повстречать, к примеру, в реализации виртуальных способов. В данном случае предстоящий статический анализ неосуществим. Но в этом нет ничего ужасного: переход осуществляется по абсолютному Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... адресу, и на этот абсолютный адресок перемещение кода никак воздействовать не может (есть маленькие аспекты в этом утверждении, о их чуток позднее). Т.е. если выполнение такого же кода будет происходить по другому адресу Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., то адресок перехода не поменяется, и после перехода в секцию кода опять будет инициализировано управляющее исключение, после этого можно продолжать анализ.

Принципиально учесть участки в начальном коде, которые уже были проанализированы Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.... При инициации управляющего исключения на их, повторную обработку проводить не надо. Для этого будем неким образом сопоставлять адреса инструкций в PE файле и адреса инструкций в коде, который был сгенерирован во время Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... анализа (с внедренными T-инструкциями), и при перехвате вышеупомянутого исключения довольно будет просто отыскать соответственный адресок в сгенерированном коде и передать на него управление.


^ 5.2.6. Внедрение T-кода

Мы обрисовали процесс анализа кода Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.... Наряду с ним будет проводиться построение измененного кода. Таковой код должен работать точно так же, как и соответственный ему код в PE-файле, но при всем этом должен содержать дополнительные аннотации, задачей которых Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... и будет произведение нужных вычислений, инкрементирование счетчиков.

При тестировании программки мы будем в ней для каждой аннотации определять количество раз, сколько она была исполнена. Для этого в код будут встраиваться команды Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., которые будут наращивать заблаговременно сделанные счетчики. Но мы не будем вставлять T-инструкции перед каждой аннотацией в тестируемом коде – это очень очень скажется на скорости выполнения программки. Можно создать огромное количество алгоритмов и структур Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... данных для размещения и резвого воззвания к этим счетчикам. При всем этом необходимо учесть последующие нюансы:


^ 5.2.7. Продолжение выполнения программки

Вот мы выстроили и записали в память код с необходимыми нам модификациями. Осталось только передать Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... на него выполнение – сбор инфы будет происходить автоматом.


^ 5.2.8. Маскировка внесенных конфигураций

Принципиальный нюанс в схожем внедрении – как конфигурации неприметны для тестируемой программки, и что довольно сделать, чтоб найти вторжение.

В нашем случае, из Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...-за суровых ограничений на анализируемую программку и из-за очень очевидных конфигураций в коде, программка, которая специально делает проверки целостности, наверное обусловит, что к ней кто-то прицепился. Но у нас незначительно другая задачка Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...: внести в код нужные нам конфигурации так, чтоб с большой вероятностью он остался рабочим.

Разглядим два варианта, которые могут привести к крушению программки.

1) После того, как выполнение кода переместилось из секций кода Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... PE файла в память, выделенную из кучи, поменялось поведение инструкций CALL – они стали помещать в стек не те адреса, что ранее. Естественно, маловероятно, что эти изменившиеся адреса на что-то воздействую, но не Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... исключено, что некий очень хитрецкий компилятор не решит инспектировать их, чтоб “побороть” вероятную уязвимость переполнения буфера.

Решение. Все CALL аннотации подменять на сочетание инструкций PUSH и JMP – такая подмена эквивалентна Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., если не учесть флаг NT, который употребляется для переключения задач [28]. После того, как выполнится соответственная аннотация RET, управление передастся на заблокированный код, так как в стек аннотацией PUSH был помещен таковой Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... адресок возврата, какой он был бы, если не было бы никаких модификаций. Ну а далее будет вызвано управляющее исключение, и можно продолжать выполнение программки.

2) 2-ой случай состоит в том, что измененный код как и раньше Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... способен генерировать исключения, как штатные, так и внештатные. И лучше приложению не демонстрировать реальный адресок, по которому появилось исключение.

Решение. Будем просто в глобальном обработчике заменять адресок появления исключения и сохраненный регистр Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... EIP. Для этого должна быть реализована оборотная трансляция адреса из измененного кода в адресок в начальном коде.


^ 5.2.9. Уменьшение числа управляющих исключений

Активное внедрение исключений в приложениях может сказаться на ее производительности, а откровенное Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... злоупотребление может замедлить так, что программка будет зависать на ровненьком месте. Это вызвано тем, что производится много маленькой работы: проверки и определение, кому далее передавать исключение, запись в стек Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... состояния потока (регистры, флаги) и инфы об исключении, переключение меж режимом ядра и пользовательским режимом и проч. В итоге тратятся тыщи тактов микропроцессора, что, при неких обстоятельствах, может стать очень значимым.

В конце параграфа 5.2.5 “Пошаговый Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... анализ тестируемого кода” упоминалось о сравнении адресов инструкций в начальном и измененном кодах. Это мы и будем использовать для оптимизации использования исключений.

При использовании инструкций переходов по вычисляемым адресам Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... и, беря во внимание предшествующий параграф, аннотации RET, происходит переход на код, который принадлежит заблокированной секции кода PE файла, что сразу вызывает управляющее исключение.

В качестве решения этой трудности можно использовать таковой метод: заместо того Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., чтоб совершить переход по вычисленному адресу, будем помещать этот адресок в стек (кстати, для варианта с аннотацией RET адресок перехода уже находится в стеке) и вызывать нашу свою функцию, в какой Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... будем находить соответственный адресок в измененном коде и передавать на него управление. Необходимо отметить, что поиск подходящего адреса в любом случае пришлось бы делать, но в таком случае мы не тратим время на Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... ненадобную обработку исключения в ядре системы.


^ 5.2.10. Визуализация результатов профилировки

Итак, наполнив тестируемый код нашими инструкциями, мы получим аналогичную программку, но она, в дополнение ко всему, собирает статистическую информацию о ходе собственного Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... выполнения.

Осталось только сделать ее вывод в комфортном виде. Здесь есть огромное количество вариантов и их композиций:

^ Глава 6. Реализация способа

Программирование описанного способа будет происходить в Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... среде разработки Microsoft Visual Studio 2008 с внедрением языка C++ (unmanaged). Также будут употребляться ассемблерные вставки. Отметим, что в 64-битном компиляторе VC++ ассемблер был запрещен [14].

Как уже упоминалось, вся логика способа будет запрограммирована в Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... одном DLL файле для того, чтоб без особенного труда загрузить в адресное место процесса весь код, что мы будем использовать для анализа.


^ 6.1. Глобальный обработчик исключений

Итак, при загрузке DLL файла в память Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... происходит вызов функции DllMain [12]. DllMain – дополнительная точка входа в динамически-подключаемую библиотеку, управление на которую передается тогда, когда процесс либо поток инициализируется либо заканчивает работу, также при вызове функций LoadLibrary и Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... FreeLibrary.

Синтаксис функции DllMain:

BOOL WINAPI DllMain(

__in HINSTANCE hinstDLL, // дескриптор модуля DLL

__in DWORD fdwReason, // причина вызова функции

__in LPVOID lpvReserved // зарезервированный

);

Вот в этой функции мы и будем создавать внедрение перехватчика исключений, когда Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... наш DLL файл загружается в память процесса (ну и, естественно, нельзя забывать про снятие этого обработчика при выгрузке DLL из памяти).

Поначалу выделим кусок памяти, нужный для сплайсинга функции KiUserExceptionDispatcher, и отчасти проинициализируем Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... его обозначенными инструкциями:

UCHAR code[0x40] = {

0xFF, 0x74, 0x24, 0x04, // 0x00: PUSH [ESP + 4]

0xFF, 0x74, 0x24, 0x04, // 0x04: PUSH [ESP + 4]

0x00, 0x00, 0x00, 0x00, 0x00, // 0x08: CALL handler

0x85, 0xC0, // 0x0D: TEST EAX, EAX

0x Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...74, 0x0F, // 0x0F: JZ not_processed

0x6A, 0x00, // 0x11: PUSH 0x00

0xFF, 0x74, 0x24, 0x08, // 0x13: PUSH [ESP + 8]

0x00, 0x00, 0x00, 0x00, 0x00, // 0x17: CALL NtContinue

0xCC, 0xCC, 0xCC, 0xCC, // 0x Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...1C: code alignment

// not_processed:

0x00, 0x00, 0x00, 0x00 // 0x20: instructions from

// KiUserExceptionDispatcher

// beginning and JMP to

// KiUserExceptionDispatcher

// continue

};

Итак, 1-ые две аннотации записывают в стек аргументы для нашего глобального обработчика исключений. Вот его сигнатура:

BOOL WINAPI GlobalExceptionHandler Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...(

PEXCEPTION_RECORD pExcptRec,

CONTEXT* pContext

);

Дальше оставлено 5 свободных б для аннотации, которая передаст управления обработчику. 1-ый б – 0xE8 (опкод аннотации CALL), а байты со второго по 5-ый должны содержать относительный адресок Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... функции-обработчика. Его можно вычислить так: – – 5.

Дальше происходит проверка возвращенного значения. Если это значение не ноль, то будет вызвана функция NtContinue из библиотеки ntdll.dll, которая восстанавливает состояние, в каком находился поток Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... во время появления исключения. Это сохраненное состояние, состоящее из регистров и флагов, мы с легкостью могли поменять в глобальном обработчике. Если же функция возвратила ноль, то будут произведен переход по метке “not_processed Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...”. Поместим под этой меткой 1-ые аннотации функции KiUserExceptionDispatcher, которые нам придется перекрыть одной аннотацией JMP, занимающей 5 б. И после чего блока инструкций поместим команду JMP для продолжения выполнения функции KiUserExceptionDispatcher.

Осталось Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... только, используя API функцию VirtualProtect, разрешить запись в область памяти, в какой находится KiUserExceptionDispatcher, и переписать 1-ые 5 б, заменив их аннотацией JMP, осуществляющую переход на начало блока code, который был описан выше.

Таким макаром Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., хоть какое исключение, возникшее в процессе, будет здесь же перехвачено и передано глобальному обработчику.

Принципиально будет упомянуть о том, что на 1-ые 5 б функции KiUserExceptionDispatcher может прийтись нецелое число инструкций Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.... Потому мы будем использовать дизассемблер длин (см. параграф 6.2 “Дизассемблер длин инструкций”) для определения инструкций, которые будут перекрыты командой JMP. Также необходимо разглядеть случай, когда посреди их встречается аннотация перехода. Возможность этого близка к нулю Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., но все таки нужно добавить надлежащие проверки, чтоб не допустить сплайсинг и сказать юзеру о невозможности внедрения обработчика.


^ 6.2. Дизассемблер длин инструкций

Очень принципиальной составляющей частью анализатора является дизассемблер длин инструкций. Это одна функция Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..., которая определяет, какое количество б занимает текущая аннотация и с какой позиции начинается последующая. Заметим, что при установке глобального обработчика исключений этот инструмент также нужен. Если конкретнее, то мы его используем Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... для определения первых инструкций функции KiUserExceptionDispatcher, которые будут замещены аннотацией JMP.

Для намеченной цели будем использовать стороннюю разработку [23]. Она представляет собой одну функцию на языке C++:

bool GetInstructionSize(

PBYTE pOpCode,

PDWORD pdwInstructionSize

);

Функция воспринимает в Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... качестве характеристик указатель на начало аннотации в памяти и указатель на 4-х байтовую переменную, в которую будет записываться результирующая длина аннотации. Возвращаемое значение – удачно ли определена длина.


^ 6.3. Фильтрация управляющих исключений

В параграфе 6.1 “Глобальный Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... обработчик исключений” была упомянута сигнатура глобального обработчика: в качестве характеристик функции передается указатель на структуру EXCEPTION_RECORD (содержит информацию об исключении) и указатель на структуру CONTEXT (сохраненный контекст потока Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...).

Нужно обучить обработчик выделять управляющие исключения из общей массы исключений, что появляются в процессе.

Во-1-х, исключение должно быть типа Access Violation:

if (pExcptRec -> ExceptionCode == EXCEPTION_ACCESS_VIOLATION)

Константа EXCEPTION_ACCESS_VIOLATION Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... определена в заголовочном файле WinNT.h и равна 0xC0000005.

Во-2-х, адресок появления исключения должен совпадать с адресом, воззвание по которому вызвало ошибку:

if ((DWORD)(pExcptRec -> ExceptionAddress) ==

pExcptRec -> ExceptionInformation[1]))

Если и это Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... условие выполнено, то проверим, что адресок исключения содержится снутри какой-либо заблокированной секции кода. Только после чего можно утверждать, что исключение является управляющим.


^ 6.4. Внедрение T-кода

Итак, перехватив управляющее исключение и определив адресок Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... аннотации, которая его инициализировала, начинаем анализ начального кода и построение измененного кода, начиная с этой аннотации.

^ 6.4.1. Анализ начального кода

Как уже упоминалось в параграфе 5.2.5 “Пошаговый анализ тестируемого кода”, перед блокировкой страничек секций кода, нужно сделать Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... копию данных, содержащихся в их, т.к. после блокировки доступ к ним будет запрещен как самой программке, так и нашей библиотеке.

Итак, у нас есть адресок аннотации, которая вызвала управляющее Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... исключение. Начинаем анализ с нее.

Для намеченной цели довольно будет выслеживать только аннотации, выполнение которых может вызвать переход на аннотацию, находящуюся не конкретно за этой. К такому типу инструкций относятся CALL, JMP, Jxx, LOOP Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..._/_LOOPxx и RET. После выполнения на микропроцессоре других инструкций, регистр EIP передвигается на последующую аннотацию в памяти. Есть, естественно, аннотации SYSENTER, INT_3 и некие другие, которые также нарушают линейность выполнения машинного кода, но Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... из-за особенностей построения измененного кода будем относить их к “обыденным” инструкциям.

С
рис. 5
ам анализ будет происходить поочередно, аннотация за аннотацией, в том порядке, в каком они находятся Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... в памяти. И для того чтоб иметь возможность рассматривать код, который находится в ветвлениях этого метода, сделаем перечень адресов, хранящий адреса инструкций, с которых следует начинать очередной процесс анализа. Вначале в этот Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... перечень помещается единственный адресок – адресок аннотации, которая инициализировала управляющее исключение. В предстоящем туда будут помещаться адреса команд, на которые осуществляется переход отысканными при анализе инструкциями вышеупомянутого типа (если для их очевидно указан относительный адресок перехода Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...). На каждой итерации будем извлекать из начала этого перечня адресок (сразу удаляя его оттуда). Когда перечень станет пустым, анализ можно считать законченным.

А от самого анализа требуется только поиск и систематизация Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... обозначенных выше инструкций. Эта информация будет употребляться для построения измененного кода.

Основной проход анализа можно отыскать в Приложении 5 “Процедура анализа”.


^ 6.4.2. Построение измененного кода

Измененный код будем строить в специально выделяемой для Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... этого памяти. Для этого будем при необходимости постранично выделять память. Когда еще одна порция измененного кода не будет помещаться в последнюю выделенную страничку, то необходимо выделить новейшую страничку памяти, записать туда измененный код и связать Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... предшествующую страничку с ней аннотацией перехода JMP.

Ниже приведено описание класса code_row, который будет заниматься построением кода. На каждый исполняемый модуль, загруженный в память, создается менее 1-го объекта этого Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... типа.


^ Листинг описания класса code_row (файл code_row.h)


class code_row {

private:

typedef std::map
addr_map;

page_pool pages;

addr_map trans, trans_r;

addr_map reloc_rel, reloc_abs Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...;

void *curr_page;

int curr_len, curr_pos;


public:

code_row();

void add_instr(PUCHAR instr, int instr_len, PVOID instr_addr);


void add_ret(PUCHAR instr, int instr_len, PVOID instr_addr);

void Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... add_call(PUCHAR instr, int instr_len, PVOID instr_addr);

void add_jmp(PUCHAR instr, int instr_len, PVOID instr_addr);

void add_comp_jmp(PUCHAR instr, int instr Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..._len, PVOID instr_addr);

void add_loop(PUCHAR instr, int instr_len, PVOID instr_addr);

void update_reloc();


PVOID get_trans_addr(PVOID real_addr);

PVOID get_trans_r_addr(PVOID addr Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...);

};


Адресок в репозитории:

http://willzyx-edu-project.googlecode.com/svn/trunk/Proj1/src/profiler/code_row.h

Опишем поля и способы, что содержатся в этом классе:

табл. 1

loop_start:



LOOP Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность.../LOOPE/LOOPNE loop_start

LOOP

LOOPE

LOOPNE

0xE2

0xE1

0xE0

loop_start:



PUSHF

DEC ECX

JZ @1

POPF

JMP loop_start

@1:

POPF

loop_start:



PUSHF

JNZ @1

DEC ECX

JZ @2

POPF

JMP loop_start

@1:

DEC ECX

@2:

POPF

loop_start:



PUSHF

JZ @1

DEC ECX

JZ @2

POPF

JMP loop_start

@1:

DEC ECX

@2:

POPF

Потому во время анализа для построения кода должны вызываться надлежащие функции прибавления инструкций. После того Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... как весь перечень ответвлений (параграф 6.4.1 “Анализ начального кода”) будет проанализирован, нужно обновить относительные и абсолютные адреса в сгенерированном коде, которые не были определены во время построения кода, вызовом update Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность..._reloc.

^ 6.4.3. Добавление счетчиков

Итак, в прошлом параграфе был описан принцип построение нового исполняемого кода. Сейчас осталось научиться динамически внедрять полезные T-инструкции. Не будем хлопотать о сохранении быстродействия начальной программки – таковой задачки пред нами не стоит Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность....

Ниже приведено описание класса code_counters – класса, экземпляр которого будет содержать результаты профилировки для 1-го исполняемого модуля:

^ Листинг описания класса code_counters (файл code_counters.h)


class code_counters Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... {

private:

typedef std::map addr_counters;

addr_counters counters;

public:

bool write_file(const char* file_name);

void inc(UINT addr);

void dec(UINT addr);

};


Адресок в репозитории:

http://willzyx-edu-project.googlecode Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность....com/svn/trunk/Proj1/src/profiler/code_counters.h


Как лицезреем, структура класса очень ординарна:

Общая схема работы со счетчиками будет смотреться так:




Т Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность...
рис. 6
аким образом, при всех переходах должен инкрементироваться счетчик по адресу аннотации, на которую делается переход, и декрементироваться счетчик по адресу б, который находится сходу после аннотации перехода (этот б может Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... и не быть б какой-нибудь аннотации). И для того, чтоб найти сколько раз была исполнена определенная аннотация, необходимо отыскать сумму характеристик всех счетчиков, расположенных по адресам не выше адреса этой аннотации.

Для работы Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... со счетчиками были реализованы процедуры, аннотации вызова которых будут вставляться конкретно в код. Если не вдаваться в подробности, то эти процедуры будут вызываться в генерируемом коде заместо инструкций перехода. Перед их вызовом Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... в стек помещаются характеристики, а конкретным переходом будет заниматься сама процедура. Т.е. сейчас, практически, неважно какая аннотация перехода будет заменена композицией нескольких команд PUSH и одной командой JMP. Более подробное описание Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... и реализацию этих функций можно отыскать в файлах x_func.h и x_func.cpp (Приложение 6 “Внедряемые процедуры”).


^ 6.5. Продолжение выполнения

После окончания анализа необходимо только отыскать аннотацию в измененном коде, которая Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... соответствует аннотации в начальном коде, вызвавшей управляющее исключение, и передать на нее управление. Для поиска необходимо использовать способ get_trans_addr класса code_row. А потому что у нас есть сохраненный Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... контекст потока (ссылка на него была передана в качестве параметра глобальному обработчику исключений), то обновим у него поле Eip:


pContext -> Eip = …


Тогда и после восстановления контекста потока регистр EIP будет указывать на аннотацию в измененном Глава 3. Терминология - Разработка метода сбора информации о ходе исполнения программы, который использует возможность... коде. Как следует, исполняться будет уже код с внедренными дополнительными T-инструкциями.




glava-3-viyavlenie-i-formirovanie-pravovih-i-ekonomicheskih-mehanizmov-vzaimodejstviya-vseh-sektorov-ekonomiki.html
glava-3-vnedrenie-standartov-okazaniya-medicinskoj-pomoshi-programmi-ministerstvo-zdravoohraneniya-respubliki-mordoviya.html
glava-3-vnutrennyaya-sreda-organizacii.html