Как отличить пользовательские / библиотечные функции от скомпилированного файла? - PullRequest
6 голосов
/ 06 июля 2011

РЕДАКТИРОВАТЬ :

Я хочу выделить статически связанные библиотечные функции и пользовательские тексты пользовательские внутри скомпилированный файл (например, PE-файл).

Как этого добиться?(Я имею в виду сравнение баз данных, но я не знаю ни одной базы данных.)

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


Под библиотечными функциями я подразумеваю функции, определенные в библиотеках, такие как STL (я знаю, что это плохое имя).

Под пользователем -определенные функции, я имею в виду те, которые написаны отдельными программистами.

Есть ли программный способ достижения этой цели?

Сейчас я думаю о сравнении двоичных файлов с базой данных, но я не знаюлюбая база данных.

Пожалуйста, порекомендуйте базу данных или другой способ в качестве ответа.Спасибо.

Ответы [ 2 ]

1 голос
/ 14 июля 2011

Когда ваша программа связана, статические функции и пользовательские функции включаются файл за файлом.

Так что, если вы сбросите заголовок PE-файла и посмотрите на таблицу символов (используя objdump -x, если вы запускаете с mingw32 или чем-то еще), вы увидите имя файла, а затем все функцииимпортировать из этого, после другого имени файла и его функций ...
Или, если у вас есть отладочная информация, может быть, это может быть проще.

Так что после связывания функций с файлом вы можете отсортироватьфункции путем анализа их имени файла.Ищите расширение (.c / .lib / .a) или проверьте список файлов, которые у вас есть где-то.Будьте осторожны при удалении файлов crt0 ...

Однако это довольно сложное решение, и я не уверен, что оно подойдет для каждой программы.

1 голос
/ 11 июля 2011

В этом ответе предполагается, что вы хотите проанализировать стандартный исполняемый файл Windows, который динамически связан с другими библиотеками импорта (.lib и ассоциированные файлы .dll, которые не являются статически связанными), и если это так, вы хотите интерпретировать Файловая структура PE (Portable Executable).

Вот хорошая статья , с которой можно начать, с примером кода для выгрузки PE-заголовка.

Вы захотите сосредоточиться на таблице импорта (раздел .idata) для вызовов внешней библиотеки и таблице экспорта (раздел .edata) для вызовов, определенных внутри исполняемого файла и помеченных как экспортируемые (обычно это существует только в файлах DLL). ).

Для статических библиотек их формат называется COFF, и есть утилита DUMPBIN , которая поставляется вместе с Visual Studio, которую вы можете использовать для быстрого просмотра ваших файлов lib и даже выгрузки разборки кода, если Вы хотели.

Утилита DUMPBIN, которая поставляется с 32-разрядной версией Microsoft Visual C ++, сочетает в себе возможности LINK, LIB и EXEHDR утилиты. Сочетание этих инструментов имеет возможность предоставить информацию о формате и символах, представленных в исполняемые, библиотечные и DLL-файлы.

Информацию о структуре файлов COFF см. В этой статье .

Выяснить, если вызов функции из библиотеки или нет, было бы непросто, но, насколько я помню, большинство статических вызовов библиотеки в коде на самом деле являются вызовами thunk (простые вызовы jmp к реальному объектному коду, скопированному из библиотеки) и они имеют небольшой размер (обычно около 5 байт), в то время как «определяемые пользователем» не являются громоздкими, а представляют собой вызовы на основе bp.

...