Скрытие строк в Obfuscated code - программирование
Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

Для этого вам нужно будет делать кодировку или шифрование самой строки, используемый вами подход зависит от того, на что вы пытаетесь защитить, если вы просто пытаетесь скрыть от очевидной проверки, чем может быть достаточно кодирования (см. android.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 обеспечивает достойный пример использования. Опять же, это более раздражает, чем безопасно для хакеров, поскольку вам нужно будет хранить ключ где-то в своей банке, тем самым отрицая криптографическую безопасность.

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

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

До:

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

    ...
}

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

Ответ 2

Привет всем.

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

  • Найдите 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) {

}

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

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