Извлечение статически связанных библиотек из исполняемого файла

StackOverflow https://stackoverflow.com/questions/1728961

Вопрос

Я не уверен, возможно ли это вообще, но, учитывая исполняемый файл (foo.exe), он содержит множество библиотек, связанных статически.

Есть ли какое-либо программное обеспечение, которое извлекает из этого файла .lib (или .a), находящийся внутри исполняемого файла?

Спасибо.

Это было полезно?

Решение

Невероятно маловероятно, поскольку, как правило, вы не внедряете все содержимое библиотеки в свой исполняемый файл.

Вы получаете достаточно, чтобы удовлетворить все неопределенные символы.На самом деле это может быть лишь небольшая часть библиотеки.Библиотека обычно состоит из набора объектных файлов, из которых только те, которые необходимы, связаны с вашим исполняемым файлом.

Например, если единственное, что вы вызвали в библиотеке времени выполнения C, было exit(), у вас вряд ли будет printf() семейство функций в вашем исполняемом файле.

Если вы напрямую связались с объектными файлами, у вас может быть шанс, поскольку они будут включены независимо от того, используются они или нет (если только ваш компоновщик не умный).

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

Позвольте мне объяснить типичный процесс:

  1. Четыре объектных файла, a.o, b.o, c.o и d.o содержат функции a(), b(), c() и d() соответственно.Они есть все добавлено в abcd.a архив.
  2. Все они автономны (без зависимостей), за исключением того факта, что b() звонки c().
  3. У вас есть основная программа, которая вызывает a() и b() и вы компилируете его, а затем связываете его с abcd.a библиотека.
  4. Компоновщик перетаскивает a.o и b.o из библиотеки в ваш исполняемый файл, удовлетворяя потребность в a() и b() но создавая необходимость в c(), потому что b() это нужно.
  5. Затем компоновщик перетаскивает c.o из библиотеки в ваш исполняемый файл, удовлетворяя потребность в c().Теперь все неопределенные символы удовлетворены, исполняемый файл готов и вычищен, вы можете запустить его, когда будете готовы.

Ни на одном этапе этого процесса не было d.o перетащили в ваш исполняемый файл, так что у вас нет никакой надежды его вытащить.

Обновлять: Повторно «если есть другой способ, я бы сначала посмотрел на него» комментарий, который я сделал выше, вы только что заявили в комментарии к одному из других ответов, что у вас есть исходный код, из которого созданы библиотеки, которые вы хотите извлечь.Мне нужно спросить:почему нельзя пересобрать библиотеки с этим исходником?Мне кажется, это гораздо более простое решение, чем пытаться воссоздать библиотеки из трясины исполняемого кода.

Другие советы

Представьте себе, что у вас есть 10 книг на языке, который вы не понимаете, без обложек, титульных листов, номеров страниц и глав.Некоторые книги могут быть неполными.Все страницы перемешаны, поэтому невозможно узнать, где начало и конец каждой книги. (каждая страница — это вызов функции) Теперь попытаемся найти 123 страницу книги 5 (допустим, о ней упоминалась выше функция Exit() ).

Ну, ЭТО ВОЗМОЖНО...

Кажется, вы просите декомпилятор.Такие инструменты сложны в использовании (вероятно, невозможно для слегка сложного C++), и если есть какой-либо другой способ решения вашей проблемы, в том числе переписывание библиотек за пару месяцев, я бы рекомендовал именно этот вариант действий.

Как отметил Пакс, даже если вы использовали декомпилятор, вы получите только те библиотечные функции, которые вызывает исполняемый файл.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top