Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Анализ программных реализаций. Практикум
.pdf
11
Рисунок 1 – Окно запуска профилирования
В результате под контролем профилировщика запустится исследуемое
приложение RayTraceDemo.exe, в его появившемся главном окне установите
флажок Anti alias (сглаживание) и нажмите кнопку “Run”, в результате будет
запущен трассировщик лучей, который постепенно отрисует трехмерную сцену.
Рисунок 2 – Трассировщик лучей

12
Можно дождаться завершения работы трассировщика и закрыть
программу с помощью кнопки «Х», также можно закончить профилирование и
создать снэпшот (набор результатов профилирования), нажав в появившемся
окне профилировщика кнопку Get Snapshot. Также можно остановить
профилирование, удалив полученные результаты – кнопка Drop Snapshot (потом
профилирование можно возобновить) или убить процесс и закончить
профилирование – кнопка Kill Process.
Нажмите кнопку Get Snapshot, подождав, когда исследуемая программа
проработает минут пять.
Рисунок 3 – Снэпшот
Обзор результатов профилирования (Overview)
Данная вкладка отображает результаты профилирования, в частности
содержит сведения о:
– горячих точках (функциях, инструкции которых исполняются большую
часть времени, с учетом возможного многократного вызова функций) – User code
hotspots;
– распределение времени работы программы внутри главного потока
(потока, выполняющего главную функцию приложения) по подсистемам – Main
thread, а также внутри других потоков – Other threads, aggregated;
– параметрах снэпшота – Snapshot;

13
– приложении – Application;
– среде исполнения – Environment.
Изучение дерева потоков (Threads Tree)
Перейдите на вкладку Thread Tree и изучите деревья вызова функций
внутри каждого исполняющегося потока. Для удобства потяните вправо
экспендер, расположенный возле вкладок, чтобы появилась слева легенда,
изображенная на рисунке.
Рисунок 4 – Дерево потоков
Здесь в правой верхней части, раскрыв функцию можно узнать какие
функции она вызывала в процессе исполнения программы. Для каждой функции
указывается время ее исполнения в миллисекундах (включая время выполнения
вызываемых из нее функций), процент времени ее выполнения, количество
вызовов.
В нижней части окна отображается исходный код выбранной в дереве
функции, также, например, при его отсутствии, можно посмотреть

14
декомпилированный код или код в виде MSIL (для этого можно установить
флажок Show IL code).
Руководствуясь легендой, определите:
– Главный поток;
– Финализирующий поток;
– Функции с высоким собственным временем выполнения (собственное
время выполнения функции – время ее операторов без учета времени выполнения
вызываемых из нее функций);
– Критический путь – путь по дереву до функций, представляющих собой
горячие точки;
– Концы критического пути – собственно горячие точки.
Обратите внимание, что функции библиотеки .NET отображаются
приглушенным цветом.
Изучение дерева вызовов (Call Tree)
Перейдите на вкладку Call Tree и аналогично предыдущей вкладке изучите
дерево вызова функций, обратите внимание, что первыми располагаются главная
функция Main, с которой начинает работать программа и функция Dispatch
диспетчера пула потоков, который используется в исследуемой программе.
Прочие функции затемнены (относятся к самому .NET) и не оказывают влияние
на производительность программы.
Проценты указанные для каждой функции представляют долю суммарного
времени выполнения функции (с учетом ее нескольких возможных вызовов) в
стеке вызовов функции от суммарного времени выполнения всех функций всех
потоков.
С помощью легенды определите критические пути и горячие точки.
Обрате внимание, что в исходном коде функций слева от наиболее важных
операторов указывается, сколько раз они выполнялись с учетом того, сколько раз
вызывалась функция, наличия ветвлений и циклов.

15
Изучение списка функций (Plain List)
Перейдите на вкладку Plain List. В результате отобразится таблица
функций, для каждой из которых указано: ее название, суммарное время
выполнения всех ее вызовов включая вызовы дочерних (вызываемых из нее)
функций – Time, суммарное собственное время выполнения функции (время
выполнения ее операторов без вызова дочерних функций) – Own Time, процент
суммарного собственного времени выполнения от суммарного времени
выполнения, включая вызовы дочерних функций, – Own / Total, количество
вызовов функции – Calls, среднее время выполнения функции с учетом дочерних
функций – Avg time (является отношением значений колонки Time и Calls).
Рисунок 5 – Список функций
При выделении любой функции в верхней таблице в нижней отобразятся
тоже в виде таблицы характеристики всех вызываемых из нее функций.
Изучите различные режимы отображения данных, руководствуясь:
– Переключателем группировки в верхней части окна – Group by: None
(без группировки, по умолчанию), Class (группировка по классам), Namespace
(по пространствам имен), Assembly (по сборкам);

16
– Флажком Show system functions (показывать системные функции);
– Различными сортировками функций путем нажатия на заголовки
соответствующих столбцов.
Руководствуясь данной таблицей, определите наиболее горячие функции в
программе.
Изучение горячих точек приложений (Hot Spots)
Перейдите на вкладку Hot Spots и изучите, какие функции по мнению
профилировщика являются наиболее горячими. Для определения горячих точек
он по умолчанию учитывает сумму собственного времени выполнения функций
и времени вызова системных функций .NET.
При раскрытии функции можно увидеть функции, которые вызывают
данную функцию.
Использование прочих типов профилирования
Запускайте профилирование демонстрационной программы повторно для
различных типов профилирования. Для этого перейдите на вкладку Home и
нажмите кнопку “…” возле результатов профилирования. В появившемся окне
выберите тип профилирования Sampling, запустите трассировку лучей и
подождите пять минут, затем создайте снэпшот и посмотрите, как изменились
результаты профилирования. Повторите профилирования для типа Tracing.
Также изучите, как изменяются результаты профилирования в зависимости
от используемого способа измерения: Wall time (performance counter), Wall time
(CPU instruction), Thread time, Thread cycle time.
Исследование собственного приложения
Возьмите собственную программу, написанную под .NET, достаточно
большую и содержащую не менее 10-15 функций и исследуйте ее с помощью
профилировщика. Вызов профилировщика в этом случае можно осуществлять из
Visual Studio.

17
Контрольные вопросы
1. Что такое dotTrace Performance?
2. Как осуществляется запуск профилирования?
3. Какие данные содержит вкладка обзора результатов профилирования?
4. Чем отличаются дерево потоков и дерево вызовов?
5. Какие прочие типы профилирования вы знаете?

18
3 Лабораторная работа №2 Защита .NET приложений от
анализа и модификации
Цель
Изучить возможности утилит SmartAssembly, Dotfuscator и .NET Reflector.
Задачи
1. Анализ программы в .NET Reflector.
2. Защита программ с помощью Dotfuscator.
3. Защита программ с помощью SmartAssembly.
Теория
SmartAssembly от компании RedGate – это .NET-обфускатор, а также гибкая
система создания автоматических отчетов, связанных с ошибками и
использованием возможностей приложений. Если вы являетесь .NETразработчиком, то теперь в ваших руках инструмент для создания
высококачественных и свободных от багов продуктов. Софт способен защитить
код и IP от обратного инжиниринга и прочих видов атак.
Dotfuscator – это инструмент, который сочетает в себе запутывание кода,
оптимизацию, сжатие и укрепление безопасности в приложениях .NET, Xamarin
и универсальной платформы Windows. Обычно исполняемые файлы .NET могут
быть легко реконструированы бесплатными инструментами (такими как ILSpy,
dotPeek и JustDecompile), потенциально раскрывающими алгоритмы и
интеллектуальную собственность (коммерческую тайну), механизмы
лицензирования и безопасности. Кроме того, код можно запустить через
отладчик и проверить его данные. Dotfuscator может усложнить все эти задачи.
Dotfuscator был разработан PreEmptive Solutions. Бесплатная версия .NET
Obfuscator, называемая Dotfuscator Community Edition, распространяется как

19
часть Microsoft Visual Studio. Однако текущая версия бесплатна только для
личного некоммерческого использования.
NET Reflector – утилита для Microsoft .NET, комбинирующая браузер
классов, статический анализатор и декомпилятор. Программа может
использоваться для навигации, поиска и анализа содержимого .NETкомпонентов, а также сборок и переводить двоичные данные в форму, пригодную
для чтения человеком. Reflector позволяет производить декомпиляцию .NETсборок на языки C#, Visual Basic .NET и MSIL. Reflector также включает дерево
вызовов (англ. Call Tree), которое может использоваться для навигации вглубь ILметодов с целью определения, какие методы они вызывают. Программа
отображает метаданные, ресурсы и XML-документацию. .NET Reflector может
быть использован .NET-разработчиками для понимания внутренней работы
библиотек кода, для наглядного отображения различий между двумя версиями
сборки, и того, как различные части .NET-приложения взаимодействуют друг с
другом.
.NET Reflector может использоваться для нахождения мест, имеющих
проблемы с производительностью и поиска багов. Он также может быть
использован для поиска зависимостей сборки. Программа может быть
использована для эффективной конвертации кода между C# и VB.NET.
Для выполнения данного задания должен быть установлен SmartAssembly
6 и Dotfuscator. Для анализа работы инструментов защиты нужен декомпилятор
.NET Reflector.
Для выполнения заданий выберите любую Вашу программу (достаточно
большую), например, ранее сделанную курсовую работу.
Ход работы
Изучение в .NET Reflector выбранной программы
Откройте в .NET Reflector exe-файл выбранной вами программы, изучите
и запомните результаты декомпиляции в объеме достаточном для дальнейшего
выявления изменений.

20
Рисунок 6 – Код программы в .NET Reflector
Переименование идентификаторов с помощью Dotfuscator
Используя Dotfuscator, переименуйте все идентификаторы в программе
(exe-файле) и сохраните программу под другими именем (новый exe-файл).
Оцените результаты работы Dotfuscator в .NET Reflector путем декомпиляции.
Проверьте, что программа сохранила свою работоспособность, путем ее запуска
и тестирования вручную. Если не работает, то возможно нужно настроить
исключения.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
