Главная » Безопасность » Как защитить нативную библиотеку

Как защитить нативную библиотеку

Как защитить нативную библиотеку

Security hardening of Android native code — статья, рассказывающая, как защитить от реверса нативные библиотеки в приложениях для Android.

Обычно разработчики выносят сенситивный код в нативные, написанные на языках C/C++ библиотеки, чтобы повысить производительность и затруднить реверс приложения (читать дизассемблерные листинги нативного кода гораздо сложнее, чем код smali, и тем более сложнее, чем декомпилированный с помощью того же jadx код на Java). Однако не стоит забывать, что одно лишь наличие нативного кода не остановит опытного и мотивированного взломщика, поэтому стоит использовать дополнительные средства, чтобы его запутать. Есть несколько несложных способов это сделать.

Еще по теме: Защита приложения от отладки

Защита нативной библиотеки. Способ №1

Замена вызовов функций стандартной библиотеки языка С (libc, роль которой в Android играет Bionic) прямыми системными вызовами. Это позволит защититься от взломщиков, которые используют Frida для перехвата вызовов функций или подменяют библиотеку libc аналогом с функцией дампа всех вызовов и возвращаемых ими данных (например, какие файлы открывает приложение, какие порты слушает).

Применять системные вызовы напрямую довольно сложно, но можно воспользоваться наработками проекта MUSL с реализацией минималистичного варианта libc. Для этого достаточно взять из проекта файл syscall_arch.h и использовать определенный в нем набор функций __syscallX, где X — это число аргументов системного вызова. Реализованные с помощью этой функции системные вызовы open и read могут выглядеть так:

Обрати внимание: благодаря ключевому слову inline код этих функций будет встроен в вызывающий код, что еще больше усложнит его анализ.

Защита нативной библиотеки. Способ №2

Замена функции libc на собственные реализации. Кроме функций — оберток системных вызовов, библиотека libc также включает в себя множество подсобных функций, в том числе для работы со строками (strcmp, strlen, strstr) и памятью (memcmp, memset, memcpy). Эти функции также лучше встроить прямо в код библиотеки. Взять их реализацию можно из той же библиотеки MUSL или Glibc.

Защита нативной библиотеки. Способ №3

Обфускация с помощью Obfuscator-LLVM. Этот форк известного набора компиляторов LLVM выполняет преобразования кода (запутывание графа исполнения, замена инструкций, мертвые инструкции, тупиковые переходы и так далее), затрудняющие его анализ. Чтобы заставить среду разработки собрать библиотеку с использованием O-LLVM, необходимо внести соответствующие правки в CMakeLists.txt, указав путь до O-LLVM (первая переменная):

Размер результирующей библиотеки при этом может возрасти в десять раз благодаря внедрению больших объемов неиспользуемого кода и запутыванию графа исполнения.

Еще по теме: Лучшие программы для реверс-инжиниринга

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *