Pin 2.12 User Guide / Pin 2.12 User Guide: Examples

Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

Примеры

========================================================================================
Оглавление

Построение примера под Linux
Построение примера под Windows
Простой подсчет инструкций (Инструментирование инструкций)
Отслеживание адресов инструкций (Инструментирование инструкций)
Отслеживание обращений к памяти (Инструментирование инструкций)
Определение загрузки и выгрузки образов(Инструментирование образов)
Более эффективный подсчет инструкций (Отслеживающее инструментирование)
Подсчет инструкций процедур (Инструментирование процессов)
Использование функции PIN_SafeCopy()
...
Дальше как у остальных переведено

noam 12.05.13 в 20:35

0

Чтобы построить все примеры в директории:

noam 12.05.13 в 19:47

0

Чтобы построить и запустить конкретный пример (например inscount0):

noam 12.05.13 в 19:48

0

Чтобы построить конкретный пример, не запуская его (например inscount0):

noam 12.05.13 в 19:49

0

Построение примеров инструментов в Windows

Для того, чтобы построить примеры на OC Windows, откройте Visual Studio Command Prompt и выполните скрипт source/tools/nmake.bat. Обратитесь к файлу source/tools/Nmakefile для получения полного списка поддерживаемых версий и конфигурации построения.

Далее представлены несколько примеров:

Declaser 12.05.13 в 20:17

0

Чтобы построить все примеры в директории:

Чтобы построить и запустить конкретный пример (например inscount0.dll):

Чтобы построить конкретный пример, не запуская его (например inscount0):

Простой подсчет инструкций (Инструментирование инструкций)

noam 12.05.13 в 20:28

0

Пример ниже инструментирует программу и считает количество запускаемых инструкций. Он вставляет вызов docount до каждой инструкции. Когда программа завершается, она сохраняет количество инструкций в файле inscount.out.
Вот как запустить и вывести результат (отметим, что список файлов - вывод команды 'ls', поэтому он может отличатся на вашем компьютере, аналогично количество инструкций будет зависеть от реализации команды 'ls'):

noam 12.05.13 в 20:32

0

Отслеживание адресов инструкций (Инструментирование инструкций)

Declaser 12.05.13 в 18:51

0

В предыдущем примере, процедуре анализа docount не передавались никакие аргументы. В данном примере будет показано, как эти аргументы передавать. При вызове процедур анализа PIN позволяет передавать указатель на инструкцию, текущие значения регистров, эффективные адреса операций с памятью, константы и так далее. Полный список смотрите в IARG_TYPE.

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

Изменим аргументы на INS_InsertCall для того, чтобы передать адрес инструкции, которая будет выполняться. Заменим docount на процедуру printip, которая выводит на экран адрес инструкции. Она записывает вывод в файл itrace.out.

Declaser 12.05.13 в 18:52

0

Далее показано, как получить данный вывод.

Declaser 12.05.13 в 18:57

0

Вот как запустить и посмотреть вывод:

noam 12.05.13 в 19:43

0

Отслеживание обращений к памяти (Инструментирование инструкций)

Declaser 12.05.13 в 18:58

0

Предыдущий пример обрабатывал все инструкции. Иногда инструментально необходимо обработать только некоторый класс инструкций, например, операции с памятью или инструкции ветвления. Инструмент может справиться с этой задачей пут ем использования PIN API, которые являются общими для всех наборов инструкций, и описаны здесь. Дополнительно можно найти конкретные API для наборов инструкций для IA-32-ISA и IA-64-ISA.

Представленный пример показывает, как проводить более избирательную обработку путем проверки инструкций. Данный инструмент производит отслеживание всем адресов памяти, к которым обращается программа. Он также может быть полезен для отладки и имитации кэша данных в процессоре.

В данном случае обработка происходит только тех инструкций, которые считывают данные из памяти или записывают в память. Также используется INS_InsertPredicatedCall вместо INS_InserCall для того, чтобы избежать создание ссылок на инструкции, которые определены при ложном условии. Предикация является главной архитектурным свойством архитектуры IA-64. На архитектурах IA-32 и Intel 64 CMOVcc, FCMOVcc и REP префиксные строковые операции рассматриваются как условные. Для CMOVcc и FCMOVcc условием является условие наличия “cc” в тесте, для REP префиксных строковых операций условием является ненулевое значение регистра счетчика.

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

Declaser 12.05.13 в 18:57

0

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

Declaser 12.05.13 в 19:00

0

Вот как его запустить и пример вывода:

noam 12.05.13 в 19:39

0

Определение загрузки и выгрузки образов(Инструментирование образов)

Declaser 12.05.13 в 19:01

0

Представленный ниже пример выводит сообщение в файл трассировки каждый раз при загрузке или выгрузке изображения. На самом деле, он нарушает режим обработки, так как инструмент PIN ни проверяет изображение, ни добавляет код обработки

Если применить его к команде ls, будет получен следующий вывод:

Declaser 12.05.13 в 19:29

0

Более эффективный подсчет инструкций (Отслеживающее инструментирование)

Declaser 12.05.13 в 19:30

0
+1

Пример Простого подсчета инструкций (Инструментирование инструкций) подсчитывал число выполненных инструкций путем внедрения вызова перед каждой инструкцией. В данном примере используется более эффективный подход подсчитывания числа инструкций в BBL во время обработки, а также повышения значения счетчика один раз за BBL вместо того, чтобы увеличивать счетчик один раз за инструкцию.

Declaser 12.05.13 в 19:31

0

Подсчет инструкций процедур (Инструментирование процессов)

Declaser 12.05.13 в 19:31

0
+1

Данный пример обрабатывает программу подсчета количества раз вызова процедуры, а также общее число инструкций, исполняемых в каждой процедуре. По завершении он выводит профиль в файл proccount.out.

Declaser 12.05.13 в 19:31

0

Ход работы инструмента, а также пример вывода представлен далее:

Declaser 12.05.13 в 19:32

0
+1

Данный пример можно найти в директории source/tools/ManualExamples/proccount.cpp.

Declaser 12.05.13 в 19:32

0
+1

Использование функции PIN_SafeCopy().

Функция PIN_SafeCopy() используется для копирования указанного количества байтов из области памяти источника в область памяти получателя. Данная функция гарантирует безопасный возврат к месту вызова, даже если области источника или получателя недоступны (полностью или частично).

Использование данной функции также гарантирует, что инструмент считывает или записывает значения, используемые приложением. Например, в ОС Windows Pin заменяет определенные TEB поля во время выполнения кода анализа PIN. Если инструмент получит доступ к этим полям напрямую, то он увидит измененные значения, а не исходные. Использование PIN_SafeCopy() позволяет инструменту считывать или записывать значения этих полей приложения.

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

Данный пример можно найти в директории source/tools/ManualExamples/safecopy.cpp.

Declaser 12.05.13 в 19:37

0

PIN предоставляет инструменты, позволяющие множеством способов контролировать порядок выполнения вызовов анализа. Порядок выполнения зависит, в основном, от места внедрения (IPOINT) и порядка вызова (CALL_ORDER). Представленный ниже пример демонстрирует данное поведение путем проведения анализа всех возвращаемых инструкций тремя различными способами. Дополнительные примеры могут быть найдены в директории source/tools/InstrumentationOrderAndVersion.

Declaser 12.05.13 в 19:34

0

Следующий пример можно найти в директории source/tools/ManualExamples/invocation.cpp.

Declaser 12.05.13 в 19:35

0

Определение значений передаваемых в функцию аргументов

Часто возникает необходимость узнать значение аргумента, передаваемого в функцию, или возвращаемое значение. PIN может использоваться для получения данной информации. Используя функцию RTN_InsertCall() Вы можете определить значения интересующих аргументов. Приведенный ниже пример выводит на экран входные аргументы функций malloc() и free(), а также возвращаемое значение функции malloc().

Declaser 12.05.13 в 19:35

0

Поиск функций по имени в Windows

Поиск функций по имени в Windows требует применения другого подхода. Несколько символов могут относиться к одному и тому же адресу функции. Важно осуществлять проверку всех имен символов.

Следующий пример находит имя функции в таблице символов и использует адрес символа для нахождения соответствующего RNT.

Declaser 12.05.13 в 19:42

0

Отслеживание работы многопоточных приложений

Следующий пример демонстрирует использование уведомляющих функций обратного вызова ThreadStart() и ThreadFini(). Хотя ThreadStart() и ThreadFini() выполняются при VM и пользовательских блокировках, они все еще могут работать с ресурсами, которые разделяются с другими анализирующими процессами. Использование PIN_GetLock() предотвратит подобные ситуации.

Следует учесть, что известна изоляционная проблема при использовании PIN на ОС Windows. При работе в ОС Windows может возникнуть тупиковая ситуация, если инструмент открывает файл, в функции обратного вызова, выполняемой в мультипотоковом приложении. Для того, чтобы избежать данную проблему, откройте данный файл в главной функции и пометьте информацию с помощью ID потока. В качестве примера рассмотрите программу в директории source/tools/ManualExamples/buffer-win.cpp. Данная проблема отсутствует в ОС Linux.

Declaser 12.05.13 в 19:43

0
Минутку...