Comments 15
У меня тот же скайп в телефоне мало того, что отвязан от рекламы, да ещё добавлены ништяки типа кнопки выхода, которых в оригинальной версии нет.
Понятно, что если писать проверку подписи на интерпретируемых языках, то любой школьник её может убрать за пол часа. Что бы проверить целостность apk нужно писать проверку на c++ иди Delphi. Но всё равно этот код обращается к функциям ОС через java прослойку, которую не сложно изменить, и возвращать требуемое значение, а не реальное. Вот мне и интересно: есть ли способы борьбы с этим — что бы ndk обращалось к ос непосредственно, а не через Dalvik/ART. Что бы хоть кулхацкеров отсеять.
Всё дело в том, что Android в принципе разрешает ставить приложения из сторонних источников. Чтобы это убрать нужно делать как на iOS, но я до конца не знаю как там всё устроено. Во всяком случае как раз таки jailbreak ломает проверку устанавливающихся приложений.
В андроид проверку сертификата никто никуда не убирает. Приложения на 4пда так-же подписаны, только каким-то левым сертификатом. Т.е. для системы это получается совершенно другое приложение, хоть и созданное на основе оригинального.
Вот хочу я, например, показать баннер. За это отвечает пара классов. Взломщик их просто вычищает, не разбираясь с хитросплетениями запутанного кода. Тоже самое с вызовом проверки лицензии, или проверки подписи. Надо просто вызов функции одного класса заменить на вызов другого. Время работы взломщика увеличится минут на 20, не более.
Поэтому было бы интересно подобные вещи опустить на уровень ndk, который полезет не к java-прослойке, а сразу к api OS. Специалистов, которые поломают .so на много порядков меньше, чем школьников, которые могут поменять пару байт в интерпретируемом языке.
Можно запутать обращение к api:
- весь трафик пускаем по доверенному каналу;
- модуль api шифруем и загружаем через кастомный класслоадер;
- ключ от шифрованного блока можно запрятать с помощью стеганографии
либо
- сгенерировать открытый\закрытый ключ, обменяться с сервером по доверенному каналу связи и каждый раз получать новый, зашифрованный открытым ключём блок с модулем api.
Нет.
При желании, программу на любом языке можно защитить, например, засунув в виртуалку.
Единственный вопрос — в скорости (медленности)) работы защиты.
1) Пишем код на C++.
2) Накатываем Denuvo или что там сейчас модно)
3) Пишем на Java симулятор процессора.
4) PROFIT — Java-прослойку ломать бессмысленно (сломается примерно все приложение).
Почему нет, вполне себе существует очень простой вариант проверить текущие сигнатуры (подписи):
Signature[] signatures = getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
for (Signature signature : signatures) {
// checkig
}
Для некоторых проектов этого даже достаточно. Само собой для большей безопасности необходим комплексный подход, и чем он оригинальнее, тем больше человеко-секунд такой подход продержится перед китайским кружком очумелых ручек.
Вообще, если говорить про сертификаты, то логично, чтобы jenkins всего лишь делал request, а сертификат ему делал сторонний CA.
Безопасно подписываем Android сборки из Jenkins