Без таблицы символов я бы сказал: почти невозможно. По крайней мере, без ложных срабатываний / негативов.
Сначала вам нужен дизассемблер. Просто поиск байтовой комбинации не обрезает ее, комбинация может быть частью некоторых «случайных» данных. Тогда отслеживание CALL, вероятно, является лучшим решением, поскольку функция не всегда начинается с одной и той же последовательности кода операции. Но даже дизассемблер может столкнуться с трудностями и запутаться в данных, встроенных в текстовый сегмент.
Даже если вы смогли найти функции, вы не можете получить их имена без отладочных символов (в скомпилированной программе больше не нужны имена, только адреса).
Кроме того, вам будет очень трудно выяснить, какие параметры принимает функция. Например, функция может принимать 2 аргумента, но не использует ни один. В этом случае вам потребуется вызов функции и посмотреть, как подготовлен стек, до вызова функции.