Как избежать обратного инжиниринга файла APK?

764

Я занимаюсь разработкой приложения для обработки платежей для Android и хочу запретить хакеру доступ к любым ресурсам, ресурсам или исходному коду из файла APK .

Если кто-то изменяет расширение .apk на .zip, то он может разархивировать его и легко получить доступ ко всем ресурсам и активам приложения, а с помощью dex2jar и декомпилятора Java они также могут получить доступ к исходному коду. Обратный инжиниринг Android APK-файла очень легко - более подробно см. Вопрос переполнения стека. Обратный инжиниринг из APK-файла в проект .

Я использовал инструмент Proguard, поставляемый с Android SDK. Когда я выполняю обратный инжиниринг APK-файла, созданного с использованием подписанного хранилища ключей и Proguard, я получаю запутанный код.

Однако имена компонентов Android остаются неизменными, а некоторый код, например значения ключей, используемые в приложении, остается неизменным. Согласно документации Proguard, инструмент не может запутать компоненты, указанные в файле Manifest.

Теперь мои вопросы:

  1. Как я могу полностью предотвратить реверс-инжиниринг Android APK? Это возможно?
  2. Как я могу защитить все ресурсы, ресурсы и исходный код приложения, чтобы хакеры никак не могли взломать APK-файл?
  3. Есть ли способ сделать взлом более жестким или даже невозможным? Что еще я могу сделать, чтобы защитить исходный код в моем файле APK?
sachin003
источник
120
Похоже, что вы можете использовать «безопасность по неизвестности», если ваша схема обработки платежей основана на том, что клиент остается в секрете.
PeterJ
43
Рассматривали ли вы написание важных частей кода на C / C ++ и добавили их в виде скомпилированной библиотеки? Их можно разобрать в ассемблерный код, но обратное проектирование большой библиотеки из ассемблера требует очень много времени.
Лев
60
Добро пожаловать в фундаментальный вопрос создания любого цифрового актива. Хакеры могут перейти на уровень машинных инструкций, поэтому, если компьютер может прочитать файл, то его можно взломать, открыть / скопировать, никакое запутывание или DRM не смогут полностью остановить решительного хакера. Если вам нужна безопасность, убедитесь, что закрытые ключи никогда не находятся в источнике, и знайте на этапе проектирования, что только изоляция (удаленное и / или выделенное оборудование) может защитить их.
Кит
16
Обратите внимание, что в зависимости от того, что делает ваше приложение для обработки платежей, может существовать нормативная и правовая политика, которая влияет на ваше приложение и может подвергнуть вас серьезным штрафам: см. Соответствие PCI, начиная с pcicomplianceguide.org/pcifaqs.php#11 .
bloopletech

Ответы:

373

 1. Как мне полностью избежать реверс-инжиниринга Android APK? Это возможно?

AFAIK, нет никакого уловки для полного избежания обратного проектирования.

И также очень хорошо сказано @inazaruk: что бы вы ни делали со своим кодом, потенциальный злоумышленник может изменить его любым способом, который он или она посчитает возможным . Вы в принципе не можете защитить свое приложение от изменения. И любая защита, которую вы вставите, может быть отключена / удалена.

 2. Как я могу защитить все ресурсы приложения, ресурсы и исходный код, чтобы хакеры не могли каким-либо образом взломать APK-файл?

Вы можете делать разные трюки, чтобы сделать хакерство сложнее. Например, используйте обфускацию (если это Java-код). Это обычно значительно замедляет реверс-инжиниринг.

 3. Есть ли способ сделать взлом более жестким или даже невозможным? Что еще я могу сделать, чтобы защитить исходный код в моем файле APK?

Как все говорят, и, как вы, наверное, знаете, нет 100% безопасности. Но Google должен начать с Android, и это ProGuard. Если у вас есть возможность включения общих библиотек , вы можете включить необходимый код в C ++ для проверки размеров файлов, интеграции и т. Д. Если вам нужно добавить внешнюю собственную библиотеку в папку библиотеки APK на каждой сборке, то вы можете использовать ее по предложению ниже.

Поместите библиотеку в собственный путь к библиотеке, который по умолчанию равен "libs" в папке вашего проекта. Если вы создали собственный код для цели armeabi, поместите его в libs / armeabi . Если он был собран с помощью armeabi-v7a, поместите его в libs / armeabi-v7a.

<project>/libs/armeabi/libstuff.so
Бхавеш Патадия
источник
1
Для Платежной транзакции я использовал стандарт ISO 8585, сейчас схема для этого стандарта находится в паре ключ-значение с использованием коллекции Java HashMap, и когда я выполняю обратный инжиниринг на apk, я получаю все схемы. Можно ли избежать получения схемы подвергается реверс-инжинирингу. Может ли ваше последнее предложение об использовании библиотек в этом случае быть полезным? Дой, у вас есть какие-либо ссылки, чтобы я мог получить доступ к общим библиотекам в Android.
sachin003 13.12.12
4
как насчет шифрования ваших строк в коде и расшифровки их во время выполнения? Если вы выполняете расшифровку на удаленном сервере, как и предлагали другие люди, у вас не возникнет проблема, связанная с тем, что ключ дешифрования находится в источниках.
kutschkem
да, шифрование это способ, но он не обязательно не взломан. Если я шифрую строку, чтобы расшифровать их, мне нужен один уникальный идентификатор в коде. и если кто-нибудь сможет декомпилировать его, тогда будет очень легко получить уникальный идентификатор.
Бхавеш Патадия
почему вы добавили отредактированный материал? все регулярно.
Мохаммед Ажаруддин Шейх
@hotveryspicy: да, теперь я удалил пометку «отредактировано» из answer.i отредактировал свой ответ, потому что он хотел узнать больше о том, как полезны библиотеки Share в этом случае.
Бхавеш Патадия
126

AFAIK, вы не можете защитить файлы в каталоге / res больше, чем они защищены прямо сейчас.

Тем не менее, есть шаги, которые вы можете предпринять, чтобы защитить свой исходный код, или, по крайней мере, то, что он делает, если не все.

  1. Используйте такие инструменты, как ProGuard. Это запутывает ваш код и усложняет чтение при декомпиляции, если не невозможно.
  2. Переместите наиболее важные части службы из приложения в веб-службу, скрытую за языком серверной стороны, таким как PHP. Например, если у вас есть алгоритм, который вам понадобился, чтобы написать миллион долларов. Вы, очевидно, не хотите, чтобы люди крали его из вашего приложения. Переместите алгоритм и сделайте так, чтобы он обрабатывал данные на удаленном сервере, и используйте приложение, чтобы просто предоставить ему данные. Или используйте NDK для записи их в файлы .so, которые с меньшей вероятностью будут декомпилированы, чем apks. Я не думаю, что декомпилятор для .so файлов даже существует на данный момент (и даже если бы он существовал, он не был бы так же хорош, как декомпиляторы Java). Кроме того, как упоминалось в комментариях @nikolay, вы должны использовать SSL при взаимодействии между сервером и устройством.
  3. При хранении значений на устройстве не храните их в необработанном формате. Например, если у вас есть игра, и вы храните сумму в игровой валюте, которую пользователь имеет в SharedPreferences. Давайте предположим, что это 10000монеты. Вместо 10000непосредственного сохранения сохраните его, используя алгоритм, подобный ((currency*2)+1)/13. Таким образом, вместо того 10000, чтобы сохранить 1538.53846154в SharedPreferences. Тем не менее, приведенный выше пример не идеален, и вам придется работать, чтобы придумать уравнение, которое не будет терять валюту из-за ошибок округления и т. Д.
  4. Вы можете сделать то же самое для задач на стороне сервера. Для примера давайте возьмем ваше приложение для обработки платежей. Допустим, пользователь должен сделать платеж в размере $200. Вместо того, чтобы отправлять необработанное $200значение на сервер, отправьте серию меньших предопределенных значений, которые в сумме складываются $200. Например, на вашем сервере есть файл или таблица, в которой слова сравниваются со значениями. Так давайте скажем , что Charlieсоответствует к $47и Johnк $3. Таким образом, вместо отправки $200, вы можете отправить Charlieчетыре раза иJohnчетыре раза. На сервере интерпретируйте их значение и сложите их. Это не позволяет хакеру отправлять произвольные значения на ваш сервер, так как они не знают, какое слово соответствует какому значению. В качестве дополнительной меры безопасности вы можете использовать для этого уравнение, аналогичное пункту 3, и менять ключевые слова каждые nнесколько дней.
  5. Наконец, вы можете вставить случайный бесполезный исходный код в свое приложение, чтобы хакер искал иголку в стоге сена. Вставьте случайные классы, содержащие фрагменты из Интернета, или просто функции для вычисления случайных вещей, таких как последовательность Фибоначчи. Убедитесь, что эти классы компилируются, но не используются реальной функциональностью приложения. Добавьте достаточно этих ложных классов, и хакеру будет нелегко найти ваш реальный код.

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

Вы можете только дать отпор, но никогда не выиграть.

Рагхав Соуд
источник
136
Вместо того, чтобы делать трюки со значениями, которые вы отправляете на сервер, используйте SSL и правильно проверяйте сертификат сервера. Безопасность по неизвестности, как правило, плохая идея.
Николай Еленков
48
Вы можете вставить случайный бесполезный исходный код в свое приложение . Это тоже не может помочь. Это будет только раздувать ваше приложение, в то же время усложняя его обслуживание.
Анируд Раманатан
4
Вы также можете подделать использование бесполезного кода и отправить данные на сервер, который их отбросит. Может быть, ложная безопасность, но боль в заднице для потенциального хакера, верно?
Бенуа Даффес
19
Если ваш алгоритм стоит миллион долларов, то просто отсутствие декомпилятора для .soфайлов не означает, что я не могу прочитать сборку :) Большинство из них попадают в одну ловушку, просто запутывая, вместо того, чтобы должным образом защитить себя. Обфускация работает только в том случае, если злоумышленнику не стоит тратить время на ее прохождение, поэтому, если вы создадите что-то на этих методах, вам лучше надеяться, что они не станут популярными, в противном случае вы облажались, потому что внезапно ваша кодовая база не поддерживается, и это нужны огромные изменения.
Фоши
23
Я не понимаю, почему этот ответ имеет такой высокий балл. 3. и 4. для кого-то просто глупо и не будет никакой безопасности вообще.
Матти Вирккунен
117

Ни в одной точке истории вычислений не было возможности предотвратить реинжиниринг программного обеспечения, когда вы предоставляете рабочую копию его злоумышленнику. Кроме того, по всей вероятности, это никогда не будет возможно .

С этим пониманием, есть очевидное решение: не передавайте свои секреты злоумышленнику. Хотя вы не можете защитить содержимое вашего APK, вы можете защитить то, что не распространяете. Как правило, это программное обеспечение на стороне сервера, используемое для таких вещей, как активация, платежи, применение правил и другие сочные фрагменты кода. Вы можете защитить ценные активы, не распределяя их в вашем APK. Вместо этого настройте сервер, который отвечает на запросы от вашего приложения, «использует» ресурсы (что бы это ни значило) и затем отправляет результат обратно в приложение. Если эта модель не подходит для активов, которые вы имеете в виду, вы можете пересмотреть свою стратегию.

Кроме того, если вашей основной целью является предотвращение пиратства приложений : даже не беспокойтесь. Вы уже потратили больше времени и денег на эту проблему, чем любая мера по борьбе с пиратством, которая когда-либо могла бы вас спасти. Возврат инвестиций для решения этой проблемы настолько низок, что не имеет смысла даже думать об этом.

tylerl
источник
21
Первый абзац - лучший ответ. Если ваш злоумышленник контролирует оборудование, он всегда сможет как-то победить ваше программное обеспечение. Все, что действительно необходимо защитить, должно оставаться на оборудовании, которым вы управляете, это так просто. И последний абзац о рентабельности инвестиций тоже на месте.
Даниэль Приден
88

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

Второе правило безопасности приложения. Любое программное обеспечение, которое выходит за физические границы, в которые злоумышленник не может проникнуть, теперь принадлежит вашему злоумышленнику, независимо от того, сколько времени вы потратили на его кодирование.

Третье правило: любая информация, выходящая за те же физические границы, в которую злоумышленник не может проникнуть, теперь принадлежит вашему злоумышленнику, независимо от того, насколько она ценна для вас.

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

В настоящее время большинство компьютеров не используются в этих типах сред; они физически находятся на улице, подключены к Интернету по беспроводному радиоканалу. Короче говоря, они уязвимы, как и их программное обеспечение. Поэтому им нельзя доверять. Есть определенные вещи, которые компьютеры и их программное обеспечение должны знать или делать для того, чтобы быть полезными, но необходимо позаботиться о том, чтобы они никогда не знали или не делали достаточно, чтобы нанести ущерб (по крайней мере, не наносить непоправимый ущерб за пределы этой единственной машины). ).

Вы уже знали все это; Вот почему вы пытаетесь защитить код вашего приложения. Но в этом заключается первая проблема; инструменты запутывания могут сделать код беспорядком для человека, чтобы попытаться копаться, но программа все еще должна работать; это означает, что фактический логический поток приложения и данные, которые оно использует, не подвержены запутыванию. Учитывая немного упорства, злоумышленник может просто не запутывать код, и это даже не требуется в некоторых случаях, когда то, на что он смотрит, не может быть ничем иным, кроме того, что он ищет.

Вместо этого вы должны пытаться гарантировать, что злоумышленник не сможет ничего сделать с вашим кодом, независимо от того, насколько легко ему получить его четкую копию. Это означает, что нет жестко закодированных секретов, потому что эти секреты не являются секретными, как только код покидает здание, в котором вы его разработали.

Эти значения ключей, которые вы жестко запрограммировали, должны быть полностью удалены из исходного кода приложения. Вместо этого они должны быть в одном из трех мест; энергозависимая память на устройстве, которую злоумышленнику труднее (но все же не невозможно) получить автономную копию; постоянно на кластере серверов, к которому вы управляете доступом железным кулаком; или во втором хранилище данных, не связанном с вашим устройством или серверами, например, физической картой или в памяти вашего пользователя (это означает, что он в конечном итоге будет находиться в энергозависимой памяти, но это не должно длиться долго).

Рассмотрим следующую схему. Пользователь вводит свои учетные данные для приложения из памяти в устройство. К сожалению, вы должны верить, что устройство пользователя еще не взломано кейлоггером или трояном; лучшее, что вы можете сделать в этом отношении, - это реализовать многофакторную защиту, запоминая трудно подделываемую информацию об устройствах, которые использовал пользователь (MAC / IP, IMEI и т. д.), и предоставив по крайней мере один дополнительный канал с помощью какую попытку входа в систему на незнакомом устройстве можно проверить.

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

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

Очевидно, что это делает ваше приложение сильно зависимым от доступа в Интернет; клиентское устройство не может выполнять какие-либо из своих основных функций без надлежащего подключения и аутентификации на сервере. Не отличается от Facebook, правда.

Теперь компьютер, который хочет злоумышленник, - это ваш сервер, потому что именно он, а не клиентское приложение / устройство - это то, что может принести ему деньги или причинить другим людям боль от его удовольствия. Это нормально; вы получаете гораздо больше денег, затрачивая деньги и усилия на защиту сервера, чем на защиту всех клиентов. Сервер может находиться за всеми видами брандмауэров и другой электронной безопасности, а также может быть физически защищен за стальным, бетонным, доступом с помощью карточек / штырьков и 24-часовым видеонаблюдением. Ваш злоумышленник должен быть действительно изощренным, чтобы получить любой доступ к серверу напрямую, и вы должны (должны) знать об этом немедленно.

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

Keiths
источник
1
идеальный ответ !! Мне просто понравился твой способ получения данных с сервера с помощью некоторого зашифрованного токена, я думаю, что после этого почти невозможно декодировать.
Дхарам
Я знаю, что уже немного поздно, но как насчет доступа к серверной части? Такие службы, как Microsoft Azure, предоставляют вам что-то вроде этого для доступа к своему серверу: MobileServiceClient mClient = new MobileServiceClient ("MobileServiceUrl", // Замените указанным выше URL-адресом сайта "AppKey", // замените ключ приложения этим) и почти всем, кто имеет доступ к этому, может получить доступ к своему серверу и отредактировать его
edwinj
@edwinj - Нет проблем в информатике, которые не могут быть решены с помощью другого уровня косвенности. Ваш фрагмент дает основную идею доступа к службе мобильного клиента Azure; он обеспечивает базовый уровень защиты от «обходных путей» входной двери Microsoft. Вы можете, в свою очередь, добавить дополнительные уровни, такие как требование сеансового ключа (в основном, то, что является зашифрованным токеном) к любому вызову службы, и чтобы получить этот ключ, они должны сначала пройти аутентификацию с комбинацией знаний учетных данных и схемы шифрования.
KeithS
1
Один из лучших ответов.
debo.stackoverflow
64

 1. Как мне полностью избежать реверс-инжиниринга Android APK? Это возможно?

Это невозможно

 2. Как я могу защитить все ресурсы приложения, ресурсы и исходный код, чтобы хакеры не могли каким-либо образом взломать APK-файл?

Когда кто-то меняет расширение .apk на .zip, то после разархивирования кто-то может легко получить все ресурсы (кроме Manifest.xml ), но с помощью APKtool можно также получить реальное содержимое файла манифеста. Опять нет.

 3. Есть ли способ сделать взлом более жестким или даже невозможным? Что еще я могу сделать, чтобы защитить исходный код в моем файле APK?

Опять же нет, но вы можете предотвратить до некоторого уровня, то есть

  • Загрузите ресурс из Интернета и выполните некоторый процесс шифрования
  • Используйте предварительно скомпилированную нативную библиотеку (C, C ++, JNI, NDK)
  • Всегда выполняйте хеширование ( ключи MD5 / SHA или любая другая логика)

Даже при том Smali, что люди могут играть с вашим кодом. В общем, это НЕ ВОЗМОЖНО.

Мохаммед Ажаруддин Шейх
источник
7
@TrevorBoydSmith: шифрование мало помогает, когда ОС имеет открытый исходный код и может быть запущена. Системе нужен ключ для расшифровки APK и запуска вещей. И если у системы есть ключ, и у меня есть беспрепятственный доступ к системе, то я знаю, где найти ключ, и могу получить к нему. Значит, у меня тоже есть ключ .
Чао
4
@TrevorBoydSmith: Это часть «как сделать», которая убивает всю идею. Там просто нет способа выполнить зашифрованный код напрямую; в какой-то момент расшифрованный код должен быть доступен. Это означает, что (1) должен быть ключ (к которому у меня, как root, вероятно, есть доступ), и (2) я мог бы даже найти чистую копию в ОЗУ и просто не беспокоиться о шифровании в любом случае.
cHao
3
@TrevorBoydSmith: Проблема в том, что в этом случае вы просто не можете поднять стоимость достаточно, чтобы сделать ее не стоящей. Мы не говорим о грубых ключах здесь; мы говорим о том, чтобы уже иметь их - у ОС должны быть ключи, и у нас есть ОС. Единственный способ исправить это - сделать ОС недоступной для загрузки. Удачи с этим; даже Apple не может справиться с этим. :)
cHao
3
@TrevorBoydSmith: я не думаю, что повышение стоимости вообще невозможно. Я думаю (и говорю), в частности , что ваше предложение невозможно - потому что оно есть . MATLAB не Android, и имеет определенные свободы, которых нет у Android. В частности, у него есть запутывание на его стороне; скрыть ключ шифрования намного сложнее. Android не может этого сделать. Любой, у кого есть исходный код, будет знать, где скрываются ключи, и будет иметь инструмент для их извлечения в течение 10 минут после объявления функции. Это не просто возможно сделать; это совершенно тривиально .
cHao
6
@TrevorBoydSmith: я ничего не настаивал. Я настаиваю на том, что статичность, изменение, движение и т. Д. Не имеют значения . В ОС с открытым исходным кодом одно только шифрование не может защитить код от кого-либо, кто может взломать его. Поскольку я могу прочитать код, который будет выполнять расшифровку, независимо от того, как ключ получен, использован и / или сохранен, я могу видеть, как вы это сделали, и воспроизвести его - даже легче, чем я мог бы перевернуть какой-то суперсекрет код приложения.
Цао
37

100% -ное предотвращение реверс-инжиниринга Android APK невозможно, но вы можете использовать эти способы, чтобы избежать извлечения дополнительных данных, таких как исходный код, ресурсы из вашего APK и ресурсы:

  1. Используйте ProGuard, чтобы запутать код приложения

  2. Используйте NDK, используя C и C ++, чтобы поместить ядро ​​приложения и защитить часть кода в .soфайлы

  3. Чтобы защитить ресурсы, не включайте все важные ресурсы в папку ресурсов с APK. Загрузите эти ресурсы во время первого запуска приложения.

ρяσѕρєя K
источник
7
Третий действительно облегчает работу злоумышленников. Обнюхивать сетевые коммуникации проще, чем реверс-инжиниринг
2015 года
Чтобы решить проблему третьего, можно зашифровать загруженный контент и / или использовать зашифрованное соединение (например, SSL / TLS)
Страдивари
1
Шифрование соединения защищает от людей, которые прослушивают или изменяют трафик. В случае, если пользователь сам является вредоносным (то есть у него есть ваш apk, и он пытается его взломать), он все равно получит контент, используя ваше приложение, извлекая ресурсы как пользователь root; но да, это помогает против простых атак нюхают.
Кевин Ли
Кроме того: 4) используйте dexguard для большей запутанности, но это платно 5) используйте файл OBB для загрузки ресурсов во время загрузки приложения, это также поможет уменьшить размер приложения
Ашок Кумар
35

Разработчики могут предпринять следующие шаги, чтобы предотвратить кражу APK,

  • самый простой способ - это использовать такие инструменты, как ProGuardзапутывание их кода, но до сих пор было довольно сложно полностью запретить кому-либо декомпилировать приложение.

  • Также я слышал об инструменте HoseDex2Jar . Он останавливается Dex2Jarна вставке безвредного кода в Android APK, который сбивает с толку, отключает Dex2Jarи защищает код от декомпиляции. Это может как-то помешать хакерам декомпилировать APK в читаемый код Java.

  • Используйте некоторое приложение на стороне сервера для связи с приложением только тогда, когда это необходимо. Это может помочь предотвратить важные данные.

Вообще, вы не можете полностью защитить свой код от потенциальных хакеров. Каким-то образом вы могли бы усложнить и немного расстроить их задачу декомпиляции вашего кода. Один из наиболее эффективных способов - это писать в нативном коде (C / C ++) и хранить его как скомпилированные библиотеки.

Сахил Махаджан МДж
источник
3
HoseDex2Jar почти бесполезен. Это только «смущает» dex2jar и может быть легко заблокировано. smali / apktool и т. д. отлично работают с «закрытыми» APK.
Николай Еленков
@NikolayElenkov Знаете ли вы, как работает HoseDex2Jar? То, что они использовали, чтобы избежать или запутать dex2jar. Потому что я не могу загрузить свой файл apk в Интернет, чтобы использовать HoseDex2Jar. Если я смогу сделать что-то вроде HoseDex2Jar, чтобы запутать dex2jar, тогда будет сложно взломать с помощью инструмента dex2jar.
sachin003 13.12.12
1
Возможно, вы неправильно поняли мою мысль: HoseDex2Jar перепаковывает ваш APK, так что популярный инструмент dex2jar не может (из коробки) изменить его. Однако другие инструменты могут, и это очень легко победить вообще. Нет смысла его использовать. Никто не упомянул вещь Dexguard I (автора ProGuard; не бесплатную), но это работа, на которую смотрят. Это делает нечто большее, чем «обычное» запутывание.
Николай Еленков
C ++ никогда не может быть полностью изменен? это сложно, но возможно. и есть инструменты, которые помогут вам в этом, например hex-rays.com/products/decompiler/index.shtml (да, у них есть версия ARM. Не так-то легко получить это).
ДКЗМ
да, @VikartiAnatra: я также упомянул, как- то, вы могли бы сделать это трудно
Сахил Махаджан Mj
24

Вот несколько способов, которые вы можете попробовать:

  1. Используйте запутывание и такие инструменты, как ProGuard .
  2. Зашифруйте некоторую часть источника и данных.
  3. Используйте проприетарную встроенную контрольную сумму в приложении для обнаружения взлома.
  4. Введите код, чтобы избежать загрузки в отладчике, то есть дайте приложению возможность обнаруживать отладчик и выходить из него / убивать его.
  5. Отделяйте аутентификацию как онлайн-сервис.
  6. Используйте разнообразие приложений
  7. Используйте технику отпечатков пальцев, например, для аппаратных сигнатур устройств из другой подсистемы перед аутентификацией устройства.
Shan
источник
23

 1. Как мне полностью избежать реверс-инжиниринга Android APK? Это возможно?

Невозможно

 2. Как я могу защитить все ресурсы приложения, ресурсы и исходный код, чтобы хакеры не могли каким-либо образом взломать APK-файл?

Невозможно

 3. Есть ли способ сделать взлом более жестким или даже невозможным? Что еще я могу сделать, чтобы защитить исходный код в моем файле APK?

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

Janot
источник
22

 1. Как мне полностью избежать реверс-инжиниринга Android APK? Это возможно?

Это невозможно

 2. Как я могу защитить все ресурсы приложения, ресурсы и исходный код, чтобы хакеры не могли каким-либо образом взломать APK-файл?

Разработчики могут предпринять такие шаги, как использование таких инструментов, как ProGuard, для запутывания своего кода, но до сих пор было довольно сложно полностью предотвратить компиляцию приложения.

Это действительно отличный инструмент, и он может увеличить сложность «перевернуть» ваш код, в то же время уменьшая его площадь.

Интегрированная поддержка ProGuard: ProGuard теперь поставляется с SDK Tools. Теперь разработчики могут запутывать свой код как интегрированную часть сборки релиза.

 3. Есть ли способ сделать взлом более жестким или даже невозможным? Что еще я могу сделать, чтобы защитить исходный код в моем файле APK?

Во время исследования я узнал о HoseDex2Jar . Этот инструмент защитит ваш код от декомпиляции, но, кажется, невозможно полностью защитить ваш код.

Некоторые полезные ссылки вы можете ссылаться на них.

Робин Гуд
источник
21

Основной вопрос здесь заключается в том, можно ли декомпилировать файлы dex, и ответ на них может быть «своего рода». Есть такие дизассемблеры, как dedexer и smali .

ProGuard, правильно настроенный, запутает ваш код. DexGuard, который является коммерческой расширенной версией ProGuard, может помочь немного больше. Тем не менее, ваш код все еще может быть преобразован в smali, и разработчики с опытом обратного проектирования смогут выяснить, что вы делаете из smali.

Может быть, выбрать хорошую лицензию и обеспечить соблюдение закона в лучшем виде.

Абхишек Саббарвал
источник
4
В качестве дополнительного примечания (отказ от ответственности: IANAL) - лицензия не будет защищать приложение под всеми юрисдикциями при любых обстоятельствах (например, в некоторых странах Европы разрешена разборка для повышения совместимости).
Мацей Пехотка
12

Ваш клиент должен нанять кого-то, кто знает, что он делает, кто может принимать правильные решения и может наставлять вас.

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

Мое обоснование этого:

Поскольку ваш домен обрабатывает платежи, можно предположить, что PCI DSS и / или PA DSS (и потенциальный закон штата / федеральный закон) будут важны для вашего бизнеса - чтобы соответствовать требованиям, вы должны показать, что вы в безопасности. Чтобы быть неуверенным, выясните (через тестирование), что вы не защищены, затем исправьте, повторно протестируйте и так далее, пока безопасность не будет проверена на подходящем уровне = дорогой, медленный, рискованный путь к успеху. Чтобы поступить правильно, тщательно продумайте все заранее, привлеките опытный талант к работе, развивайтесь безопасным образом, затем тестируйте, исправляйте (меньше) и так далее (меньше), пока безопасность не будет проверена на подходящем уровне = недорого, быстро, путь к успеху с низким уровнем риска.

straya
источник
8

Как человек, который много работал на платежных платформах, включая одно мобильное платежное приложение (MyCheck), я бы сказал, что вам нужно делегировать это поведение на сервер, не нужно хранить имя пользователя или пароль для обработчика платежей (какой бы он ни был) или это жестко закодировано в мобильном приложении, это последнее, что вы хотите, потому что источник может быть понят, даже если вы запутываете код.

Кроме того, вам не следует хранить кредитные карты или платежные токены в приложении, все должно быть опять-таки делегировано на созданную вами службу, это также позволит вам в дальнейшем, легче соответствовать PCI, и компании, выпустившие кредитные карты, выиграли не дышите на шею (как они сделали для нас).

Итай Саги
источник
7

Другие ответы здесь верны. Я просто хочу предоставить другой вариант.

Для определенных функций, которые вы считаете важными, вы можете разместить в своем приложении элемент управления WebView . Функциональность будет затем реализована на вашем веб-сервере. Это будет выглядеть так, как будто оно работает в вашем приложении.

Сарел Бота
источник
@Sarel Botha да, для экранов IMP я уже использовал веб-просмотр, и да, это также один из способов обеспечения безопасности, я принимаю ваш ответ.
sachin003
7

Если мы хотим сделать реверс-инжиниринг (почти) невозможным, мы можем поместить приложение в микросхему с высокой степенью защиты от несанкционированного доступа, которая выполняет все важные элементы внутри себя и взаимодействует с некоторым протоколом, чтобы сделать возможным управление GUI на хосте. Даже устойчивые к взлому чипы не являются на 100% стойкими к трещинам; они просто устанавливают планку намного выше, чем программные методы. Конечно, это неудобно: приложению требуется небольшая USB-бородавка, которая удерживает чип для вставки в устройство.

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

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

Если цель состоит в том, чтобы предотвратить клонирование, за исключением этого защищенного от взлома чипа, вы ничего не сможете сделать, чтобы защитить программу от повторного проектирования и копирования, чтобы кто-то включил совместимый метод оплаты в свое собственное приложение, предоставляя подняться до «неавторизованных клиентов». Есть способы усложнить разработку неавторизованных клиентов. Можно было бы создать контрольные суммы на основе снимков полного состояния программы: все переменные состояния для всего. GUI, логика, что угодно. Программа-клон не будет иметь точно такое же внутреннее состояние. Несомненно, это конечный автомат, который имеет аналогичные внешне видимые переходы состояний (что можно наблюдать по входам и выходам), но едва ли имеет одинаковое внутреннее состояние. Приложение сервера может опросить программу: каково ваше подробное состояние? (т.е. дайте мне контрольную сумму для всех ваших внутренних переменных состояния). Это можно сравнить с фиктивным клиентским кодом, который выполняется на сервере параллельно, проходя через переходы подлинного состояния. Сторонний клон должен будет повторить все соответствующие изменения состояния подлинной программы, чтобы дать правильные ответы, которые будут препятствовать ее развитию.

Kaz
источник
7

Договорились с @Muhammad Saqib здесь: https://stackoverflow.com/a/46183706/2496464

И @Mumair дают хорошие стартовые шаги: https://stackoverflow.com/a/35411378/474330

Всегда безопасно предположить, что все, что вы распространяете на устройстве вашего пользователя, принадлежит пользователю. Легко и просто. Возможно, вы сможете использовать новейшие инструменты и процедуры для шифрования вашей интеллектуальной собственности, но нет способа помешать определенному человеку «изучить» вашу систему. И даже если текущая технология может затруднить получение нежелательного доступа, завтра может быть легкий путь или даже просто следующий час!

Таким образом, здесь приходит уравнение:

When it comes to money, we always assume that client is untrusted.

Даже в такой простой, как игровая экономика. (Особенно в играх! Там больше «искушенных» пользователей, и лазейки расползаются за секунды!)

Как мы можем оставаться в безопасности?

Большинство, если не все, наших систем обработки ключей (и, конечно, базы данных) расположены на стороне сервера. А между клиентом и сервером лежит зашифрованная связь, проверки и т. Д. Это идея тонкого клиента.

Zennichimaro
источник
4

APK схема подписи v2 в Android N

Класс PackageManager теперь поддерживает проверку приложений с использованием схемы подписи APK v2. Схема подписи APK v2 - это схема подписи всего файла, которая значительно повышает скорость проверки и усиливает гарантии целостности, обнаруживая любые несанкционированные изменения в файлах APK.

Для обеспечения обратной совместимости APK должен быть подписан схемой подписи v1 (схема подписи JAR), прежде чем подписываться схемой подписи v2. При использовании схемы подписи v2 проверка завершается неудачно, если вы подписываете APK дополнительным сертификатом после подписания по схеме v2.

Поддержка схемы подписи APK v2 будет доступна позже в N Developer Preview.

http://developer.android.com/preview/api-overview.html#apk_signature_v2

thiagolr
источник
2
Apk подпись v2 только предотвращает подделку ресурсов, но не усложняет реверс-инжиниринг ...
Louis CAD
1
Кроме того, вы можете просто удалить подпись и переподписать ее. Подпись v2 - это просто блок данных в файле APK.
Роберт
4

Нет никакого способа полностью избежать реверс-инжиниринга APK. Для защиты ресурсов приложения, ресурсов вы можете использовать шифрование.

  • Шифрование усложнит использование без расшифровки. Выбор надежного алгоритма шифрования усложнит взлом.
  • Добавление некоторого поддельного кода в вашу основную логику, чтобы усложнить взлом.
  • Если вы можете написать свою критическую логику на любом родном языке, и это, безусловно, затруднит декомпиляцию.
  • Использование любых сторонних систем безопасности, таких как Quixxi
неизменный
источник
3

В принципе это невозможно. Это никогда не будет возможно. Однако есть надежда. Вы можете использовать обфускатор, чтобы сделать это так, что некоторые общие атаки намного сложнее осуществить, включая такие вещи, как:

  1. Переименование методов / классов (поэтому в декомпиляторе вы получаете такие типы, как a.a)
  2. Запутывание потока управления (поэтому в декомпиляторе код очень трудно читать)
  3. Шифрование строк и, возможно, ресурсов

Я уверен, что есть и другие, но это основные. Я работаю в компании под названием PreEmptive Solutions на обфускаторе .NET . У них также есть Java-обфускатор, который работает для Android, который называется DashO .

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

В противном случае, ваш единственный выбор - сделать так, чтобы ваше Android-приложение просто передавалось на сервер, на котором размещена вся реальная логика вашего приложения. У этого есть своя доля проблем, потому что это означает, что пользователи должны быть подключены к Интернету, чтобы использовать ваше приложение.

Кроме того, не только Android имеет эту проблему. Это проблема в каждом магазине приложений. Это просто вопрос того, насколько сложно получить доступ к файлу пакета (например, я не верю, что это очень легко на iPhone, но все же возможно).

Earlz
источник
К сожалению, если взломать клиент (приложение), они смогут увидеть формат связи и создать свой собственный сервер :(
Jocky Doe
3

Невозможно полностью избежать RE, но, сделав их внутренне более сложными, вы помешаете злоумышленникам увидеть четкую работу приложения, что может уменьшить количество векторов атак.

Если приложение обрабатывает высокочувствительные данные, существуют различные методы, которые могут усложнить обратный инжиниринг вашего кода. Одним из методов является использование C / C ++ для ограничения легких манипуляций во время выполнения злоумышленником. Существует множество библиотек C и C ++, которые очень развиты и легко интегрируются с Android-предложениями JNI. Злоумышленник должен сначала обойти ограничения отладки, чтобы атаковать приложение на низком уровне. Это добавляет дополнительную сложность атаке. Приложения Android должны иметь android: debuggable = ”false”, установленный в манифесте приложения, чтобы предотвратить простую манипуляцию во время выполнения злоумышленником или вредоносным ПО.

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

Оптимизации - чтобы скрыть сложные математические вычисления и другие типы сложной логики, использование оптимизаций компилятора может помочь запутать объектный код, так что злоумышленник не сможет его легко разобрать, что затруднит понимание злоумышленником конкретного кода. В Android этого проще достичь, используя встроенные библиотеки с NDK. Кроме того, использование Обфускатора LLVM или любого SDK защитника обеспечит лучшую запутывание машинного кода.

Удаление двоичных файлов - удаление собственных двоичных файлов - эффективный способ увеличить количество времени и уровень навыков, требуемых от злоумышленника, чтобы просмотреть структуру функций низкого уровня вашего приложения. При удалении двоичного файла таблица символов двоичного кода удаляется, так что злоумышленник не может легко отладить или перепроектировать приложение. Вы можете ссылаться на методы, используемые в системах GNU / Linux, такие как sstriping или использование UPX.

И, наконец, вы должны быть в курсе обфускации и таких инструментов, как ProGuard.

Санкет прабху
источник
3

Если ваше приложение настолько чувствительно, то вы должны рассмотреть часть обработки платежей на стороне сервера. Попробуйте изменить свои алгоритмы обработки платежей. Используйте приложение Android только для сбора и отображения информации о пользователе (например, об остатке на счете), а не для обработки платежей в кодах Java. Отправьте эту задачу на сервер, используя безопасный протокол SSL с зашифрованными параметрами. Создайте полностью зашифрованный и безопасный API для связи с вашим сервером.

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

Мухаммед Сакиб
источник
2

Разве чипы TPM (Trusted Platform Module) не предназначены для управления защищенным кодом для вас? Они становятся обычным явлением на ПК (особенно на Apple) и, возможно, уже существуют в современных чипах для смартфонов. К сожалению, пока нет API для ОС, чтобы использовать его. Надеюсь, Android добавит поддержку этого дня. Это также ключ к чистому контенту DRM (над которым Google работает для WebM).

robUx4
источник
2

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

  • Поместите свою основную логику (алгоритмы) в сторону сервера.
  • Общаться с сервером и клиентом; убедитесь, что связь между ч / б сервером и клиентом защищена с помощью SSL или HTTPS; или использовать другие методы генерации пар ключей (ECC, RSA). Убедитесь, что конфиденциальная информация остается зашифрованной сквозной.
  • Используйте сеансы и истекайте их через определенный промежуток времени.
  • Шифруйте ресурсы и извлекайте их с сервера по требованию.
  • Или вы можете создать гибридное приложение, которое будет обращаться к системе через webviewзащищенный ресурс + код на сервере.

Множественные подходы; это очевидно, что вы должны жертвовать производительностью и безопасностью

mumair
источник
2

Я вижу этот хороший ответ в этой теме. В дополнение к этому вы можете использовать Facebook redexдля оптимизации кода. Redex работает на .dexуровне, где Proguard работает как .classуровень.

Asthme
источник
2

100% безопасность исходного кода и ресурсов в Android невозможна. Но вы можете сделать немного сложным для реинженера. Вы можете найти более подробную информацию об этом в следующих ссылках:

Посетите раздел Безопасное сохранение постоянных значений и https://www.agicent.com/blog/mobile-app-security-best-practices/

Раджив Ранджан
источник
1

Как я могу защитить все ресурсы, ресурсы и исходный код приложения, чтобы хакеры никак не могли взломать APK-файл?

Файл APK защищен алгоритмом SHA-1 . Вы можете увидеть некоторые файлы в папке META-INF на APK. Если вы извлечете какой-либо файл APK и измените его содержимое, а затем снова заархивируете его, и при запуске этого нового файла APK на компьютере Android он не будет работать, поскольку хэши SHA-1 никогда не будут совпадать.

Джигар Патель
источник
Это правда; но тривиально подать в отставку APK (с другим сертификатом) и все снова заработает. Можно проверить, какая подпись использовалась для подписания APK изнутри самого приложения, и вывести ошибку при изменении сертификата, но редактировать этот код из приложения немного проще.
Дэвид Дан
Это может помешать устройству Android запускать измененный код, но вы все равно можете легко извлечь соответствующий код и написать новый код на ПК, который делает то, что вы хотите.
Сарел Бота
1

Хотя я согласен, что нет 100% -го решения, которое защитит ваш код, v3 HoseDex2Jar теперь работает, если вы хотите попробовать.

Годфри Нолан
источник
1

Инструмент: использование Proguard в вашем приложении может быть ограничено для обратного проектирования вашего приложения

Маянк Нема
источник
1

Я знал, что некоторые банковские приложения используют DexGuard, который обеспечивает запутывание, а также шифрование классов, строк, ресурсов, файлов ресурсов и собственных библиотек.

https://www.guardsquare.com/en/products/dexguard

охотник
источник