13 KiB
vpnhide
Скрывает активное VPN-соединение на Android от выбранных приложений.
Чем vpnhide лучше аналогов?
Существующие модули, такие как NoVPNDetect и NoVPNDetect Enhanced, хукают внутри процесса целевого приложения через Xposed. Это означает, что любое приложение с anti-tamper защитой может обнаружить инъекцию и отказаться работать. Автор NoVPNDetect Enhanced прямо пишет: «Модуль не будет работать если у подключаемого приложения есть защита от LSPosed, проверка на инъекции в память. Например MirPay, Т-Банк.»
vpnhide использует принципиально другой подход:
- lsposed хукает
system_server(а не целевое приложение) — данные о VPN удаляются на уровне Binder до того, как попадут в процесс приложения. Anti-tamper SDK проверяет свой процесс и ничего не находит. - kmod хукает само ядро — ioctl, netlink и /proc/net фильтруются до возврата из системного вызова. Нулевой след в процессе. Никакой инъекции библиотек. Нечего обнаруживать.
- Процесс целевого приложения полностью нетронут — ни Xposed, ни inline-хуков, ни модифицированных регионов памяти.
Благодаря этому vpnhide работает с такими приложениями, как MirPay, Т-Банк, Альфа-Банк и другими банковскими/государственными приложениями, которые активно обнаруживают и блокируют модули на основе Xposed.
Кроме того, vpnhide покрывает нативные векторы обнаружения (ioctl, netlink, /proc/net), которые аналоги вообще не хукают — именно эти векторы используют приложения на кроссплатформенных фреймворках и нативных SDK.
Какие модули нужны?
Всегда нужен lsposed (обрабатывает обнаружение через Java API) плюс один нативный модуль:
kmod+lsposed(рекомендуется) — хуки на уровне ядра, нулевой след в процессе приложения. Невидим для anti-tamper SDK в банковских/госприложениях. Требуется поддерживаемое GKI-ядро (см. ниже).zygisk+lsposed— хуки libc внутри процесса приложения. Используйте, если ваше устройство не поддерживается сборками kmod, или если нет возможности установить модуль ядра.
Установка
Скачайте последний релиз из Releases.
kmod + lsposed (рекомендуется)
- Установите
vpnhide-kmod-<ваш-gki>.zipчерез менеджер KernelSU-Next → Модули → Установить из хранилища - Установите
vpnhide-lsposed.apkкак обычное приложение - В менеджере LSPosed включите модуль vpnhide и добавьте «System Framework» в его область действия
- Перезагрузите устройство (обязательно — хуки LSPosed внедряются в
system_serverпри загрузке, поэтому модуль должен быть активен до запускаsystem_server) - Откройте приложение VPN Hide, предоставьте ему root-доступ (Magisk запросит автоматически; на KernelSU-Next выдайте разрешение вручную в менеджере) и выберите целевые приложения
Как узнать поколение GKI: выполните adb shell uname -r. Вывод выглядит как 6.1.75-android14-11-g... — поколение android14-6.1. Скачайте соответствующий vpnhide-kmod-android14-6.1.zip.
Примечание:
android14в названии GKI — это НЕ версия Android, а поколение ядра. Все Pixel с 6 по 9a используют одно ядроandroid14-6.1. Серия Pixel 10 перешла наandroid16-6.12.
zygisk + lsposed
- Установите
vpnhide-zygisk.zipчерез менеджер KernelSU-Next или Magisk → Модули - Установите
vpnhide-lsposed.apkкак обычное приложение - В менеджере LSPosed включите модуль vpnhide и добавьте «System Framework» в его область действия
- Перезагрузите устройство (обязательно — хуки LSPosed внедряются в
system_serverпри загрузке) - Откройте приложение 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) | 24 проверки, покрывающие все векторы обнаружения. |
Покрытие обнаружения
| # | Вектор обнаружения | SELinux | kmod | zygisk | lsposed |
|---|---|---|---|---|---|
| 1 | ioctl(SIOCGIFFLAGS) на tun0 |
x | x | ||
| 2 | ioctl(SIOCGIFNAME) разрешение индекса в имя |
x | x | ||
| 3 | ioctl(SIOCGIFCONF) перечисление интерфейсов |
x | x | ||
| 4 | getifaddrs() (использует netlink внутри) |
x | x | ||
| 5 | netlink RTM_GETLINK дамп |
блок. | x | x | |
| 6 | netlink RTM_GETADDR дамп (IPv4 + IPv6) |
блок. | x | ||
| 7 | netlink RTM_GETROUTE дамп |
блок. | |||
| 8 | /proc/net/route |
блок. | x | x | |
| 9 | /proc/net/ipv6_route |
блок. | x | ||
| 10 | /proc/net/if_inet6 |
блок. | x | ||
| 11 | /proc/net/tcp, tcp6 |
блок. | |||
| 12 | /proc/net/udp, udp6 |
блок. | |||
| 13 | /proc/net/dev |
блок. | |||
| 14 | /proc/net/fib_trie |
блок. | |||
| 15 | /sys/class/net/tun0/ |
блок. | |||
| 16 | NetworkCapabilities (hasTransport, NOT_VPN, transportInfo) |
x | |||
| 17 | NetworkInfo (getType, getTypeName) |
x | |||
| 18 | ConnectivityManager.getActiveNetwork() |
x | |||
| 19 | ConnectivityManager.getAllNetworks() + VPN-сканирование |
x | |||
| 20 | LinkProperties (interfaceName, routes, DNS) |
x | |||
| 21 | NetworkInterface.getNetworkInterfaces() |
x | x | ||
| 22 | System.getProperty (настройки прокси) |
x | |||
| 23 | /proc/net/route через Java FileInputStream |
блок. | x | x |
блок. = SELinux запрещает доступ для обычных приложений (Android 10+). Хуки не нужны.
Строки 1–4, 19 и 21 — единственные векторы, доступные обычным приложениям. Всё остальное либо заблокировано 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 или Vectorzygisk— только arm64- Прямые системные вызовы
svc #0обходят хуки libc в zygisk — для этого и нужен kmod - Серверная детекция неисправима на стороне клиента — используйте раздельное туннелирование
Лицензия
MIT. См. LICENSE.
Модуль ядра объявляет MODULE_LICENSE("GPL"), как требуется ядром Linux для разрешения символов EXPORT_SYMBOL_GPL во время выполнения.