Могу ли я определить «функцию» в двоичном файле x86? - PullRequest
1 голос
/ 03 июня 2011

«Функция» означает фрагмент (или график фрагментов) двоичного файла, который начинается в точке (вероятно, поступающей из одной из инструкций CALL), возможно устанавливает кадр стека и имеет одну или несколько конечных точек вформа RET (и в зависимости от соглашения о вызовах она может также разматывать указанный кадр стека).

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

Моя цель в том, что именно: извлечь функции.Чисто ради этого.Может быть, сделаю что-нибудь причудливое позже, если у меня будет время и представление.

Ответы [ 3 ]

2 голосов
/ 03 июня 2011

Вы можете использовать библиотеку дизассемблера , например BeaEngine , чтобы выполнить тяжелую работу за вас, а затем выполнить поиск по полученным мнемоникам для call .

2 голосов
/ 03 июня 2011

Без таблицы символов я бы сказал: почти невозможно. По крайней мере, без ложных срабатываний / негативов.

Сначала вам нужен дизассемблер. Просто поиск байтовой комбинации не обрезает ее, комбинация может быть частью некоторых «случайных» данных. Тогда отслеживание CALL, вероятно, является лучшим решением, поскольку функция не всегда начинается с одной и той же последовательности кода операции. Но даже дизассемблер может столкнуться с трудностями и запутаться в данных, встроенных в текстовый сегмент.

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

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

0 голосов
/ 03 июня 2011

Вы должны искать такие вещи, как:

push    ebp
mov     ebp, esp
sub     esp, ???

...
...

add    esp, ???
pop    ebp
ret
...