Pull to refresh

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

Reading time 2 min
Views 44K
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 есть пробелы — удалите их, и все заработает.

Приятной вам обфускации!
Tags:
Hubs:
+45
Comments 26
Comments Comments 26

Articles