Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Method Hooking в Android

Method Hooking в Android

Доклад Александра Гузенко (Tinkoff) для PDUG-секции на PHDays 8.

More Decks by Positive Development User Group

Other Decks in Technology

Transcript

  1. Заголовок Перехват (англ. hooking) — технология, позволяющая изменить стандартное поведение

    тех или иных компонентов. Injector — программа-помощник, которая встраивает наш hooked код вместо оригинального Основные понятия
  2. Заголовок ➔ Прикрепляемся к процессу ➔ Ставим указатель на адрес

    нужной нам функции (захуканной) ➔ Выполняем функцию ➔ Сохраняем полученное значение ➔ Возвращаемся обратно, как будто вызвали обычную функцию Как работает method hooking
  3. Заголовок testprogram.exe: 5 + 5 = 10 testprogram.exe: 5 +

    5 = 10 testprogram.exe: 5 + 5 = 10 your program has been hacked! testprogram.exe: 5 + 5 = 1010 your program has been hacked! testprogram.exe: 5 + 5 = 1010 your program has been hacked! testprogram.exe: 5 + 5 = 1010 Метод Hooking
  4. Заголовок ➔ Используя malloc/calloc , копируем название нужной библиотеки в

    сторонний процесс. ➔ Загружаем нужную библиотеку, вызывая dlopen . ➔ Находим адрес нашей hooked функции с помощью dlsym. ➔ Вызываем нашу hooked функцию. ➔ Выгружаем загруженную библиотеку, используя функцию dlclose. Детальнее о Hooking
  5. Заголовок Функция Ptrace() #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t

    pid, void *addr, void *data); Системная функция ptrace () предоставляет средство, с помощью которого один процесс («трассировщик») может наблюдать и контролировать выполнение другого процесса («трассировка»), а также проверять и изменять память и регистры трассировки. В основном, он используется для реализации отладки и трассировки системных вызовов. Метод Hooking
  6. Заголовок libc function address = libc start address + function

    offset Где: libc start address — константа (0xb7e22000 – например, для какого-то ‘заражённого’ бинарника) Отступ функции от начала библиотеки (ищется с помощью “readelf -s libc.so.fun_name | grep “) Если бы было всё просто
  7. Заголовок ASLR (англ. address space layout randomization — «рандомизация размещения

    адресного пространства») — технология, применяемая в операционных системах, при использовании которой случайным образом изменяется расположение в адресном пространстве процесса важных структур данных, а именно образов исполняемого файла, подгружаемых библиотек, кучи и стека. Address space layout randomization
  8. Заголовок PC ( R15 ) – (англ. program counter) —

    регистр процессора, который указывает, какую команду нужно выполнять следующей. LR ( R14 ) – (англ. Link register) — регистр, хранящий адрес, куда будем возвращаться после выполнения функции R0-R3 — вспомогательные регистры. Сначала хранят первые 4 аргумента, после выполнения в R0 лежит значение выполнившейся функции. R13 – регистр, в котором хранится адрес на стек. Основные понятия
  9. Заголовок • Первые 4 аргумента кладутся в регистры R0-R3. •

    Если есть ещё какие-то – они кладутся в стек (R13) . • В регистр PC ( R15 ) кладётся указатель на функцию. • В регистр LR ( R14 ) кладётся адрес, куда нам вернуться. • Возвращаемое значение складывается в регистр R0. Конвенция ARM
  10. Заголовок • Используем PTRACE_GETREGS для сохранения текущих регистров. • Расставляем

    регистры в соответствии с конвенцией (R0 – R3, если мало – кладём в стек). • Ставим 0 в LR, чтобы мы смогли поймать SIGSEGV после вызова функции. • Кладём в PC адрес функции. • Обновляем регистры с помощью PTRACE_SETREGS. • Стартуем функцию с помощью PTRACE_CONT и ждём SIGSEGV (потому что 0 в LR). • Забираем и сохраняем данные из регистра R0. • Восстанавливаем оригинальные регистры. Как происходит инъекция
  11. Заголовок 1. Не используйте рутованный девайс. 2. Думайте, какие приложения

    ставите. 3. Пользуйтесь разными flavors для дебага и релиза Способы защиты
  12. Заголовок • https://github.com/asLody/legend • https://github.com/antojoseph/frida-android-hooks • https://github.com/rk700/YAHFA • http://d3adend.org/blog/?p=589 •

    https://www.evilsocket.net/2015/05/01/dynamically-inject-a-shared-library-into- a-running-process-on-androidarm/ • https://shunix.com/shared-library-injection-in-android/ • https://github.com/evilsocket/arminject/ • https://en.wikipedia.org/wiki/Address_space_layout_randomization • https://www.youtube.com/watch?v=1S0aBV-Waeo • https://www.nccgroup.trust/us/about-us/newsroom-and- events/blog/2015/september/code-injection-on-android/ • http://resources.infosecinstitute.com/android-hacking-and-security-part-25- hooking-and-patching-android-apps-using-xposed-framework/#gref Ссылки