Android: как я могу перехватить вызовы собственных функций?

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

Следуя подходу исследовательской работы 1, я хочу изменить таблицу связей процедур (PLT) и таблицу глобальных смещений (GOT) файла ELF. Идея состоит в том, что я хочу, чтобы все вызовы функций указывали на мою собственную перехватывающую функцию, которая решает, блокировать ли вызов или передать его исходной целевой функции.

Спецификация ELF 2 гласит (в Книге III, Глава 2 Загрузка программы и Динамическое связывание, стр. 2-13, Разделы "Глобальная таблица смещений" и "Таблица связывания процедур"), что фактическое содержание и форма PLT и GOT зависят от процессор. Однако в документации "ELF для архитектуры ARM" 3 я не смог увидеть точную спецификацию любой из этих таблиц. Я концентрируюсь на ARM и не рассматриваю другие архитектуры в данный момент.

У меня есть 3 вопроса:

  • Как я могу сопоставить символ с GOT или PLT?
  • Где найти точную спецификацию GOT и PLT для процессоров ARM?
  • Поскольку PLT содержит машинный код; мне придется анализировать этот код, чтобы изменить целевой адрес, или все записи PLT выглядят одинаково, чтобы я мог просто изменить память с постоянным смещением для каждой записи PLT?

Спасибо Мануэль

1 ответ

  1. Вам необходимо проанализировать заголовки ELF и найти индекс символа по имени строки в SHT_DYNSYM. Затем выполните итерацию по GOT (который будет называться ".rela.plt") и найдите запись с соответствующим индексом.
  2. Я не знаю насчет формальной спецификации, но вы всегда можете изучить исходный код компоновщика Android и разобрать некоторые двоичные файлы, чтобы заметить закономерности
  3. Обычно PLT - это обычный код, и вам не нужно его изменять. Он на самом деле спроектирован таким образом, потому что, если компоновщик должен его модифицировать, вы получите память RWX, что нежелательно. Так что вам просто нужно переписать запись в GOT. По умолчанию записи GOT указывают на подпрограмму распознавателя, которая найдет нужную функцию и запишет запись в GOT. Это на Linux. На Android адрес уже разрешен.

Я сделал что-то для Linux x86_64 https://github.com/astarasikov/sxge/blob/vaapi_recorder/apps/src/sxge/apps/demo1_cube/hook-elf.c

А также есть блог о том, что вы хотите делать на Android https://www.google.de/amp/shunix.com/android-got-hook/amp/

Другие вопросы по тегам