Защита Android приложений от реверс-инжиниринга — ProGuard

    ProGuard — это утилита для сокращения, оптимизации и обфускации кода. На выходе вы получаете *.apk меньшего размера, который намного сложнее реинжинирить. На developer.android.com написано, что ProGuard внедрен в систему сборки Android приложений. Однако, я заметил, что эта утилита появилась в моей папке с SDK только после обновления до r9.

    ProGuard запускается только когда вы запускаете сборку в «release» режиме. Для тех, кто не знает как это сделать (в Eclipse): правой кнопкой нужно вызвать контекстное меню проекта, затем Export -> Android -> Export Android Application. Конфиг-файл появляется автоматически, при создании проекта, в его корне, под именем proguard.cfg. Если у вас он не появился, проверьте наличие утилитки в папке с вашим SDK.
    Далее, чтобы включить сам обфускатор перед сборкой, нужно добавить в файл /root_of_your_project/default.properties строку вида proguard.config=/path/proguard.cfg, где path — путь к файлу. Таким образом можно таскать один конфиг для кучи проектов.

    Итак, после «release» сборки ProGuard немножко намусорит в одной из следующих папок:
    • /root_of_your_project/proguard — при использовании Eclipse
    • /root_of_your_project/bin/proguard — при использовании Ant

    Создаются файлы:
    • dump.txt — описывает внутренности всех класс-файлов в вашем *.apk
    • mapping.txt — представляет отображение между исходными и обфусцированными классами, полями классов, методами.
    • seeds.txt — список необфусцированных классов
    • usage.txt — код, вытащенный из *.apk


    Также на developer.android.com предупреждают о том, что при обработке кода ProGuard'ом могут возникнуть осложнения в виде ClassNotFoundException. Чтобы избежать подобного, можно добавить строку в конфиг:
    -keep public class <MyClass>
    

    Подробнее о настройке конфига можно почитать здесь. Собственно, там же можно найти пару сэмплов.

    Кроме этого, в папке /path_to_your_SDK/tools/proguard/bin лежит некий скрипт под названием retrace.bat (для Linux/Mac OS X — retrace.sh). Он позволяет преобразовать обфусцированное в читаемое, используя вышеозначенный mapping.txt.
    Синтаксис использования:
    retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]
    

    Например:
    retrace.bat -verbose mapping.txt obfuscated_trace.txt
    

    Также скрипт воспринимает стандартный ручной ввод текста, в случае если вам лень писать путь к <stacktrace_file>.
    Если у вас при первом же запуске в «release» режиме с ProGuard'ом (с дефолтными настройками) вылетает ошибка с кодом 1, то скорее всего в пути к вашему SDK есть пробелы — удалите их, и все заработает.

    Приятной вам обфускации!
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 26

      +1
      Очень обрадовало появление такого функционала в SDK, но пока не могу испытать его испытать. И в связи с этим появилось два вопроса:
      — На основании чего может быть создан файл seeds.txt
      — Как будет выглядеть обфусцированный код после реверсинга?
        0
        по поводу второго пункта — сам нашел, проглядел наличие примеров
          0
          >На основании чего может быть создан файл seeds.txt
          — Хороший вопрос, подозреваю, что сюда попадают методы суперклассов типа onCreate(), onReceive(), которые Вы переопределяете.
          Точно не знаю, на developer.android.com об этом ни слова.
            +1
            seeds создается на базе списка классов, к которым вы и система обращаетесь по имени (рефлексия и т.д.) и на базе списка методов, которые привязаны к вызовам изнутри системы, к примеру для андроида:
            # вызываются путем объявления в манифесте
            -keep public class * extends android.app.Activity 
            -keep public class * extends android.app.Application 
            -keep public class * extends android.app.Service 
            -keep public class * extends android.content.BroadcastReceiver 
            -keep public class * extends android.content.ContentProvider 
             
            # динамическое поведение
            -keep public class * extends View { 
            public <init>(android.content.Context); 
            public <init>(android.content.Context, android.util.AttributeSet); 
            public <init>(android.content.Context, android.util.AttributeSet, int); 
            public void set*(...); 
            }
             
            # Also keep - Enumerations. Keep the special static methods that are required in enumeration classes.
            -keepclassmembers enum  * {
                public static **[] values();
                public static ** valueOf(java.lang.String);
            } и т.д.
            
            –4
            как то вяло очень и бестолково. оригинал сего тут:
            ProGuard and Android.
              +1
              За статью спасибо — тему как-то подзабыли :)

              Для своего проекта прикричивали его в build-impl для netBeans.
              Важно помнить, что при использовании функционала PtoGuard возникает ряд важных ограничений. Например, при использовании ACRA(crash-репорты), заметно ограничивается уровень обфускации. Надо много чего сохранять. Эта же проблема и с обычной java, естественно, есть.

              И эти ограничения могут хорошо подпортить жизнь при отладке :)
                +1
                нет смысла уменьшать уровень обфускации с целью сохранения читабельности crash репортов, достаточно для каждой выпущенно версии сохранять mapping и потом восстанавливать код уже при исправлении багов. версия приложения приходит к креш-репорте. и глупо по этому параметру снижать уровень обфускации.

                отладка на обфусцированно коде — это при реверс-инжиринге? или вы это такая новая техника отладки?
                  +1
                  Говорим о разных вещах.
                  Начну с конца :)
                  — Если приложение работало без ProGuard — оно может с ним не работать. И искать причины можно долго.
                  — Есть вот такой док. code.google.com/p/acra/wiki/ACRAProGuardHowTo Для нашего прилоежния он не помог. Пришлось оставлять еще часть классов, ввиду нашей архитектуры.
                  Проблема кроется в использовании вами или сторонними библиотеками Reflection. Например, аналогичная проблема есть во floggy с ProGuard (для J2ME).
                    0
                    по моему, говорим об одном и том же.
                    знаю архитектуру приложения, которое пишешь — нет никаких проблем при составлении правильного seeds. безусловно, это займет некоторое время, но отладка приложения, которые падает после обфускации, всегда выдает конкретное место, конкретный класс и конкретную проблему из-за которой выполнение программы прерывается. это вполне закономерно и предсказуемо, я бы даже не рискнул называть это проблемой, ибо это цена обфускации.
                      +2
                      Руками можно все :)
                      Мы нормально-ленивые. Если при падении мне выдадут строку кода я буду более счастлив, чем некий ID и коммент.
                      Это вопрос скорее не к стилю и принципов обфускации, а к стоимости ПО/наработок vs стоимость/желание рефакторить приложение.
                      падает действительно в конкретном месте… если не учесть try-catch NullReference возникет явно не том месте, где кроется причина падения. А поиск исходного места зависит от фантазии разработчика, писавшего оный код. :)
                        0
                        это я как раз понимаю, все ленивые, а многие еще и корявые. но это никак не соотносится с предупреждением о:
                        Важно помнить, что при использовании функционала PtoGuard возникает ряд важных ограничений. Например, при использовании ACRA(crash-репорты), заметно ограничивается уровень обфускации. Надо много чего сохранять. Эта же проблема и с обычной java, естественно, есть.


                        просто я немного растерян. корявый перевод половины страницы из официальной документации по андройду, несколько невнятных комментариев, а люди всё радуются, а потом удивляются, что в жизни всё немного не так, как тут «понаписали».
                          0
                          Согласись, иногда плюс поста не в решении проблемы, а хотябы в ее упоминании, imho.

                          Уверен — трафик на страничку ProGuard пополнился российским, а уж сильные андроид-девелоперы сделают расширенный пост, если лень поборют и не найдут что-нибудь поинтересней :)
                            –1
                            возможно. только что же это за девелоперы такие, которые даже не прочитали release notes к sdk tools.
                              0
                              Полагаю, суть в том, что теперь девелоперы осведомлены об интересе к этому вопросу (и в некотором смысле мотивированы написать соответствующий пост), а не в том, что они до этого сами не знали о ProGuard.
                0
                Более подробная информация по вопросам настройки proguard, без привязки к версии SDK и готовый пример
                www.androidengineer.com/2010/07/optimizing-obfuscating-and-shrinking.html (английский)

                Ничего сложного в подключении нет. Главное, как было сказано выше, не забыть указать -keep public class для нужных activity, view и прочего.

                  –2
                  Зачем вообще защищать приложения от реверс-инжиниринга? Все приложения должны идти по open source лицензии, а авторы должны жить на donations и концертах, встречах с фанатами…
                  Почему считается что работа разработчика андроид важнее, чем того же автора книги или музыканта, не способного на «обфускацию кода»…
                    +2
                    потому что приложения воруют, а donation'ы делают всё же нечастно
                    или это вы тролите так?
                      –2
                      Я просто удивляюсь сколько среди читателей лицемеров, которые минусуют в случае, если я выступаю протип новостей о новом начинании piratbay распространять музыку, и в то же время рассуждают, как защитить приложение андроид. Печально просто это. Надеюсь, кто-то задумается.
                        0
                        я думаю что те, кто минусуют вас за музыку и те кто рассуждают, как защитить приложение под андроид, разные люди.

                        а вообще были и наверно есть до сих пор сообщения, когда бесплатные приложения с рекламой воровали — просто меняли в них id для рекламной площадки и выкладывали снова в маркет. В результате деньги за рекламу шли не автору приложения.
                          +2
                          скажите, а вот вы сами и ваши знакомые много делаете donation'ов?
                            0
                            Если это был вопрос мне то да, я сделал donations на сумму более 1000$ на open source продукты, которые использую. Про минусующих лицемеров — печально.
                            0
                            А вы перестаньте передёргивать, глядишь и не будут люди казаться лицемерными там, где этого нет и в помине. Скажите ещё, что _прослушивание_ музыки без отчислений равносильно убийству… Копирасты — такие копирасты :(
                            ЗЫ. Да, на случай, если вы совершенно искренне проводите эту параллель, поясняю — рассматриваемая защита — это не защита от копирования, это защита от плагиата. Где вы видели в начинании пиратбея призывы, пособничество, помощь плагиату той же музыки???
                            ЗЗЫ. Впрочем, таки не думаю, что вы настолько… хм… недалёки, что не понимаете этого. Скорее всего сознательно передёргиваете. Вопрос — зачем вам так нагло и злонамеренно врать?
                      • UFO just landed and posted this here
                          0
                          Как это забыли? В статье же сказано о выносе нужных классов в исключения. По умолчанию в кофиге уже исключены наследники Activity, Service, BroadcastReceiver и прочие.
                          0
                          Найти бы способ, как заюзать ProGuard при экспорте в IntelliJIDEA, а то кодить в Идее, а релизить в Эклипсе не комильфо :)
                            +1
                            Дык, дать команду ant release не так уж и сложно :)

                          Only users with full accounts can post comments. Log in, please.