Можем ли мы скрыть/скрыть имена символов в таблице символов исполняемого объектного файла ELF?

Согласно этой спецификации ELF: Объектный файл ELF содержит различные разделы и один из них раздел таблицы символов .symtab, который содержит информацию обо всех символах (файлах, функциях, объектах и ​​т. д.).

ELF содержит такую ​​информацию, как имя, флаги атрибутов, тип, значение и привязка и т. д. для каждого символа в таблице символов.

Имя объекта для файла, функции или объекта (массив, переменная, строка) и т. д. фактически раскрывает внутреннюю информацию кода. Таким образом, любой человек может проанализировать ELF (используя инструменты strings, objdump или readelf), увидеть эту информацию и получить представление о внутренних вещах кода, которые следует держать в секрете.

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

Вопрос (отредактировано): Можно ли как-нибудь скрыть или удалить «имена» символов из таблицы символов исполняемого файла ELF, чтобы никто не мог получить представление о коде, а исполняемый файл продолжал работать? ?


person Zeeshan Mahmood    schedule 19.08.2016    source источник
comment
Что вы подразумеваете под неясными таблицами символов? как только файл elf станет полностью исполняемым с полностью разрешенными символами, таблица символов (хотя и не динамическая) бесполезна, я не уверен, что вы подразумеваете под запутыванием - сделать его невосприимчивым к RE и анализу кода и полностью сохранить код исполняемый?   -  person DrPrItay    schedule 20.08.2016
comment
@DrPrItay Да, скрытие или удаление имен (текстовых строк) этих символов и сохранение исполняемого файла. Можно ли убрать названия символов?   -  person Zeeshan Mahmood    schedule 22.08.2016


Ответы (2)


Есть ли способ скрыть или скрыть имена символов в таблице символов ELF, чтобы никто не мог понять, как разрабатывается код (без обфускации кода)?

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

Если вы отправляете полностью связанный исполняемый файл ELF, запуск strip a.out полностью удалит таблицу символов (но не динамический символ, который должен остаться по очевидным причинам).

Если вы отправляете разделяемую библиотеку ELF, вам необходимо тщательно контролировать ее открытый API, используя -fvisibility=hidden или скрипт версии компоновщика. Если вы это сделаете, strip снова удалит все, кроме вашего общедоступного API.

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

Наконец, ваш вопрос, похоже, основан на неправильном понимании:

Мы не можем скрыть их с помощью обфускации кода, так как это затруднит поддержку.

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

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

person Employed Russian    schedule 21.08.2016
comment
Команда «strip» работает с исполняемым ELF, как вы предлагаете. Спасибо за подробный ответ и познавательную информацию. - person Zeeshan Mahmood; 22.08.2016
comment
@ZeeshanMahmood, что ты имеешь в виду под стриптизом? После strip nm не отображает символы, но readelf по-прежнему содержит много информации. - person Demi-Lune; 11.03.2020
comment
@Demi-Lune Если вы зададите отдельный вопрос о strip против readelf, я могу ответить на него. Скорее всего, вы экспортируете рассматриваемый символ через динамическую таблицу символов, и nm -D также отобразит этот символ. - person Employed Russian; 11.03.2020

Да, это возможно. Вы можете использовать strip для удаления статических библиотечных символов, и вы можете удалить динамические библиотечные символы, загрузив библиотеку самостоятельно, вместо того, чтобы позволять ОС делать это автоматически.

person Ascari Gh    schedule 03.03.2020