Вставить статически связанные двоичные файлы - PullRequest
0 голосов
/ 08 июня 2018

Существует хорошо известный метод для вставки динамически связанных двоичных файлов: создание разделяемой библиотеки и использование переменной LD_PRELOAD .Но это не работает для статически связанных двоичных файлов.

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

Поэтому мне интересно, есть ли способ вставить статически связанные двоичные файлы в один и тот жеLD_PRELOAD работает для динамически связанных двоичных файлов, т. Е. Без изменения кода или повторной компиляции существующих двоичных файлов.

Меня интересует только ELF в Linux.Так что не проблема, если потенциальное решение не является «переносимым».

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

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

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

Компоновщик --wrap=<symbol> опция может помочь здесь.

Но это не практичнопотому что перекомпиляция

Re- компиляция здесь не требуется, только повторное связывание .

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

Сторонние библиотеки работают нормально (перекомпоновка), но двоичные файлы сложнее.

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

0 голосов
/ 29 сентября 2018

То, что вы ищете, называется бинарным инструментарием (например, с использованием Dyninst или ptrace).Идея состоит в том, что вы пишете программу-мутатор, которая присоединяет (или статически переписывает) вашу исходную программу (называемую mutatee) и вставляет код по вашему выбору в определенные моменты в mutatee.Основная проблема обычно заключается в поиске точек ввода с использованием API, предоставляемого механизмом инструментовки.В вашем случае, так как вы в основном ищете статические символы, это может быть довольно сложным и, вероятно, потребует эвристики, если у мутанта не будет динамических символов.

0 голосов
/ 09 июня 2018

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

Это невозможно (РЕДАКТИРОВАТЬ: по крайней мере, без большой работы - см. Комментарии к этому ответу) по двум причинам:

  • по умолчанию символы, определенные в исполняемом файле, не экспортируются, поэтому недоступны для динамического компоновщика (вы можете изменить это через -export-dynamic или экспортировать списки, но это имеет неприятные побочные эффекты производительности или обслуживания)
  • даже если вы экспортируете необходимые символы, ELF требует, чтобы динамический symtab исполняемого файла всегда сначала просматривался во время разрешения символов (см. раздел 1.5.4 «Область поиска» в dsohowto );symtab из библиотеки LD_PRELOAD всегда будет следовать за исполняемым файлом и, следовательно, не сможет перехватить символы
...