Положение независимых исполняемых файлов и Android

Я написал исходный код .c (в Eclipse), который использует библиотеку libcap для получения информации, связанной с сетевым трафиком. Теперь я создал исполняемый двоичный файл с помощью ndk-build в Eclipse. Я поместил созданный бинарный файл в папке libs/armeabi в папку/data/local/моего андроида (укорененный nexus 5, Lollipop) и попытался запустить бинарный файл. но андроид выкидывает эту ошибку

Ошибка: поддерживаются только независимые от позиции исполняемые файлы (PIE)

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

Ответ 1

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

Позиция Independent Executable или PIE позволяет переместить программу, как и общий объект. При каждом запуске программы программа может быть загружена по разным адресам, чтобы затруднить атакующему угадать определенное состояние программы.

Вы можете скомпилировать и связать исполняемый файл PIE одним из двух способов. Сначала скомпилируйте все с помощью -fPIE и свяжите с -pie. Во-вторых, скомпилировать все с помощью -fPIC и связать с -pie.

Если вы создаете как общий объект, так и программу, скомпилируйте все с помощью -fPIC. Свяжите общий объект с -shared и соедините программу с -pie.

Вы не можете сделать это по-другому. То есть вы не можете скомпилировать все с помощью -fPIE и создать как общий объект, так и программу. Подробнее см. Параметры генерации кода" в руководстве GCC.


Одна вещь, на которую нужно обратить внимание на Android: создание с PIE до 4.1 приведет к ошибке сегментации в /system/bin/linker. PIE был добавлен на Android 4.1, и он сбрасывает меньшие версии.

Кто-то сказал мне, чтобы я поставил пользовательскую ссылку/загрузчик, чтобы избежать проблемы, но я не могу найти ссылку на данный момент.

Также см. Улучшения безопасности в Android от 1.5 до 4.1.


Ошибка: поддерживаются только отдельные независимые исполняемые файлы (PIE)

Да, это функция Lollipop. См. Улучшения безопасности в Android 5.0.


Вы можете проверить, построена ли программа с помощью PIE, используя readelf:

$ readelf -l my-prog | grep -i "file type"
Elf filetype is DYN (shared object file)

Важная часть readelf сообщает DYN и не сообщает EXE. EXE означает, что ему не хватает PIE, и это должно вызвать дефект, связанный с безопасностью.


Связанный, см. Является ли PIE (независимый от позиции исполняемый файл) для основных исполняемых файлов, поддерживаемых в Android 4.0 (ICS)?

Ответ 2

Я знаю, что это старая тема, но этот хакерский способ может сэкономить время для людей с Hex-редактором, найдите 17-й байт, измените значение 02 на 03, и вот оно!