Скрытие строк в Obfuscated code

Я просто обфускал свой Android-код, используя proguard, а затем декомпилировал его. Есть несколько строк, которые мне бы очень хотелось скрыться от любопытных глаз. Когда я декомпилировал свой код, строки были там, чтобы все могли видеть … и меняться. Одна из строк – это URL-адрес моего сервера лицензирования, и они могут фактически изменить URL-адрес на поддельный сервер (поскольку я буду публиковать код сервера для публики). Каков наилучший способ скрыть такую ​​информацию?

Кроме того, я заметил, что строки classа R – это все случайные числа, но я не могу найти class R в декомпилированном коде. Где это находится?

Пример Foe я вижу: new SimpleCursorAdapter(localActivity, 2130903058, localCursor, arrayOfString, arrayOfInt);

2130903058 – файл макета, но на что он ссылается? Число ничего не значит, если оно не указывает на какой-то адрес.

Предполагая, что вы довольны неясным, а не безопасным, существует ряд механизмов, которые вы могли бы использовать, но обфускаторы, такие как proguard, не смогут вам помочь.

Для этого вам нужно будет делать кодирование или шифрование самой строки, используемый вами подход зависит от того, от чего вы пытаетесь защитить, если это вы просто пытаетесь скрыть от очевидной проверки, чем может быть достаточно кодирования (см. Андроид .util.Base64, http://developer.android.com/reference/android/util/Base64.html ). Обратите внимание, что кодировка находится в состоянии NO WAY SECURE, и все, что она будет, это удалить очевидную ссылку на ваш сайт.

Если вы пытаетесь защитить от чего-то большего, то вы можете перейти к фактическому шифрованию строки, для этого вы бы использовали симметричный шифр, такой как AES, через javax.crypto.Cipher, http://www.androidsnippets.org/snippets/ 39 / index.html обеспечивает достойный пример использования. Опять же, это более раздражает, а затем безопасно будет хакерами, так как вам нужно будет хранить ключ где-то в своей банке, тем самым отрицая криптографическую безопасность.

Чтобы сделать это более ясным, основными шагами были бы:

  1. Вручную создайте зашифрованную строку, используя известный ключ.
  2. Преобразуйте свой код, чтобы использовать расшифрованную версию этой строки, например:

До:

 public class Foo { private String mySecret = "http://example.com"; ... } 

становится:

 public class Foo { private String encrypted = ""; private String key = " 

A (хорошая) альтернатива всем этим рассматривает возможность использования стороннего решения drm, такого как сервер лицензирования google, предоставляет http://android-developers.blogspot.com/2010/07/licensing-service-for-android.html . Это может быть более безопасным, чем то, что вы катитесь самостоятельно, но подвержено очень похожим ограничениям тому, что я описал выше.

Всем привет.

  1. Пусть secret – текст, который вы хотите скрыть

  2. Найдите keyhash вашего debug / release.keystore. Пусть k1 – это ключ.

(используйте инструменты keytool + openssl: keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 )

  1. Используйте инструмент (внешний по отношению к коду android), чтобы шифровать secret с помощью k1

    encrypted = encode (secret, k1)

(Например: https://jwt.io , для java: https://github.com/jwtk/jjwt ).

  1. В вашем Java-коде Android записывайте encrypted . Когда вам понадобится декодированная версия encrypted (это оригинальный secret ), напишите

original = decode(encrypted, get_my_keyhash_programmatically() )

Это все. Это работает, потому что исходный secret не отображается в исходном коде Java, ни k1 для его декодирования. И, если хакер хочет напечатать ваш расшифрованный секрет, он должен изменить код и перекомпилировать его, подписав его .apk со своим собственным хранилищем ключей, а не вашим, и, таким образом, не получив правильного оригинального secret . («Единственная» точка заключается в том, можно ли k1 из вашего исходного .apk).

Примечание: get_my_keyhash_programmatically ():

 try { PackageInfo info = getPackageManager().getPackageInfo( "el nombre de su paquete por ejemplo com.tarea.u8", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } } catch (PackageManager.NameNotFoundException e) { } catch (NoSuchAlgorithmException e) { } 

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

с моим кодом легко увидеть, что такое настоящие ключи доступа – но как только обфускатор будет работать, все статики будут иметь имя типа A, B, C и т. д., и это будет нелегко обнаружить.

Я использовал ROT47. Он не очень безопасен, но прост в использовании и реализуется, потому что это симметрический кодировщик / декодер

Вы должны google для «Просто другого хакера Perl». Это программы, которые распечатывают строку с обфускационным кодом. Есть также множество примеров на других языках, а затем Perl в сети.

Википедия

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