Я работаю над этим небольшим проектом, в котором я хотел бы создать граф вызовов приложения - я не собираюсь делать что-то сложное, это в основном для развлечения / опыта.Я работаю на платформе x64.
Первая цель, которую я поставил перед собой, - это измерить время, затрачиваемое на каждую функцию моего тестового приложения.До сих пор моей стратегией было использование __penter () _ и __pexit () _ - __penter () _ - это функция, которая будет вызываться в начале каждого метода или функции и, наоборот, __pexit () _ будет вызываться в концекаждый метод или функция.
С помощью этих двух функций я могу записывать каждый вызов функции, а также время, проведенное в каждой из них.Далее я хотел бы получить адрес каждой вызываемой функции.
Например, если мы рассмотрим следующий стек вызовов (очень упрощенный):
main()
....myFunction()
........_penter()
Я нахожусь в __penter_ и хочучтобы получить адрес вызывающей функции, myFunction () .Я уже нашел способ сделать это в случае неконечных функций, я просто использую RtlLookupFunctionEntry .Однако это решение, похоже, не работает для конечных функций, поскольку они не предоставляют никаких данных для раскрутки.
Одна вещь, о которой я думал, - это подняться еще на один уровень в стеке вызовов в main.() и декодировать процедуру CALL вручную - для этого потребуется получить указатель на инструкцию, вызывающую myFunction () .
Мне было бы интересно, если бы кто-нибудь из вас знал, какполучить адрес текущей функции в случае конечных функций.У меня такое ощущение, что мой нынешний подход немного сложнее.
Спасибо,
Clem