1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/waruqi-byOpen

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

dyOpen: библиотека dlopen, которая обходит ограничения мобильной системы

Введение

byOpen — это расширенная версия библиотеки dlfunctions, которая позволяет обойти ограничения мобильных систем.

Поддерживаемые функции

  • Android
    • Позволяет загружать и использовать интерфейсы Android-системных библиотек в приложениях, даже если они ещё не были загружены в maps. Это особенно полезно для карт, где ещё нет доступа к некоторым системным библиотекам.
    • Поддерживает Android 7 и выше. Однако на Android 7 и более поздних версиях вызовы dlopen и System.load ограничены, и существуют библиотеки, такие как Nougat_dlfunctions, которые позволяют обойти эти ограничения, загружая библиотеки из maps. Но они не работают с библиотеками, которые ещё не были загружены в maps.
    • byOpen не только поддерживает загрузку библиотек из maps с помощью fake dlopen, но и позволяет загружать библиотеки, которые ещё не были добавлены в maps, обходя системные ограничения. Это делает его более универсальным решением.
    • Автор отмечает, что текущая реализация является достаточно универсальной и протестирована на Android 10, но подчёркивает необходимость самостоятельной оценки её применимости.
    • Принцип работы
      • Реализация основана на идее, представленной в статье «Простой метод обхода ограничений Android P для нескрытых API». В этой статье описывается способ использования собственных вызовов, имитирующих системные вызовы, для обхода ограничения classloader-namespace в Android N. Это позволяет загрузить любую библиотеку из /system/lib в maps и затем использовать fake dlopen для доступа к ней.
    • Расширенная версия fake dlopen
      • Существует множество реализаций fake dlopen в интернете, таких как Nougat_dlfunctions и Enhanced_dlfunctions. byOpen также использует их идеи и добавляет некоторые улучшения:
        • Возможность загрузки библиотек, которых нет в /proc/self/maps,
        • Поддержка поиска символов не только в .dynsym, но и в .symtab,
        • Уменьшение количества выделений памяти за счёт однократного выделения памяти для всего процесса dlopen.
    • Пример использования на Android
      • Пример приложения для тестирования на Android можно найти в разделе Android Sample на GitHub. Автор предупреждает, что в примере используются заранее определённые системные библиотеки, и рекомендует изменить их на собственные перед использованием.
      • Кроме Native версии интерфейса dlopen, byOpen предоставляет Java-версию System.loadLibrary, которая позволяет напрямую загружать системные библиотеки на уровне Java.
      • Ключевой код для загрузки библиотеки в Java выглядит следующим образом:
static public boolean loadLibrary(String libraryName) {
    Method forName = Class.class.getDeclaredMethod("forName", String.class);
    Method getDeclaredMethod = Class.class.getDeclaredMethod("getDeclaredMethod", String.class, Class[].class);
    Class<?> systemClass = (Class<?>) forName.invoke(null, "java.lang.System");
    Method loadLibrary = (Method) getDeclaredMethod.invoke(systemClass, "loadLibrary", new Class[]{String.class});
    loadLibrary.invoke(systemClass, libraryName);
}
    * В Native версии, реализованной в файле dlopen_android.c, автор переписал этот метод через JNI и объединил его с fake dlopen.
  • iOS
    • Хотя iOS позволяет использовать dlopen напрямую, это может вызвать проблемы при проверке App Store. Apple может сканировать приложения на наличие вызовов, связанных с dlopen/dlsym, чтобы определить использование частных интерфейсов.
    • Чтобы избежать обнаружения этих вызовов, byOpen реализует собственный dlopen/dlsym и ищет соответствующие символы в уже загруженных images.
    • Для дополнительной безопасности рекомендуется шифровать или изменять имена библиотек и символов, чтобы избежать обнаружения при компиляции в приложение.

Использование интерфейса

Интерфейсы и статические библиотеки доступны в файле dlopen.h. Использование аналогично оригинальному dlopen:

typedef by_char_t const* (*curl_version_t)();
by_pointer_t handle = by_dlopen("libcurl.so", BY_RTLD_LAZY);
if (handle)
{
    by_pointer_t addr = by_dlsym(handle, "curl_version");
    if (addr)
    {
        curl_version_t curl_version = (curl_version_t)addr;
        by_print("curl_version: %s", curl_version());
    }
    by_dlclose(handle);
}

Компиляция

Для компиляции требуется установить xmake.

  • Android
    • Прямая компиляция библиотеки:
$ xmake f -p android --ndk=~/file/android-ndk-r20b
$ xmake
* Компиляция тестового APK через gradle:
$ cd src/android
$ ./gradlew app:assembleDebug
* Создание APK напрямую через xmake:
$ xmake apk_build
* Установка и тестирование APK через xmake:
$ xmake apk_test
  • iOS
    • Прямая компиляция библиотеки:
$ xmake f -p iphoneos -a [armv7|arm64]
$ xmake
  • MacOS
    • Также возможно компилировать и тестировать на macOS:
$ xmake
$ xmake run

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Библиотека dlfunctions с улучшенной версией для обхода ограничений системы на мобильных устройствах. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/waruqi-byOpen.git
git@api.gitlife.ru:oschina-mirror/waruqi-byOpen.git
oschina-mirror
waruqi-byOpen
waruqi-byOpen
master