Как сделать приложение "Android unlocker" более безопасным от взломщиков?

Для платной версии моего приложения я выбираю маршрут приложения для разблокировки, потому что его легко реализовать, позволяет индивидуальную статистику в консоли разработчика, но в основном потому, что мне не нужно поддерживать 2 базы кода (одну для бесплатной версии и другой для платной версии). Даже если бы я использовал CVS (а я это делаю), было бы головной болью продолжать объединять функции и исправлять ошибки. Приложение для разблокировки гораздо проще реализовать в целом ...

Но у этого есть серьезный недостаток: очень легко обойти проверку безопасности; если я что-то здесь не упускаю.

Независимо от того, что я делаю, такая реализация всегда приводит к простому if, например:

if(Program.isPremiumVersion()) {
    // Remove ads...
}

Метод isPremiumVersion() отвечает за всю работу по проверке установки платного приложения разблокировки, если сертификаты совпадают и все такое. Да, приложение для разблокировки защищено LVL (хотя я читал несколько статей, в которых упоминалось, насколько небезопасен LVL, но сейчас дело не в этом). Но в конце концов, каким бы сложным ни был код внутри isPremiumVersion(), он всегда приводит к возврату значения true или false.

Переопределение такой функции безопасности - это всего лишь вопрос обратной инженерии кода, чтобы он всегда возвращал true. Это не? Как мы можем защитить от этого наши приложения для Android? И да, код запутан с помощью ProGuard. Тем не менее, это не должно быть слишком сложно для достаточно опытного человека.

Обратите внимание, я не пытаюсь бороться с взломщиками, мы просто не можем победить. Я не собираюсь терять сон из-за этого, тратя бесчисленные часы на «идеальное решение». Я просто ищу способ сделать его более безопасным. Это кажется таким простым, по крайней мере, теоретически. Я ошибаюсь?

Есть идеи по повышению безопасности такой функции?


person rfgamaral    schedule 10.05.2012    source источник
comment
Просто используйте эквивалент java, если IFDEF, или сделайте isPremiumVersion константой и положитесь на компилятор, оптимизирующий его.   -  person CodesInChaos    schedule 10.05.2012
comment
Это не решение вашей проблемы с взломом, но проблема дублирования кода должна быть смягчена, если вы используете проект библиотеки Android (не запускаемый). Это более или менее общая библиотека классов / макетов / чертежей, которые можно вызывать из запускаемых приложений. Создайте две версии своего приложения (бесплатную и платную) и создайте библиотеку со всем общим кодом. В ваших бесплатных / платных версиях вы можете переопределить макеты / строки / чертежи / и т. Д., Если они должны отличаться от того, что находится в общей библиотеке. Должен соответствовать вашим потребностям: developer.android.com/guide/developing/projects /   -  person Gophermofur    schedule 10.05.2012
comment
@Gophermofur Да, я знаю о библиотечном подходе, но мне он не нравится, и он связан с другими проблемами. Не нужно углубляться, это не имеет отношения к вопросу. Давно решил, что иду методом анлокера и там нет обсуждения. Я ценю ваше предложение :)   -  person rfgamaral    schedule 11.05.2012
comment
Вы можете предотвратить это только из сценария Kiddo. Создайте веб-сервис и спрячьте за ним премиальную функциональность.   -  person Lukasz Madon    schedule 11.05.2012
comment
@lukas Разве это не приведет к той же проблеме? Я имею в виду, что бы я ни делал, проверка сервера всегда будет возвращать лицензию или не лицензию, а затем я либо включаю, либо не включаю премиум-функции. В конце концов все равно ... Или я чего-то упускаю?   -  person rfgamaral    schedule 16.05.2012
comment
@Ricardo нет, это не приведет к тому, что взломщик может заблокировать вашу службу и подделать ее. Например, Adobe Photoshop проверяет серверы на наличие лицензии. Кряк для него добавляет IP-адреса в файл хоста Windows, чтобы заблокировать его.   -  person Lukasz Madon    schedule 16.05.2012
comment
@lukas Я не понимаю ... Я не понимаю, чем безопаснее проверка сервера ...   -  person rfgamaral    schedule 17.05.2012


Ответы (2)


Нет простого способа обойти это.

Вы должны попытаться это замаскировать. Вот несколько советов:

Совет 1. Возврат логического значения слишком очевиден. Попробуйте вернуть значение (например, int). Затем используйте сравнение, чтобы увидеть, является ли это допустимым известным возвращаемым значением.

Например: получите md5 строки, которая содержит что-то, из чего вы можете определить, является ли это премиальным или нет. Скажем, у вас есть статическая финальная строка для каждого приложения. Может быть, md5 одного начинается с 9, а другой начинается с 1. В этом случае вычислите md5 и посмотрите, больше ли оно случайного числа, которое, как вы знаете, находится между двумя другими числами. Скажем, md5 премиум-класса - 987, а md5 бесплатного - 123. Вы можете вычислить md5 и сравнить его с 456.

Совет 2. Еще лучше: продублируйте код и каждый раз используйте разные значения (вместо 456)! Надеюсь, это затруднит декодирование запутанного кода.

Я знаю, что все эти проверки в конечном итоге будут сопоставлены с логическим значением (if(1 > 2) будет оцениваться как if(true)), но перепроектировать ваше приложение будет сложнее.

Совет 3: не проверяйте isPremium в самых очевидных местах. Например, не выполняйте проверку при запуске приложения, поскольку это наиболее очевидное место для ее выполнения. Может быть сложно избежать определенных очевидных пятен, если вы хотите иметь условную логику в зависимости от версии приложения, но постарайтесь здесь!

Совет 4: создайте и запутайте свое приложение. Запустите инструменты обратного проектирования для вашего apk. Прочтите и посмотрите, как это выглядит.

Наконец, смотрите эту презентацию Google IO каждый день за завтраком: Уклонение от пиратов и остановка вампиров с помощью библиотеки проверки лицензий, выставления счетов в приложениях и App Engine

[ИЗМЕНИТЬ - еще несколько советов]

Совет 6: попробуйте использовать код, который вы используете, для проверки в абсолютно допустимых местах. Это может замаскировать то, что вы на самом деле делаете. Это может включать вызов кода, чтобы проверить, какая это версия приложения, но ничего с ним не делать. Или, в моем предыдущем примере, сравниваю md5 с 012 или 999, просто для того, чтобы уменьшить реальное использование этих переменных.

Совет 7: вместо того, чтобы полагаться на одну строку, вы можете подумать о создании строки во время выполнения. Финалы и статика тоже могут привлечь слишком много внимания, так что их избегание может быть хорошим делом.

Совет 8: никогда не используйте код LVL, как указано в руководствах Google. Измените это. Много!

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

person Pedro Loureiro    schedule 10.05.2012
comment
Думаю, мой код должен стать беспорядочным ... Ненавижу беспорядочный код, это моя проблема :( - person rfgamaral; 11.05.2012

Возможно, вы уже видели это, но вот код для реализации того, о чем вы говорите:

http://groups.google.com/group/android-developers/browse_thread/thread/4ad3d67f735f16d7/948b4f9eee2490a3?pli=1

Он проверяет, совпадают ли подписи в бесплатном приложении и приложении для разблокировки. Таким образом, кто-то не может искусственно создать приложение с правильным именем, поскольку подписи будут другими. Тем не менее, люди все еще могут сорвать apk с телефона и распространять его. Единственный способ бороться с этим - использовать какую-то аутентификацию сервера, но это увеличивает стоимость и сложность.

person James Cross    schedule 10.05.2012