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. Заголовок ptsecurity.com Method Hooking в Android Android разработчик Tinkoff Гузенко

    Александр Сергеевич
  2. Заголовок HCE (Host-based Card Emulation) — технология для совершения бесконтактных

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

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

    нужной нам функции (захуканной) ➔ Выполняем функцию ➔ Сохраняем полученное значение ➔ Возвращаемся обратно, как будто вызвали обычную функцию Как работает method hooking
  5. Заголовок Original Hooked Метод Hooking

  6. Заголовок Original Hooked Метод Hooking

  7. Заголовок С++ Hooked Метод Hooking

  8. Заголовок С++ Hooked Метод Hooking jmp (место в памяти нашего

    hooked метода)
  9. Заголовок 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
  10. Заголовок Метод Hooking

  11. Заголовок ➔ Используя malloc/calloc , копируем название нужной библиотеки в

    сторонний процесс. ➔ Загружаем нужную библиотеку, вызывая dlopen . ➔ Находим адрес нашей hooked функции с помощью dlsym. ➔ Вызываем нашу hooked функцию. ➔ Выгружаем загруженную библиотеку, используя функцию dlclose. Детальнее о Hooking
  12. Заголовок Трассиро́вка - процесс пошагового выполнения программы. Основные понятия

  13. Заголовок Функция Ptrace() #include <sys/ptrace.h> long ptrace(enum __ptrace_request request, pid_t

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

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

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

  17. Заголовок Покажите мне код

  18. Заголовок REMOTE_ADDRESS = REMOTE_BASE + (LOCAL_ADDRESS - LOCAL_BASE ) Injector

  19. Заголовок PC ( R15 ) – (англ. program counter) —

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

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

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

  23. Заголовок Покажите мне код

  24. Заголовок Покажите мне код

  25. Заголовок Демо Legend

  26. Заголовок Демо Xposed

  27. Заголовок 1. Не используйте рутованный девайс. 2. Думайте, какие приложения

    ставите. 3. Пользуйтесь разными flavors для дебага и релиза Способы защиты
  28. Заголовок • 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 Ссылки
  29. Заголовок ptsecurity.com Спасибо! Спасибо!