как найти границы функций в двоичном коде - PullRequest
2 голосов
/ 09 сентября 2011

Я вижу, что двоичный перевод обычно основан на трассировке. Это потому, что невозможно получить границы функций? Есть ли метка функции в двоичном коде?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Нет тривиального ответа на это. Вы можете искать ret инструкции, но они не гарантируют, что они являются границами функций, как вы могли бы вернуться из середины функции.

Поиск таких вещей, как

mov   ebp, esp 

будет работать до некоторой степени, но опять же, это не гарантия.

Некоторые компиляторы (особенно Intel Compiler) перемещают разветвленные блоки в после , когда функция завершается, и возвращаются в функцию ...

0 голосов
/ 09 сентября 2011

Обычный метод определения начального и конечного адресов функций C - это распечатать карту памяти и отсканировать начало функции.Многие компиляторы будут указывать длину функции в карте памяти.

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

Извините, но язык C предоставляет только начальный адрес функций;не их длины.

0 голосов
/ 09 сентября 2011

Что означает трассировка? Основной ответ на ваш вопрос - нет, в машинном коде нет метки функции. Вероятно, существуют шаблоны, специфичные для каждого компилятора, которые вы можете искать, и вы также можете использовать исполняемый формат для поиска точек входа в публичные функции в коде. Но в наши дни компиляторы могут выполнять оптимизацию всей программы, которая стирает концепцию функции на уровне машинного кода.

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