vpnhide/README.ru.md
okhsunrog 9c129dac1c feat: add chameleon mascot branding and app icon
- Add branding/ directory with logo.png and icon-512.png
- Replace default app icon with chameleon-in-hoodie adaptive icon
  (all densities: mdpi through xxxhdpi + monochrome)
- Update both READMEs with centered logo and title (floppa-vpn style)
2026-04-13 16:09:27 +03:00

15 KiB
Raw Blame History

VPN Hide

VPN Hide

Скрывает активное VPN-соединение на Android от выбранных приложений.

Чем vpnhide лучше аналогов?

Существующие модули, такие как NoVPNDetect и NoVPNDetect Enhanced, покрывают только Java API обнаружение и хукают внутри процесса целевого приложения через Xposed. У этого подхода две критические проблемы:

  1. Обнаружение anti-tamper защитой — любое приложение с проверкой инъекций в память обнаруживает хуки Xposed и отказывается работать. Автор NoVPNDetect Enhanced прямо пишет: «Модуль не будет работать если у подключаемого приложения есть защита от LSPosed, проверка на инъекции в память. Например MirPay, Т-Банк.»
  2. Нет нативного покрытия — приложения, использующие C/C++ код, кроссплатформенные фреймворки (Flutter, React Native) или прямые системные вызовы, могут обнаружить VPN через ioctl, getifaddrs, netlink-сокеты и /proc/net/*. Java-хуки эти векторы полностью пропускают.

vpnhide решает обе проблемы двухуровневой архитектурой:

Уровень 1 — Java API (модуль lsposed): хукает system_server, а не целевое приложение. NetworkCapabilities, NetworkInfo и LinkProperties фильтруются на уровне Binder до того, как данные попадут в процесс приложения. Приложение получает чистые данные через IPC — никаких инъекций в его процесс, нечего обнаруживать.

Уровень 2 — нативный (kmod или zygisk): покрывает все нативные пути обнаружения:

  • kmod (рекомендуется) — хуки kretprobe на уровне ядра. Фильтрует ioctl (SIOCGIFFLAGS, SIOCGIFNAME, SIOCGIFCONF), getifaddrs/netlink-дампы (RTM_GETLINK, RTM_GETADDR) и чтение /proc/net/* — всё до возврата системного вызова в пользовательское пространство. Нулевой след в процессе. Никаких инъекций библиотек. Нечего обнаруживать.
  • zygisk (альтернатива) — inline-хуки libc.so внутри процесса приложения. То же нативное покрытие, что и kmod, но работает в процессе, поэтому теоретически обнаружим продвинутой anti-tamper защитой. Используйте, если ваше ядро не поддерживается kmod.

Процесс целевого приложения полностью нетронут (при использовании kmod + lsposed) — ни Xposed, ни inline-хуков, ни модифицированных регионов памяти. Благодаря этому vpnhide работает с MirPay, Т-Банк, Альфа-Банк и другими банковскими/государственными приложениями, которые активно обнаруживают и блокируют модули на основе Xposed.

Какие модули нужны?

Всегда нужен lsposed (уровень Java API) плюс один нативный модуль:

  • kmod + lsposed (рекомендуется) — полностью out-of-process, невидим для anti-tamper. Требуется поддерживаемое GKI-ядро (см. ниже).
  • zygisk + lsposed — используйте, если ваше устройство не поддерживается сборками kmod или если нет возможности установить модуль ядра.

Установка

Скачайте последний релиз из Releases.

kmod + lsposed (рекомендуется)

  1. Установите vpnhide-kmod-<ваш-gki>.zip через менеджер KernelSU-Next → Модули → Установить из хранилища
  2. Установите vpnhide-lsposed.apk как обычное приложение
  3. В менеджере LSPosed включите модуль vpnhide и добавьте «System Framework» в его область действия
  4. Перезагрузите устройство (обязательно — хуки LSPosed внедряются в system_server при загрузке, поэтому модуль должен быть активен до запуска system_server)
  5. Откройте приложение VPN Hide, предоставьте ему root-доступ (Magisk запросит автоматически; на KernelSU-Next выдайте разрешение вручную в менеджере) и выберите целевые приложения

Как узнать поколение GKI:

  1. На телефоне откройте Настройки → О телефоне и найдите строку Версия ядра. Она выглядит примерно так: 6.1.75-android14-11-g...
  2. Вам нужны две части из этой строки: версия ядра (6.1) и поколение android (android14). Вместе они образуют ваше поколение GKI: android14-6.1
  3. Скачайте соответствующий файл из релиза: vpnhide-kmod-android14-6.1.zip

Также можно выполнить adb shell uname -r через ADB, чтобы увидеть ту же строку версии ядра.

Важно: android14 в строке ядра — это НЕ версия Android, а поколение ядра. Например, все Pixel с 6 по 9a используют ядро android14-6.1 вне зависимости от того, стоит ли на них Android 14 или 15. Серия Pixel 10 использует android16-6.12.

zygisk + lsposed

  1. Установите vpnhide-zygisk.zip через менеджер KernelSU-Next или Magisk → Модули
  2. Установите vpnhide-lsposed.apk как обычное приложение
  3. В менеджере LSPosed включите модуль vpnhide и добавьте «System Framework» в его область действия
  4. Перезагрузите устройство (обязательно — хуки LSPosed внедряются в system_server при загрузке)
  5. Откройте приложение VPN Hide, предоставьте ему root-доступ (Magisk запросит автоматически; на KernelSU-Next выдайте разрешение вручную в менеджере) и выберите целевые приложения

Настройка

Приложение VPN Hide (рекомендуется): откройте приложение VPN Hide (устанавливается как vpnhide-lsposed.apk) и предоставьте ему root-доступ (Magisk запрашивает автоматически; на KernelSU-Next выдайте разрешение в менеджере). Приложение показывает все установленные приложения с иконками, названиями и поиском. Отметьте приложения, от которых нужно скрыть VPN, нажмите «Сохранить». Работает и с kmod, и с zygisk — автоматически записывает во все нужные файлы через su.

WebUI: на KernelSU-Next откройте модуль в менеджере и нажмите WebUI. Тот же функционал, но доступен только на KernelSU-Next (Magisk не поддерживает WebUI).

Командная строка: редактируйте /data/adb/vpnhide_kmod/targets.txt или /data/adb/vpnhide_zygisk/targets.txt напрямую (одно имя пакета на строку). Для применения изменений требуется перезагрузка.

После изменения целей принудительно остановите и перезапустите затронутые приложения — хуки вступают в силу при следующем запуске приложения.

Проверка

Установите vpnhide-test.apk из релиза, добавьте его в список целевых приложений и запустите при активном VPN. Все проверки должны показать PASS.

Компоненты

Директория Что Как
kmod/ Модуль ядра (C) Хуки kretprobe в пространстве ядра. Нулевой след в процессе приложения. (подробнее)
lsposed/ LSPosed-модуль + приложение выбора целей (Kotlin) Хуки writeToParcel в system_server для per-UID фильтрации Binder. APK также служит UI для управления целями. (подробнее)
zygisk/ Zygisk-модуль (Rust) Inline-хуки libc.so в процессе приложения. Альтернатива kmod. (подробнее)
test-app/ Диагностическое приложение (Kotlin + Rust) 26 проверок, покрывающих все векторы обнаружения.

Покрытие обнаружения

# Вектор обнаружения SELinux kmod zygisk lsposed
1 ioctl(SIOCGIFFLAGS) на tun0 x x
2 ioctl(SIOCGIFNAME) разрешение индекса в имя x x
3 ioctl(SIOCGIFMTU) фингерпринтинг MTU x x
4 ioctl(SIOCGIFCONF) перечисление интерфейсов x x
5 Все остальные SIOCGIF* (INDEX, HWADDR, ADDR и т.д.) x x
6 getifaddrs() (использует netlink внутри) x x
7 netlink RTM_GETLINK дамп блок. x x
8 netlink RTM_GETADDR дамп (IPv4 + IPv6) блок. x
9 netlink RTM_GETROUTE дамп блок.
10 /proc/net/route блок. x x
11 /proc/net/ipv6_route блок. x
12 /proc/net/if_inet6 блок. x
13 /proc/net/tcp, tcp6 блок.
14 /proc/net/udp, udp6 блок.
15 /proc/net/dev блок.
16 /proc/net/fib_trie блок.
17 /sys/class/net/tun0/ блок.
18 NetworkCapabilities (hasTransport, NOT_VPN, transportInfo) x
19 NetworkInfo (getType, getTypeName) x
20 ConnectivityManager.getActiveNetwork() x
21 ConnectivityManager.getAllNetworks() + VPN-сканирование x
22 LinkProperties (interfaceName) x
23 LinkProperties (маршруты через VPN-интерфейсы) x
24 NetworkInterface.getNetworkInterfaces() x x
25 System.getProperty (настройки прокси) x
26 /proc/net/route через Java FileInputStream блок. x x

блок. = SELinux запрещает доступ для обычных приложений (Android 10+). Хуки не нужны.

Строки 16, 21 и 24 — единственные векторы, доступные обычным приложениям. Всё остальное либо заблокировано SELinux, либо проходит через Java API (покрывается lsposed).

Сборка из исходников

  • kmod: cd kmod && make && ./build-zip.sh — см. kmod/BUILDING.md
  • zygisk: cd zygisk && ./build-zip.sh (Rust + NDK + cargo-ndk)
  • lsposed: cd lsposed && ./gradlew assembleDebug (JDK 17)
  • test-app: cd test-app && ./gradlew installDebug (JDK 17 + Rust + NDK)

Проверено на

  • RKNHardering — все векторы обнаружения чисты
  • YourVPNDead — все векторы обнаружения чисты

Оба реализуют официальную методику обнаружения VPN/прокси Минцифры РФ (источник).

Раздельное туннелирование (split tunneling)

Корректно работает с конфигурациями VPN с раздельным туннелированием. Затрагиваются только приложения из списка целей.

Приложения-детекторы, сравнивающие публичный IP устройства с внешними чекерами, требуют раздельного туннелирования — трафик приложения-детектора должен выходить через оператора, а не через туннель.

Модель угроз

vpnhide скрывает активный VPN от конкретных приложений. Он НЕ предназначен для:

  • Скрытия root или кастомной прошивки
  • Обхода Play Integrity
  • Обмана серверной детекции (утечки DNS, чёрные списки IP, фингерпринтинг латентности/TLS)

Известные ограничения

  • kmod требует GKI-ядро с CONFIG_KPROBES=y (стандарт на устройствах Android 12+)
  • lsposed требует LSPosed, LSPosed-Next или Vector
  • zygisk — только arm64
  • Прямые системные вызовы svc #0 обходят хуки libc в zygisk — для этого и нужен kmod
  • Серверная детекция неисправима на стороне клиента — используйте раздельное туннелирование

Лицензия

MIT. См. LICENSE.

Модуль ядра объявляет MODULE_LICENSE("GPL"), как требуется ядром Linux для разрешения символов EXPORT_SYMBOL_GPL во время выполнения.