2016-09-19 7 views
0

В настоящее время я разрабатываю загрузчик SO-плагинов для существующей библиотеки SO (GTA SA для Android). SO-библиотеки на Android - это файлы Unix ELF. Не имея исходного кода библиотеки, я не могу просто добавить импортированную функцию в исходный код и снова скомпилировать библиотеку SO.Как добавить одну импортированную функцию в существующую библиотеку Android SO?

Существует libGTASA.so, который я хочу редактировать и изменять таблицу импорта, добавляя новый символ RunSOpluginLoader, который будет реализован в libFastman92pluginLoader.so, который уже загружен до того, как libGTASA.so будет загружен кодом Java (classes.dex), который я также изменил.

Для EXE-файлов в Windows существует множество программ для редактирования импорта, и я бы использовал LordPE. Для файла ELF мне нужно другое решение, и у меня проблемы с поиском.

Я пробовал использовать HT Editor, который должен открыть и отредактировать файлы ELF, но через несколько секунд после того, как libGTASA.so откроется в HT Editor, приложение просто сработает.

Мне нужно решение для добавления импорта в библиотеку SO, предпочтительно решение, которое будет работать в Windows, но если нет, то я готов сделать это в системе Linux.

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

По существу:
libGTASA.so - Я хочу добавить импортированный символ RunSOpluginLoader в этот файл.

ответ

0

Через несколько дней после того, как я написал вопрос, я понял, как это сделать. я написал простой ELF класс файловый менеджер в C++ и программу, которая выполняет следующие действия:

  • загрузить файл ELF - создать представление заголовков, разделов и программных сегментов, динамической таблице (указываемой PT_DYNAMIC)
  • добавлен новый раздел (.fastman92_code, с разрешениями RWX)
  • добавлен новый программный сегмент, который охватывает новый раздел
  • я заметил сегмент программы должен быть выровнен, я сделал выравнивание 32768, и она работала.
  • добавил новую строку в строку таблицы (указанную здесь -> header.e_shstrndx), строка «fastman92.code», это имя раздела.
  • разделы перегруппированы и будут записаны в конце файла, необходимо обновить elfManager.header.e_shoff.
  • rellocated .dynstr (раздел указываемого DT_STRTAB), добавив два importedentries к нему:
    { "libFastman92pluginLoader.so"}, { "ProcessPluginLoading"}
  • rellocated .dynsym, добавив эти две записи в массив ,
  • перераспределен раздел указываемого DT_JMPREL из динамической таблицы добавляется одна записи, чтобы указать в ProcessLoadingPlugin, возле моей добавленным функции Jni_OnLoad
  • rellocated программных сегментов, добавлена ​​PT_DYNAMIC запись, которая является необходимой, поскольку сегменты программы уже входят в составе первый загружаемый сегмент. Они больше не являются частью сегмента с виртуальным адресом 0x0.
  • добавлена ​​простая функция - замена Jni_OnLoad, которая вызовет импортированный символ ProcessPluginLoading, который реализован в libFastman92pluginLoader.so, а затем выполнить функции из .init_array, а затем вызвать реальный оригинальный Jni_OnLoad. Символ «Jni_OnLoad» должен был указывать на мою небольшую функцию.
  • редактировать динамическая таблица, добавлена ​​DT_NEEDED со смещением строки, указывающие на «libFastman92pluginLoader.so»
  • редактировать динамическая таблица, отключена .init_array, настроить размер его равным нулю (InitArraySzIt-> d_un.d_val = 0;), где auto InitArraySzIt = elfManager.FindFirstEntryInDynamicTableWithTag (0x1B);
  • сохранить новый файл .so

Если вы хотите узнать больше о или получить код, не стесняйтесь связаться со мной.