Скрытие строк в запутанном коде - PullRequest
56 голосов
/ 13 декабря 2010

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

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

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

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

Ответы [ 6 ]

32 голосов
/ 13 декабря 2010

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

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

Если вы пытаетесь защитить от чего-то большего, вы можете перейти к фактическому шифрованию строки., чтобы сделать это, вы должны использовать симметричный шифр, такой как 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 = "<manually created encrypted string>";
    private String key = "<key used for encryption";
    private String mySecret = MyDecryptUtil.decrypt(encrypted, key);

    ...
}

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

21 голосов
/ 23 февраля 2016

Привет всем.

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

  2. Найдите ключевой хеш вашего 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-коде запишите encrypted. Когда вам нужна расшифрованная версия encrypted (это оригинал secret), пишите

original = decode(encrypted, get_my_keyhash_programmatically() )

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

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

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) {

}
8 голосов
/ 08 марта 2011

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

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

2 голосов
/ 02 июля 2013

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

1 голос
/ 13 декабря 2010

Вам следует поискать Google "просто еще один Perl-хакер". Это программы, которые распечатывают строку с запутанным кодом. Есть также много примеров на других языках, кроме Perl в сети.

Запись в Википедии

0 голосов
/ 20 февраля 2016

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

...