Можем ли мы скрыть / скрыть имена символов в таблице символов исполняемого объектного файла ELF?
Согласно этой спецификации ELF: объектный файл ELF содержит различные разделы, и один из них является разделом таблицы символов .symtab
который содержит информацию обо всех символах (файлы, функции, объекты и т. д.).
ELF содержит информацию, такую как имя, флаги атрибутов, тип, значение, привязка и т. Д. Для каждого символа в таблице символов.
Имя объекта для файла, функции или объекта (массив, переменная, строка) и т. Д. Фактически предоставляет внутреннюю информацию кода. Таким образом, любой человек может анализировать ELF (используя strings
, objdump
или же readelf
инструменты) и увидеть эту информацию и получить представление о вещах внутри кода, которые должны храниться в секрете.
Для удобочитаемости и удобства обслуживания мы пишем код, понятный разработчикам. Итак, нам нужно продолжать использовать правильные имена файлов и имена переменных и т. Д. Мы не можем затемнять их, используя обфускацию кода, так как это затруднит обслуживание.
Вопрос (отредактированный): Есть ли способ, с помощью которого мы можем скрыть или удалить "имена" символов из таблицы символов исполняемого ELF, чтобы никто не мог получить представление о коде, а исполняемый файл все еще работает?
1 ответ
Есть ли способ, с помощью которого мы можем скрывать или скрывать имена символов в таблице символов ELF, чтобы никто не мог понять, как разрабатывается код (без обфускации кода)?
Зависит от того, какой файл ELF вы отправляете конечному пользователю.
Если вы отправляете полностью связанный исполняемый файл ELF, strip a.out
удалит таблицу символов полностью (но не динамический символ, который должен остаться по понятным причинам).
Если вы отправляете совместно используемую библиотеку ELF, вам нужно тщательно контролировать ее открытый API, используя -fvisibility=hidden
или скрипт версии компоновщика. Если вы делаете, strip
снова удалит все, кроме вашего публичного API.
Если вы отправляете перемещаемый объект ELF (или архивную библиотеку), то вы ничего не можете сделать с его таблицей символов (опять же по очевидной причине: таблица символов используется для выполнения окончательной ссылки).
Наконец, ваш вопрос, похоже, основан на неправильном представлении:
Мы не можем скрыть их с помощью обфускации кода, так как это затруднит поддержку.
Обычный способ применить обфускацию кода - это непосредственно перед тем, как вы сделаете окончательный продукт доставки (то есть точно в той же точке, где вы будете использовать strip
или любой другой метод, который скрывал бы детали реализации). Применение обфускации кода в этой точке затруднит сохранение результата точно так же, как и любой другой метод скрытия деталей реализации.
Примечательно, что вы (обычно) не применяете обфускацию к разрабатываемому и поддерживаемому коду (т.е. ваши сборки разработки остаются необфусцированными).
Да, это возможно. Вы можете использоватьstrip
чтобы удалить символы статической библиотеки, и вы можете удалить символы динамической библиотеки, загрузив библиотеку самостоятельно, вместо того, чтобы позволить ОС делать это автоматически.